build/buildutils/svnchangeids.py
branchRCL_3
changeset 19 04becd199f91
child 56 abc41079b313
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/build/buildutils/svnchangeids.py	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,82 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+# Script for parsing TeleLogic Change ids and svn revisions from svn log.
+#
+
+import os, re, sys, traceback
+from optparse import OptionParser
+
+def main():
+    parser = OptionParser(
+        usage = "python -u %prog [options] <svn_url> <svn_rev_1> <svn_rev_2>")
+    parser.add_option("-r", "--release", dest="release",
+                      help="release to which the change is targeted, e.g. 92 or mcl")
+    (opts, args) = parser.parse_args()
+    svn_url = args[0]
+    svn_rev_1 = args[1]
+    svn_rev_2 = args[2]
+    if len(args) > 3:
+        print "ERROR: Too many arguments"
+        sys.exit(1)
+
+    try:
+        svn_change_ids = get_svn_change_ids(opts.release, svn_url, svn_rev_1, svn_rev_2)
+        change_ids = svn_change_ids.keys()
+        change_ids.sort()
+        for change_id in change_ids:
+            print "%s %s" % (change_id, ",".join(svn_change_ids[change_id]))
+    except:
+        print "ERROR: Unexpected exception"
+        traceback.print_exc()
+        sys.exit(1)
+
+def get_svn_change_ids(release, url, rev_1, rev_2):
+    """Return svn change id dictionary.
+
+    Returns a dictionary where keys are change ids and values
+    are list of svn revisions where the change is made.
+    """
+
+    change_id_keyword = "changeid\s*" # Matches to change ids with no release.
+    if not release is None:
+        # Matches to change ids for given release only.
+        change_id_keyword = "changeid[_-]?" + release + "\s*"
+    re_rev = re.compile("^r(\d+) \| ", re.I | re.M)
+    re_change_id = re.compile("(\w+\#\d+)\s*,?", re.I | re.M)
+    re_change_id_keyword = re.compile(change_id_keyword + "[:=]?\s*(\w+\#\d+)",
+                                      re.I | re.M)
+    svn_change_ids = {}
+    cmd = "svn log -r " + rev_2 + ":" + rev_1 + " " + url
+    #print cmd
+    for line in os.popen(cmd).readlines():
+        rev = re_rev.findall(line)
+        if rev:
+            current_rev = rev[0]
+        change_ids = re_change_id_keyword.findall(line)
+        while change_ids:
+            for change_id in change_ids:
+                if change_id in svn_change_ids:
+                    if not current_rev in svn_change_ids[change_id]:
+                        svn_change_ids[change_id] += [current_rev]
+                else:
+                    svn_change_ids[change_id] = [current_rev]
+            line = re_change_id.sub("", line, 1)
+            change_ids = re_change_id_keyword.findall(line)
+    return svn_change_ids
+
+if __name__ == "__main__":
+    main()