#!/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()
