| #!/usr/bin/env python |
| |
| import sys |
| import os |
| |
| progname = os.path.basename(sys.argv[0]) |
| |
| def usage(): |
| print "Usage: %s SOURCEURL WCPATH [r]REVNUM[,] [...]" % progname |
| print "Try '%s --help' for more information" % progname |
| |
| def help(): |
| val = """This script is meant to ease the pain of merging and |
| reviewing revision(s) on a release branch (although it can be used to |
| merge and review revisions from any line of development to another). |
| |
| To allow cutting and pasting from the STATUS file, revision numbers |
| can be space or comma-separated, and may also include the prefix |
| 'r'. |
| |
| Lastly, a file (named 'rev1-rev2-rev3.log') is created for you. |
| This file contains each merge command that was run, the log of the |
| revision that was merged, and the diff from the previous revision. |
| |
| Examples: |
| |
| %s http://svn.collab.net/repos/svn/trunk svn-1.2.x-branch \ |
| r14041, r14149, r14186, r14194, r14238, r14273 |
| |
| %s http://svn.collab.net/repos/svn/trunk svn-1.2.x-branch \ |
| 14041 14149 14186 14194 14238 14273""" % (progname, progname) |
| print val |
| |
| |
| if len(sys.argv) > 1 and sys.argv[1] == '--help': |
| help() |
| sys.exit(0) |
| |
| if len(sys.argv) < 4: |
| usage() |
| sys.exit(255) |
| |
| src_url = sys.argv[1] |
| wc_path = sys.argv[2] |
| |
| # Tolerate comma separated lists of revs (e.g. "r234, r245, r251") |
| revs = [] |
| for rev in sys.argv[3:]: |
| orig_rev = rev |
| if rev[-1:] == ',': |
| rev = rev[:-1] |
| |
| if rev[:1] == 'r': |
| rev = rev[1:] |
| |
| try: |
| rev = int(rev) |
| except ValueError: |
| print "Encountered non integer revision '%s'" % orig_rev |
| usage() |
| sys.exit(254) |
| revs.append(rev) |
| |
| # Make an easily reviewable logfile |
| logfile = "-".join(map(lambda x: str(x), revs)) + ".log" |
| log = open(logfile, 'w') |
| |
| for rev in revs: |
| merge_cmd = ("svn merge -r%i:%i %s %s" % (rev - 1, rev, src_url, wc_path)) |
| log_cmd = 'svn log -v -r%i %s' % (rev, src_url) |
| diff_cmd = 'svn diff -r%i:%i %s' % (rev -1, rev, src_url) |
| |
| # Do the merge |
| os.system(merge_cmd) |
| |
| # Write our header |
| log.write("=" * 72 + '\n') |
| log.write(merge_cmd + '\n') |
| |
| # Get our log |
| fh = os.popen(log_cmd) |
| while 1: |
| line = fh.readline() |
| if not line: |
| break |
| log.write(line) |
| fh.close() |
| |
| # Get our diff |
| fh = os.popen(diff_cmd) |
| while 1: |
| line = fh.readline() |
| if not line: |
| break |
| log.write(line) |
| |
| # Write our footer |
| log.write("=" * 72 + '\n' * 10) |
| |
| |
| log.close() |
| print "\nYour logfile is '%s'" % logfile |