| Index: build/util/lastchange.py
|
| ===================================================================
|
| --- build/util/lastchange.py (revision 0)
|
| +++ build/util/lastchange.py (revision 0)
|
| @@ -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())
|
|
|
| Property changes on: build/util/lastchange.py
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|