#!/usr/bin/env impala-python
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

# This script generates be/src/common/version.h which contains the build version based
# on the git hash.

import os
from subprocess import call

IMPALA_HOME = os.environ['IMPALA_HOME']
SAVE_VERSION_SCRIPT = os.path.join(IMPALA_HOME, 'bin/save-version.sh')
VERSION_FILE_NAME = os.path.join(IMPALA_HOME, 'bin/version.info')
VERSION_CC_FILE_NAME = os.path.join(IMPALA_HOME, 'be/src/common/version.cc')

# Redirecting stdout and stderr to os.devnull as we don't want unnecessary output.
devnull = open(os.devnull, 'w')
try:
  # Force git to look at a git directory relative to IMPALA_HOME,
  # so as to avoid accidentally getting another repo's git hashes.
  can_obtain_git_hash = \
      call(['git', '--git-dir', os.path.join(IMPALA_HOME, ".git"), 'rev-parse', 'HEAD'],
          stdout=devnull, stderr=devnull) == 0
finally:
  devnull.close()

version_file_exists = os.path.isfile(VERSION_FILE_NAME)

# If we have a version file and cannot obtain a git hash, skip generating a new
# version file.
if version_file_exists and not can_obtain_git_hash:
  print "Cannot obtain git hash, using existing version file."
else:
  # Remove existing version files only if they exist.
  # TODO: Might be useful to make a common utility function remove_if_clean.
  if version_file_exists:
    print 'Removing existing file: %s' % (VERSION_FILE_NAME)
    os.remove(VERSION_FILE_NAME)
  if os.path.isfile(VERSION_CC_FILE_NAME):
    print 'Removing existing file: %s' % (VERSION_CC_FILE_NAME)
    os.remove(VERSION_CC_FILE_NAME)

  # SAVE_VERSION_SCRIPT will generate a dummy version.info file if we cannot obtain the
  # git hash.
  # Generate a new version file.
  os.system(SAVE_VERSION_SCRIPT)

# version.info file has the format:
# VERSION: <version>
# GIT_HASH: <git has>
# BUILD_TIME: <build time>
version, git_hash, build_time = [None, None, None]
version_file = open(VERSION_FILE_NAME)
try:
  version, git_hash, build_time = [line.split(':',1)[-1].strip() \
      for line in version_file.readlines() if not line.startswith('#') ]
finally:
  version_file.close()

print '\n'.join([version, git_hash, build_time])

file_contents = """
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

// This is a generated file, DO NOT EDIT IT.
// To change this file, see impala/bin/gen_build_version.py

#include "common/version.h"

#define IMPALA_BUILD_VERSION "%(build_version)s"
#define IMPALA_BUILD_HASH "%(build_hash)s"
#define IMPALA_BUILD_TIME "%(build_time)s"

const char* GetDaemonBuildVersion() {
  return IMPALA_BUILD_VERSION;
}

const char* GetDaemonBuildHash() {
  return IMPALA_BUILD_HASH;
}

const char* GetDaemonBuildTime() {
  return IMPALA_BUILD_TIME;
}
""" % {'build_version': version,
       'build_hash': git_hash,
       'build_time': build_time}
file_contents = file_contents.strip()

# Generate a new version file.
version_file = open(VERSION_CC_FILE_NAME, "w")
version_file.write(file_contents)
version_file.close()
