--- a/scripts/release/release.py Fri Mar 13 02:56:35 2009 +0000
+++ b/scripts/release/release.py Fri Mar 13 03:11:42 2009 +0000
@@ -66,10 +66,6 @@
pass
-class SubprocessFailed(Error):
- """A subprocess returned a non-zero error code."""
-
-
class AbortedByUser(Error):
"""The operation was aborted by the user."""
@@ -86,51 +82,6 @@
"""An error occured while accessing a file."""
-def run(argv, cwd=None, capture=False, split_capture=True, stdin=''):
- """Run the given command and optionally return its output.
-
- Note that if you set capture=True, the command's output is
- buffered in memory. Output capture should only be used with
- commands that output small amounts of data. O(kB) is fine, O(MB)
- is starting to push it a little.
-
- Args:
- argv: A list containing the name of the program to run, followed
- by its argument vector.
- cwd: Run the program from this directory.
- capture: If True, capture the program's stdout stream. If False,
- stdout will output to sys.stdout.
- split_capture: If True, return the captured output as a list of
- lines. Else, return as a single unaltered string.
- stdin: The string to feed to the program's stdin stream.
-
- Returns:
- If capture is True, a string containing the combined
- stdout/stderr output of the program. If capture is False,
- nothing is returned.
-
- Raises:
- SubprocessFailed: The subprocess exited with a non-zero exit
- code.
- """
- print util.colorize('# ' + ' '.join(argv), util.WHITE, bold=True)
-
- process = subprocess.Popen(argv,
- shell=False,
- cwd=cwd,
- stdin=subprocess.PIPE,
- stdout=(subprocess.PIPE if capture else None),
- stderr=None)
- output, _ = process.communicate(input=stdin)
- if process.returncode != 0:
- raise SubprocessFailed('Process %s failed with output: %s' %
- (argv[0], output))
- if output is not None and split_capture:
- return output.strip().split('\n')
- else:
- return output
-
-
def error(msg):
"""Log an error message."""
print util.colorize(msg, util.RED, bold=True)
@@ -307,7 +258,7 @@
depth: The depth of the working copy root.
"""
assert not self.exists()
- run(['svn', 'checkout', '--depth=' + depth, url, self.path()])
+ util.run(['svn', 'checkout', '--depth=' + depth, url, self.path()])
def update(self, path='', depth=None):
"""Update a working copy path, optionally changing depth.
@@ -318,9 +269,9 @@
"""
assert self.exists()
if depth is None:
- run(['svn', 'update', self.path(path)])
+ util.run(['svn', 'update', self.path(path)])
else:
- run(['svn', 'update', '--set-depth=' + depth, self.path(path)])
+ util.run(['svn', 'update', '--set-depth=' + depth, self.path(path)])
def revert(self, path=''):
"""Recursively revert a working copy path.
@@ -329,7 +280,7 @@
command, as it will also delete any files which subversion
does not know about.
"""
- run(['svn', 'revert', '-R', self.path(path)])
+ util.run(['svn', 'revert', '-R', self.path(path)])
unknown, missing = self._unknownAndMissing(path)
unknown = [os.path.join(self.path(path), p) for p in unknown]
@@ -340,7 +291,7 @@
for p in unknown:
assert p.startswith(self.path())
- run(['rm', '-rf', '--'] + unknown)
+ util.run(['rm', '-rf', '--'] + unknown)
def ls(self, dir=''):
"""List the contents of a working copy directory.
@@ -350,7 +301,7 @@
local path.
"""
assert self.exists()
- return run(['svn', 'ls', self.path(dir)], capture=True)
+ return util.run(['svn', 'ls', self.path(dir)], capture=True)
def copy(self, src, dest):
"""Copy a working copy path.
@@ -362,7 +313,7 @@
dst: The destination working copy path.
"""
assert self.exists()
- run(['svn', 'cp', self.path(src), self.path(dest)])
+ util.run(['svn', 'cp', self.path(src), self.path(dest)])
def propget(self, prop_name, path):
"""Get the value of a property on a working copy path.
@@ -372,7 +323,8 @@
path: The working copy path on which the property is set.
"""
assert self.exists()
- return run(['svn', 'propget', prop_name, self.path(path)], capture=True)
+ return util.run(['svn', 'propget', prop_name, self.path(path)],
+ capture=True)
def propset(self, prop_name, prop_value, path):
"""Set the value of a property on a working copy path.
@@ -385,7 +337,7 @@
path: The working copy path on which to set the property.
"""
assert self.exists()
- run(['svn', 'propset', prop_name, prop_value, self.path(path)])
+ util.run(['svn', 'propset', prop_name, prop_value, self.path(path)])
def add(self, paths):
"""Schedule working copy paths for addition.
@@ -397,7 +349,7 @@
"""
assert self.exists()
paths = [self.path(p) for p in paths]
- run(['svn', 'add'] + paths)
+ util.run(['svn', 'add'] + paths)
def remove(self, paths):
"""Schedule working copy paths for deletion.
@@ -409,7 +361,7 @@
"""
assert self.exists()
paths = [self.path(p) for p in paths]
- run(['svn', 'rm'] + paths)
+ util.run(['svn', 'rm'] + paths)
def status(self, path=''):
"""Return the status of a working copy path.
@@ -421,7 +373,7 @@
path: The path to examine.
"""
assert self.exists()
- return run(['svn', 'status', self.path(path)], capture=True)
+ return util.run(['svn', 'status', self.path(path)], capture=True)
def addRemove(self, path=''):
"""Perform an "addremove" operation a working copy path.
@@ -451,7 +403,7 @@
path: The path to commit.
"""
assert self.exists()
- run(['svn', 'commit', '-m', message, self.path(path)])
+ util.run(['svn', 'commit', '-m', message, self.path(path)])
@staticmethod
def export(url, revision, dest_path):
@@ -472,7 +424,7 @@
if os.path.exists(dest_path):
raise ObstructionError('Cannot export to obstructed path %s' %
dest_path)
- run(['svn', 'export', '-r', str(revision), url, dest_path])
+ util.run(['svn', 'export', '-r', str(revision), url, dest_path])
@staticmethod
def find_tag_rev(url):
@@ -495,9 +447,9 @@
url: The repository URL of the tag to examine.
"""
try:
- output = run(['svn', 'log', '-q', '--stop-on-copy', url],
- capture=True)
- except SubprocessFailed:
+ output = util.run(['svn', 'log', '-q', '--stop-on-copy', url],
+ capture=True)
+ except util.SubprocessFailed:
raise ExpectationFailed('No tag at URL ' + url)
first_rev_line = output[-2]
first_rev = int(first_rev_line.split()[0][1:])
@@ -517,9 +469,9 @@
using 'patch'.
"""
try:
- return run(['svn', 'diff', '-c', str(revision), url],
- capture=True, split_capture=False)
- except SubprocessFailed:
+ return util.run(['svn', 'diff', '-c', str(revision), url],
+ capture=True, split_capture=False)
+ except util.SubprocessFailed:
raise ExpectationFailed('Could not get diff for r%d '
'from remote repository' % revision)
@@ -791,7 +743,8 @@
raise ExpectationFailed(
'Retrieved diff is empty. '
'Did you accidentally cherry-pick a branch change?')
- run(['patch', '-p0'], cwd=self.wc.path(self.branch_dir), stdin=diff)
+ util.run(['patch', '-p0'], cwd=self.wc.path(self.branch_dir),
+ stdin=diff)
self.wc.addRemove(self.branch_dir)
yaml_path = self.wc.path(self._branchPath('app/app.yaml'))