| #!/usr/bin/env python3 | 
 | # Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file | 
 | # for details. All rights reserved. Use of this source code is governed by a | 
 | # BSD-style license that can be found in the LICENSE file. | 
 | # | 
 | # This python script creates a version string in a C++ file. | 
 |  | 
 | from __future__ import print_function | 
 |  | 
 | import argparse | 
 | import hashlib | 
 | import os | 
 | import sys | 
 | import utils | 
 |  | 
 | # When these files change, snapshots created by the VM are potentially no longer | 
 | # backwards-compatible. | 
 | VM_SNAPSHOT_FILES = [ | 
 |     # Header files. | 
 |     'app_snapshot.h', | 
 |     'datastream.h', | 
 |     'image_snapshot.h', | 
 |     'object.h', | 
 |     'raw_object.h', | 
 |     'snapshot.h', | 
 |     'symbols.h', | 
 |     # Source files. | 
 |     'app_snapshot.cc', | 
 |     'dart.cc', | 
 |     'dart_api_impl.cc', | 
 |     'image_snapshot.cc', | 
 |     'object.cc', | 
 |     'raw_object.cc', | 
 |     'snapshot.cc', | 
 |     'symbols.cc', | 
 | ] | 
 |  | 
 |  | 
 | def MakeSnapshotHashString(): | 
 |     vmhash = hashlib.md5() | 
 |     for vmfilename in VM_SNAPSHOT_FILES: | 
 |         vmfilepath = os.path.join(utils.DART_DIR, 'runtime', 'vm', vmfilename) | 
 |         with open(vmfilepath, 'rb') as vmfile: | 
 |             vmhash.update(vmfile.read()) | 
 |     return vmhash.hexdigest() | 
 |  | 
 |  | 
 | def GetSemanticVersionFormat(no_git_hash): | 
 |     version_format = '{{SEMANTIC_SDK_VERSION}}' | 
 |     return version_format | 
 |  | 
 |  | 
 | def FormatVersionString(version, | 
 |                         no_git_hash, | 
 |                         no_sdk_hash, | 
 |                         version_file=None, | 
 |                         git_revision_file=None, | 
 |                         git_timestamp_file=None): | 
 |     semantic_sdk_version = utils.GetVersion(no_git_hash, version_file, | 
 |                                             git_revision_file) | 
 |     semantic_version_format = GetSemanticVersionFormat(no_git_hash) | 
 |     version_str = (semantic_sdk_version | 
 |                    if version_file else semantic_version_format) | 
 |  | 
 |     version = version.replace('{{VERSION_STR}}', version_str) | 
 |  | 
 |     version = version.replace('{{SEMANTIC_SDK_VERSION}}', semantic_sdk_version) | 
 |  | 
 |     git_hash = None | 
 |     # If we need SDK hash and git usage is not suppressed then try to get it. | 
 |     if not no_sdk_hash and not no_git_hash: | 
 |         git_hash = utils.GetShortGitHash() | 
 |     if git_hash is None or len(git_hash) != 10: | 
 |         git_hash = '0000000000' | 
 |     version = version.replace('{{GIT_HASH}}', git_hash) | 
 |  | 
 |     channel = utils.GetChannel() | 
 |     version = version.replace('{{CHANNEL}}', channel) | 
 |  | 
 |     version_time = None | 
 |     if not no_git_hash: | 
 |         version_time = utils.GetGitTimestamp(git_timestamp_file) | 
 |     if version_time == None: | 
 |         version_time = 'Unknown timestamp' | 
 |     version = version.replace('{{COMMIT_TIME}}', version_time) | 
 |  | 
 |     snapshot_hash = MakeSnapshotHashString() | 
 |     version = version.replace('{{SNAPSHOT_HASH}}', snapshot_hash) | 
 |  | 
 |     return version | 
 |  | 
 |  | 
 | def main(): | 
 |     try: | 
 |         # Parse input. | 
 |         parser = argparse.ArgumentParser() | 
 |         parser.add_argument('--input', help='Input template file.') | 
 |         parser.add_argument( | 
 |             '--no-git-hash', | 
 |             action='store_true', | 
 |             default=False, | 
 |             help=('Don\'t try to call git to derive things like ' | 
 |                   'git revision hash.')) | 
 |         parser.add_argument( | 
 |             '--no-sdk-hash', | 
 |             action='store_true', | 
 |             default=False, | 
 |             help='Use null SDK hash to disable SDK verification in the VM') | 
 |         parser.add_argument('--output', help='output file name') | 
 |         parser.add_argument('-q', | 
 |                             '--quiet', | 
 |                             action='store_true', | 
 |                             default=False, | 
 |                             help='DEPRECATED: Does nothing!') | 
 |         parser.add_argument('--version-file', help='Path to the VERSION file.') | 
 |         parser.add_argument('--git-revision-file', | 
 |                             help='Path to the GIT_REVISION file.') | 
 |         parser.add_argument('--git-timestamp-file', | 
 |                             help='Path to the GIT_TIMESTAMP file.') | 
 |         parser.add_argument( | 
 |             '--format', | 
 |             default='{{VERSION_STR}}', | 
 |             help='Version format used if no input template is given.') | 
 |  | 
 |         args = parser.parse_args() | 
 |  | 
 |         # If there is no input template, then write the bare version string to | 
 |         # args.output. If there is no args.output, then write the version | 
 |         # string to stdout. | 
 |  | 
 |         version_template = '' | 
 |         if args.input: | 
 |             version_template = open(args.input).read() | 
 |         elif not args.format is None: | 
 |             version_template = args.format | 
 |         else: | 
 |             raise 'No version template given! Set either --input or --format.' | 
 |  | 
 |         version = FormatVersionString(version_template, args.no_git_hash, | 
 |                                       args.no_sdk_hash, args.version_file, | 
 |                                       args.git_revision_file, | 
 |                                       args.git_timestamp_file) | 
 |  | 
 |         if args.output: | 
 |             with open(args.output, 'w') as fh: | 
 |                 fh.write(version) | 
 |         else: | 
 |             sys.stdout.write(version) | 
 |  | 
 |         return 0 | 
 |  | 
 |     except Exception as inst: | 
 |         sys.stderr.write('make_version.py exception\n') | 
 |         sys.stderr.write(str(inst)) | 
 |         sys.stderr.write('\n') | 
 |  | 
 |         return -1 | 
 |  | 
 |  | 
 | if __name__ == '__main__': | 
 |     sys.exit(main()) |