From: Jonathan Corbet Date: Tue, 16 Feb 2010 00:32:08 +0000 (-0700) Subject: Add a couple of lines-per-version utilities X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=2097993e3e247478a03db58ae9de00e8bc1c9e09;p=people%2Flarsk%2Fxenproject-org-gitdm.git Add a couple of lines-per-version utilities A couple of quickly-hacked tools which let me determine how much of the kernel was added in each major version. Signed-off-by: Jonathan Corbet --- diff --git a/committags b/committags new file mode 100755 index 0000000..f1c8fc3 --- /dev/null +++ b/committags @@ -0,0 +1,37 @@ +#!/usr/bin/python +# +# Generate a database of commits and major versions they went into. +# +# committags [git-args] +# +import sys +import re +import os +import pickle + +git = 'git log --decorate ' +if len(sys.argv) > 1: + git += ' '.join(sys.argv[1:]) +input = os.popen(git, 'r') + +DB = { } +Tag = 'None' + +tagline = re.compile(r'^commit ([\da-f]+) .*tag: (v2\.6\.\d\d)') +commit = re.compile(r'^commit ([\da-f]+)') + +for line in input.readlines(): + if not line.startswith('commit'): + continue # This makes it go faster + m = tagline.search(line) + if m: + DB[m.group(1)] = Tag = m.group(2) + else: + m = commit.search(line) + if m: + DB[m.group(1)] = Tag + +print 'Found %d commits' % (len(DB.keys())) +out = open('committags.db', 'w') +pickle.dump(DB, out) +out.close() diff --git a/linetags b/linetags new file mode 100755 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 +# +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()