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()
find-git-adds-and-removals-process.sh
Description: Bourne shell script