diff options
author | sgk@google.com <sgk@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-04 16:08:16 +0000 |
---|---|---|
committer | sgk@google.com <sgk@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-04 16:08:16 +0000 |
commit | 198d68d6d03f911613416739963482f6fde00255 (patch) | |
tree | 33895386517610bc231ae5e7385138e086709d06 /build/util | |
parent | ec520c71074e4cddc9da53076daa52d67cb80d33 (diff) | |
download | chromium_src-198d68d6d03f911613416739963482f6fde00255.zip chromium_src-198d68d6d03f911613416739963482f6fde00255.tar.gz chromium_src-198d68d6d03f911613416739963482f6fde00255.tar.bz2 |
Fetch last change (revision) info in a separate action that can run
every build, instead of having it occur as a side effect of updating
some other target for which we want to use normal up-to-date checks.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/118192
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17634 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'build/util')
-rw-r--r-- | build/util/build_util.gyp | 34 | ||||
-rw-r--r-- | build/util/lastchange.py | 121 |
2 files changed, 155 insertions, 0 deletions
diff --git a/build/util/build_util.gyp b/build/util/build_util.gyp new file mode 100644 index 0000000..0624ab5 --- /dev/null +++ b/build/util/build_util.gyp @@ -0,0 +1,34 @@ +# Copyright (c) 2009 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'includes': [ + '../common.gypi', + ], + 'targets': [ + { + 'target_name': 'lastchange', + 'type': 'none', + 'variables': { + 'lastchange_out_path': '<(SHARED_INTERMEDIATE_DIR)/build/LASTCHANGE', + }, + 'actions': [ + { + 'action_name': 'lastchange', + 'inputs': [ + 'lastchange.py', + ], + 'outputs': [ + '<(lastchange_out_path)', + '<(lastchange_out_path).always', + ], + 'action': [ + 'python', '<@(_inputs)', '-o', '<(lastchange_out_path)', + ], + 'message': 'Extracting last change to <(lastchange_out_path)' + }, + ], + }, + ] +} diff --git a/build/util/lastchange.py b/build/util/lastchange.py new file mode 100644 index 0000000..3bac762 --- /dev/null +++ b/build/util/lastchange.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python +# Copyright (c) 2009 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +""" +lastchange.py -- Chromium revision fetching utility. +""" + +import optparse +import os +import re +import subprocess +import sys + + +def svn_fetch_revision(): + """ + Fetch the Subversion revision for the local tree. + + Errors are swallowed. + """ + try: + p = subprocess.Popen(['svn', 'info'], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + except OSError: + # 'svn' is apparently either not installed or not executable. + return None + revision = None + if p: + svn_re = re.compile('^Revision:\s+(\S+)$', re.M) + m = svn_re.search(p.stdout.read()) + if m: + revision = m.group(1) + return revision + + +def git_fetch_id(): + """ + Fetch the GIT identifier for the local tree. + + Errors are swallowed. + """ + try: + p = subprocess.Popen(['git', 'log', '-1'], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + except OSError: + # 'git' is apparently either not installed or not executable. + return None + id = None + if p: + git_re = re.compile('^\s*git-svn-id:\s+(\S+)@(\d+)', re.M) + m = git_re.search(p.stdout.read()) + if m: + id = m.group(1) + return id + + +def fetch_change(): + """ + Returns the last change, from some appropriate revision control system. + """ + change = svn_fetch_revision() + if not change and sys.platform in ('linux2',): + change = git_fetch_id() + if not change: + change = '0' + return change + + +def write_if_changed(file_name, contents): + """ + Writes the specified contents to the specified file_name + iff the contents are different than the current contents. + """ + try: + old_contents = open(file_name, 'r').read() + except EnvironmentError: + pass + else: + if contents == old_contents: + return + os.unlink(file_name) + open(file_name, 'w').write(contents) + + +def main(argv=None): + if argv is None: + argv = sys.argv + + parser = optparse.OptionParser(usage="lastchange.py [-h] [[-o] FILE]") + parser.add_option("-o", "--output", metavar="FILE", + help="write last change to FILE") + opts, args = parser.parse_args(argv[1:]) + + out_file = opts.output + + while len(args) and out_file is None: + if out_file is None: + out_file = args.pop(0) + if args: + sys.stderr.write('Unexpected arguments: %r\n\n' % args) + parser.print_help() + sys.exit(2) + + change = fetch_change() + + contents = "LASTCHANGE=%s\n" % change + + if out_file: + write_if_changed(out_file, contents) + else: + sys.stdout.write(contents) + + return 0 + + +if __name__ == '__main__': + sys.exit(main()) |