summaryrefslogtreecommitdiffstats
path: root/build/util
diff options
context:
space:
mode:
authorsgk@google.com <sgk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-04 16:08:16 +0000
committersgk@google.com <sgk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-04 16:08:16 +0000
commit198d68d6d03f911613416739963482f6fde00255 (patch)
tree33895386517610bc231ae5e7385138e086709d06 /build/util
parentec520c71074e4cddc9da53076daa52d67cb80d33 (diff)
downloadchromium_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.gyp34
-rw-r--r--build/util/lastchange.py121
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())