#!/usr/bin/env python3
#
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

''' Interpolates build environment information into a file.
'''

from argparse import ArgumentParser
from datetime import datetime
from os import path
import subprocess
import sys
import json


def GetDartSdkGitRevision(buildroot):
  project_root = path.join(buildroot, 'third_party', 'dart')
  return subprocess.check_output(['git', '-C', project_root, 'rev-parse', 'HEAD']).strip()


def GetDartSdkSemanticVersion(buildroot):
  project_root = path.join(buildroot, 'third_party', 'dart')
  return subprocess.check_output(['git', '-C', project_root, 'describe', '--abbrev=0']).strip()


def GetFlutterEngineGitRevision(buildroot):
  project_root = path.join(buildroot, 'flutter')
  return subprocess.check_output(['git', '-C', project_root, 'rev-parse', 'HEAD']).strip()


def GetFuchsiaSdkVersion(buildroot):
  with open(path.join(buildroot, 'fuchsia', 'sdk',
                      'linux' if sys.platform.startswith('linux') else 'mac', 'meta',
                      'manifest.json'), 'r') as fuchsia_sdk_manifest:
    return json.load(fuchsia_sdk_manifest)['id']


def main():
  # Parse arguments.
  parser = ArgumentParser()
  parser.add_argument('--input', action='store', help='input file path', required=True)
  parser.add_argument('--output', action='store', help='output file path', required=True)
  parser.add_argument(
      '--buildroot', action='store', help='path to the flutter engine buildroot', required=True
  )
  args = parser.parse_args()

  # Read, interpolate, write.
  with open(args.input, 'r') as i, open(args.output, 'w') as o:
    o.write(
        i.read().replace(
            '{{DART_SDK_GIT_REVISION}}',
            GetDartSdkGitRevision(args.buildroot).decode('utf-8')
        ).replace(
            '{{DART_SDK_SEMANTIC_VERSION}}',
            GetDartSdkSemanticVersion(args.buildroot).decode('utf-8')
        ).replace(
            '{{FLUTTER_ENGINE_GIT_REVISION}}',
            GetFlutterEngineGitRevision(args.buildroot).decode('utf-8')
        ).replace('{{FUCHSIA_SDK_VERSION}}', GetFuchsiaSdkVersion(args.buildroot))
    )


if __name__ == '__main__':
  main()
