James - you're right - I hadn't paid attention to MTA wrapping...
Patrice - even though it's counter to what James asked, I added short
sha-1s [ i.e. the output of git rev-parse --short
f1cb2b98f62fa9cbf1ef5a0f149dd47fee6964be ]
Now the output looks like below (or attached txt file)

Removals:
dev-java/antenna               2015-09-03 13:45:07 +0000  monsieurp      b4215f4
dev-java/jjtraveler            2015-09-03 13:46:28 +0000  monsieurp      0bda332
www-servers/skunkweb           2015-09-03 13:52:51 +0000  monsieurp      2dc8314
x11-drivers/radeon-ucode       2015-09-02 00:17:33 +0200  chithanh       7b60c95

Additions:
dev-python/cachetools          2015-09-03 16:17:35 -0500  mthode         3dca3ff
dev-python/debtcollector       2015-09-01 10:24:15 -0500  mthode         8513c3c
dev-python/fasteners           2015-09-02 21:56:24 -0500  prometheanfire cfc49c9
dev-python/functools32         2015-09-02 13:01:45 +0200  jlec           2933703
dev-python/futurist            2015-09-03 16:24:23 -0500  mthode         4a5f1c0

Updated scripts attached.

malc.
Removals:
dev-java/antenna               2015-09-03 13:45:07 +0000  monsieurp      b4215f4
dev-java/jjtraveler            2015-09-03 13:46:28 +0000  monsieurp      0bda332
www-servers/skunkweb           2015-09-03 13:52:51 +0000  monsieurp      2dc8314
x11-drivers/radeon-ucode       2015-09-02 00:17:33 +0200  chithanh       7b60c95

Additions:
dev-python/cachetools          2015-09-03 16:17:35 -0500  mthode         3dca3ff
dev-python/debtcollector       2015-09-01 10:24:15 -0500  mthode         8513c3c
dev-python/fasteners           2015-09-02 21:56:24 -0500  prometheanfire cfc49c9
dev-python/functools32         2015-09-02 13:01:45 +0200  jlec           2933703
dev-python/futurist            2015-09-03 16:24:23 -0500  mthode         4a5f1c0
dev-python/os-testr            2015-09-01 10:57:37 -0500  mthode         6407898
dev-python/oslo-service        2015-09-03 16:55:42 -0500  mthode         b76edcf
dev-python/pytest-django       2015-09-02 08:46:59 +0200  jlec           2b2fb2d
dev-python/pytest-pythonpath   2015-09-02 09:11:44 +0200  jlec           63ac3c2
dev-python/strict-rfc3339      2015-09-02 12:31:00 +0200  jlec           abec25e
dev-python/webcolors           2015-09-02 12:38:44 +0200  jlec           8ba7f41
media-fonts/hack               2015-08-31 08:36:17 +0200  amadio         f1cb2b9
sci-geosciences/qmapshack      2015-09-03 22:38:02 +0600  grozin         3fa0482
sys-firmware/amdgpu-ucode      2015-09-02 04:16:35 +0200  chithanh       5bd3914
sys-firmware/radeon-ucode      2015-09-02 00:17:33 +0200  chithanh       7b60c95
x11-drivers/xf86-video-amdgpu  2015-09-02 03:25:56 +0200  chithanh       b53f89f
#!/usr/bin/env python2
# Authored by Alec Warner <anta...@gentoo.org>
# Significent modifications by Robin H Johnson <robb...@gentoo.org>
# Modified for Git support by Malcolm Lashley <mlash...@gmail.com>
# Released under the GPL Version 2
# Copyright Gentoo Foundation 2006

# Changelog: Initial release 2006/10/27
#            Git Support     2015/08/25

doc = """
# Purpose: This script analyzes the git log output in an attempt to locate package
# additions and removals.  It takes 3 arguments; two of which are optional.  It needs
# the path to the repository to read.  If a start_date is not provided it will read
# the entire log and match any addition/removal.  If you provide a start date it will
# only match things that are after that start_date.  If you provide an end date you can
# find matches over date ranges.  If an end date is not provided it defaults to now()
"""

import sys, os, re, time, datetime, subprocess

new_package     = re.compile("^A\s+(.*)\/(.*)\/Manifest$")
removed_package = re.compile("^D\s+(.*)\/(.*)\/Manifest$")
author_re          = re.compile("^Author: .*<(.*)@.*>")
date_re            = re.compile("^Date:\s+(.*)")
commit_re            = re.compile("^commit (.*)")

class record(object):
	def __init__(self, who, date, cp, op, commit ):
		"""
		    Who is a string
		    date is whatever the crap git outputs for date string :)
		    cp is a category/package
		    op is "added", "removed", "moved"
                    commit is the git sha1
		"""
		self.who = who
		self.date = date
		self.package = cp
		self.op = op
                self.commit = commit

	def __str__( self ):
		#return "Package %s was %s by %s on %s" % (self.package, self.op, self.who, self.date)
		return "%s,%s,%s,%s,%s" % (self.package, self.op, self.who, self.date, self.commit)

	def cat (self):
		return self.package.split("/")[0]
	
	def pn (self):
		return self.package.split("/")[1]

	def date (self):
		return self.date
	
	def who (self):
		return self.who
	
	def op (self):
		return self.op

	def commit (self):
		return self.commit


def main():
	if (len(sys.argv) < 2):
		usage()
		sys.exit(1)

	args = sys.argv[1:]
	repo_path = args[0]
	os.chdir(repo_path)

	if len(args) >= 2: 
		start_date = ["--after", args[1] ]
	else:
		start_date = []

	if len(args) >= 3:
		end_date = ["--before", args[2]]
	else:
		end_date = []

	p = subprocess.Popen(["git","log","--name-status","--date=iso"] + start_date + end_date,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

	removals = []
	adds = []
	moves = []
	for line in iter(p.stdout.readline,''):
		match = commit_re.match(line)
		if match:
			commit = match.groups()[0]
                	q = subprocess.Popen(["git","rev-parse","--short",commit],stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
                        commit = q.stdout.readline()

		match = author_re.match(line)
		if match:
			who = match.groups()[0]

		match = date_re.match(line)
		if match:
			date = match.groups()[0]

		match = new_package.match( line )
		if match:
			rec = record( who, date, match.groups()[0] + "/" + match.groups()[1], "added", commit )
			adds.append( rec )

		match = removed_package.match( line )
		if match:
			rec = record( who, date, match.groups()[0] + "/" + match.groups()[1], "removed", commit )
			removals.append( rec )

	print("Removed Packages:")
	for pkg in removals:
		print(pkg)

	print("Added Packages:")
	for pkg in adds:
		print(pkg)
	print
	print("Done.")

def usage():
	print(sys.argv[0] + " <git repo path> [start date] [end date]")
	print("Start date defaults to '0'.")
	print("End date defaults to 'now'.")
	print("Both dates should be specified as anything git can parse...")
	print(doc)

if __name__ == "__main__":
	main()

Attachment: find-git-adds-and-removals-process.sh
Description: Bourne shell script

Reply via email to