86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/python
 | 
						|
#
 | 
						|
# Find out how many lines were introduced in each major release.
 | 
						|
#
 | 
						|
# linetags <directory>
 | 
						|
#
 | 
						|
# This code is part of the LWN git data miner.
 | 
						|
#
 | 
						|
# Copyright 2007-11 Eklektix, Inc.
 | 
						|
# Copyright 2007-11 Jonathan Corbet <corbet@lwn.net>
 | 
						|
#
 | 
						|
# This file may be distributed under the terms of the GNU General
 | 
						|
# Public License, version 2.
 | 
						|
#
 | 
						|
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()
 |