]> xenbits.xensource.com Git - people/larsk/xenproject-org-gitdm.git/commitdiff
Put linetags back
authorJonathan Corbet <corbet@lwn.net>
Wed, 17 Feb 2010 15:39:19 +0000 (08:39 -0700)
committerJonathan Corbet <corbet@lwn.net>
Wed, 17 Feb 2010 15:39:19 +0000 (08:39 -0700)
Caffeine-deprived fat-fingering made this script go away.  But we want it,
so put it back.

Signed-off-by: Jonathan Corbet <corbet@lwn.net>
linetags [new file with mode: 0755]

diff --git a/linetags b/linetags
new file mode 100755 (executable)
index 0000000..767e399
--- /dev/null
+++ b/linetags
@@ -0,0 +1,77 @@
+#!/usr/bin/python
+#
+# Find out how many lines were introduced in each major release.
+#
+# linetags <directory>
+#
+import sys, re, os, pickle
+
+CommitLines = { }
+
+commitpat = re.compile(r'^([\da-f][\da-f]+) ')
+
+def GetCommitLines(file):
+    print file
+    blame = os.popen('git blame -p ' + file, 'r')
+    for line in blame.readlines():
+        m = commitpat.search(line)
+        #
+        # All-zero commits mean we got fed a file that git doesn't
+        # know about.  We could throw an exception and abort processing
+        # now, or we can just silently ignore it...
+        #
+        if not m or m.group(1) == '0000000000000000000000000000000000000000':
+            continue
+        try:
+            CommitLines[m.group(1)] += 1
+        except KeyError:
+            CommitLines[m.group(1)] = 1
+    blame.close()
+
+#
+# Try to figure out which tag is the first to contain each commit.
+#
+refpat = re.compile(r'^(v2\.6\.\d\d).*$')
+def CommitToTag(commit):
+    try:
+        return DB[commit]
+    except KeyError:
+        print 'Missing commit %s' % (commit)
+        return 'WTF?'
+
+TagLines = { }
+def MapCommits():
+    print 'Mapping tags...'
+    for commit in CommitLines.keys():
+        tag = CommitToTag(commit)
+        try:
+            TagLines[tag] += CommitLines[commit]
+        except KeyError:
+            TagLines[tag] = CommitLines[commit]
+
+#
+# Here we just plow through all the files.
+#
+if len(sys.argv) != 2:
+    sys.stderr.write('Usage: linetags directory\n')
+    sys.exit(1)
+#
+# Grab the tags/version database.
+#
+dbf = open('committags.db', 'r')
+DB = pickle.load(dbf)
+dbf.close()
+
+out = open('linetags.out', 'w')
+os.chdir(sys.argv[1])
+files = os.popen('/usr/bin/find . -type f', 'r')
+for file in files.readlines():
+    if file.find('.git/') < 0:
+        GetCommitLines(file[:-1])
+MapCommits()
+# print TagLines
+tags = TagLines.keys()
+tags.sort()
+for tag in tags:
+    out.write('%s %d\n' % (tag, TagLines[tag]))
+out.close()