Author: cmpilato
Date: Wed Jul 20 21:12:21 2011
New Revision: 1148944
URL: http://svn.apache.org/viewvc?rev=1148944&view=rev
Log:
Teach release.py to not be so picky about what constitutes
out-of-syncness in the branch's CHANGES file by allowing an arbitrary
amount of prelude material in the trunk's CHANGES file. Also, when in
verbose mode, print the diffs (if any).
WARNING: This has not been purely tested. (Sorry, Hyrum.)
* tools/dist/release.py
(fetch_changes, compare_changes): New helper functions.
(roll_tarballs): Now use compare_changes() instead of a naive 'svn
diff --summarize'.
Modified:
subversion/trunk/tools/dist/release.py
Modified: subversion/trunk/tools/dist/release.py
URL:
http://svn.apache.org/viewvc/subversion/trunk/tools/dist/release.py?rev=1148944&r1=1148943&r2=1148944&view=diff
==============================================================================
--- subversion/trunk/tools/dist/release.py (original)
+++ subversion/trunk/tools/dist/release.py Wed Jul 20 21:12:21 2011
@@ -341,6 +341,38 @@ def build_env(args):
#----------------------------------------------------------------------
# Create release artifacts
+def fetch_changes(repos, branch, revision):
+ changes_peg_url = '%s/%s/CHANGES@%d' % (repos, branch, revision)
+ proc = subprocess.Popen(['svn', 'cat', changes_peg_url],
+ stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ (stdout, stderr) = proc.communicate()
+ proc.wait()
+ return stdout.split('\n')
+
+
+def compare_changes(repos, branch, revision):
+ # Compare trunk's version of CHANGES with that of the branch,
+ # ignoring any lines in trunk's version precede what *should*
+ # match the contents of the branch's version. (This allows us to
+ # continue adding new stuff at the top of trunk's CHANGES that
+ # might relate to the *next* major release line.)
+ branch_CHANGES = fetch_changes(repos, branch, revision)
+ trunk_CHANGES = fetch_changes(repos, 'trunk', revision)
+ try:
+ first_matching_line = trunk_CHANGES.index(branch_CHANGES[0])
+ except ValueError:
+ raise RuntimeError('CHANGES not synced between trunk and branch')
+
+ trunk_CHANGES = trunk_CHANGES[first_matching_line:]
+ saw_diff = False
+ import difflib
+ for diff_line in difflib.unified_diff(trunk_CHANGES, branch_CHANGES):
+ saw_diff = True
+ logging.debug(diff_line)
+ if saw_diff:
+ raise RuntimeError('CHANGES not synced between trunk and branch')
+
+
def roll_tarballs(args):
'Create the release artifacts.'
extns = ['zip', 'tar.gz', 'tar.bz2']
@@ -362,21 +394,10 @@ def roll_tarballs(args):
if not dep.have_usable():
raise RuntimeError('Cannot find usable %s' % dep.label)
- # Make sure CHANGES is sync'd
if branch != 'trunk':
- trunk_CHANGES = '%s/trunk/CHANGES@%d' % (repos, args.revnum)
- branch_CHANGES = '%s/%s/CHANGES@%d' % (repos, branch,
- args.revnum)
- proc = subprocess.Popen(['svn', 'diff', '--summarize', branch_CHANGES,
- trunk_CHANGES],
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- (stdout, stderr) = proc.communicate()
- proc.wait()
-
- if stdout:
- raise RuntimeError('CHANGES not synced between trunk and branch')
-
+ # Make sure CHANGES is sync'd.
+ compare_changes(repos, branch, args.revnum)
+
# Create the output directory
if not os.path.exists(get_deploydir(args.base_dir)):
os.mkdir(get_deploydir(args.base_dir))