#!/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
import time;
import filecmp
from subprocess import PIPE, call
from commands import getstatusoutput
from time import localtime, strftime

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:
  can_obtain_git_hash = \
      call(['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()
