summaryrefslogtreecommitdiff
path: root/tools/dev/svn-merge-revs.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/dev/svn-merge-revs.py')
-rwxr-xr-xtools/dev/svn-merge-revs.py122
1 files changed, 122 insertions, 0 deletions
diff --git a/tools/dev/svn-merge-revs.py b/tools/dev/svn-merge-revs.py
new file mode 100755
index 0000000..f67dae4
--- /dev/null
+++ b/tools/dev/svn-merge-revs.py
@@ -0,0 +1,122 @@
+#!/usr/bin/env python
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#
+
+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.apache.org/repos/asf/subversion/trunk svn-1.2.x-branch \
+ r14041, r14149, r14186, r14194, r14238, r14273
+
+ %s http://svn.apache.org/repos/asf/subversion/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([str(x) for x in 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 True:
+ line = fh.readline()
+ if not line:
+ break
+ log.write(line)
+ fh.close()
+
+ # Get our diff
+ fh = os.popen(diff_cmd)
+ while True:
+ 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)