Index: build/util/lastchange.py |
diff --git a/build/util/lastchange.py b/build/util/lastchange.py |
index 1846babac8d76c87976b562726a337c98da399f9..a91a52015491f28fcab442ca66b9e59a0afc944c 100755 |
--- a/build/util/lastchange.py |
+++ b/build/util/lastchange.py |
@@ -9,46 +9,71 @@ lastchange.py -- Chromium revision fetching utility. |
import optparse |
import os |
-import re |
import subprocess |
import sys |
+class VersionInfo(object): |
+ def __init__(self, url, root, revision): |
+ self.url = url |
+ self.root = root |
+ self.revision = revision |
-def FetchSVNRevision(command): |
+ |
+def FetchSVNRevision(command, directory): |
""" |
- Fetch the Subversion revision for the local tree. |
+ Fetch the Subversion branch and revision for the a given directory |
+ by running the given command (e.g. "svn info"). |
Errors are swallowed. |
+ |
+ Returns: |
+ a VersionInfo object or None on error. |
""" |
try: |
proc = subprocess.Popen(command, |
stdout=subprocess.PIPE, |
stderr=subprocess.PIPE, |
+ cwd=directory, |
shell=(sys.platform=='win32')) |
except OSError: |
# command is apparently either not installed or not executable. |
return None |
- if proc: |
- svn_re = re.compile('^Revision:\s+(\d+)', re.M) |
- match = svn_re.search(proc.stdout.read()) |
- if match: |
- return match.group(1) |
- return None |
+ if not proc: |
+ return None |
+ |
+ attrs = {} |
+ for line in proc.stdout: |
+ line = line.strip() |
+ if not line: |
+ continue |
+ key, val = line.split(': ', 1) |
+ attrs[key] = val |
+ |
+ try: |
+ url = attrs['URL'] |
+ root = attrs['Repository Root'] |
+ revision = attrs['Revision'] |
+ except KeyError: |
+ return None |
+ |
+ return VersionInfo(url, root, revision) |
-def FetchChange(default_lastchange): |
+def FetchVersionInfo(default_lastchange, directory=None): |
""" |
- Returns the last change, from some appropriate revision control system. |
+ Returns the last change (in the form of a branch, revision tuple), |
+ from some appropriate revision control system. |
""" |
- change = FetchSVNRevision(['svn', 'info']) |
- if not change and sys.platform in ('linux2',): |
- change = FetchSVNRevision(['git', 'svn', 'info']) |
- if not change: |
+ version_info = FetchSVNRevision(['svn', 'info'], directory) |
+ if not version_info and sys.platform in ('linux2',): |
+ version_info = FetchSVNRevision(['git', 'svn', 'info'], directory) |
+ if not version_info: |
if default_lastchange and os.path.exists(default_lastchange): |
- change = open(default_lastchange, 'r').read().strip() |
+ revision = open(default_lastchange, 'r').read().strip() |
+ version_info = VersionInfo(None, None, revision) |
else: |
- change = '0' |
- return change |
+ version_info = VersionInfo('', '', '0') |
+ return version_info |
def WriteIfChanged(file_name, contents): |
@@ -90,12 +115,12 @@ def main(argv=None): |
parser.print_help() |
sys.exit(2) |
- change = FetchChange(opts.default_lastchange) |
+ version_info = FetchVersionInfo(opts.default_lastchange) |
if opts.revision_only: |
- print change |
+ print version_info.revision |
else: |
- contents = "LASTCHANGE=%s\n" % change |
+ contents = "LASTCHANGE=%s\n" % version_info.revision |
if out_file: |
WriteIfChanged(out_file, contents) |
else: |