Archive for April, 2013

reviewed-by and signed-off-by

Wednesday, April 24th, 2013

This took me a whole day: it adds sorted Signed-of-by and Reviewed-by to a bunch of git commits using the –exec option and overriding the EDITOR environment variable.

Half of the code is from my misspelling of Signed-off as Signed-of, and using the script to fix the resulting mess instead of using a hard reset.


REVIEWED_BY="Some One " git rebase -i --exec git-add-review.exec qemu/master

Script 1: git-add-review.exec

# coding: utf-8

import os

author_replacements = {
'Some One Alias ':
'Some One '

lines = os.popen('git show HEAD').readlines()

author = [l for l in lines if 'Author:' in l]
author = author[0].split('Author: ', 1)[1].strip()

if author in author_replacements:
os.environ['EDITOR'] = 'true'
os.system('git commit --amend --author "%s"' % author_replacements[author])

os.environ['EDITOR'] = 'git-add-review.helper'
os.system('git commit --amend')

Script 2: git-add-review.helper


import os
import sys

with open(sys.argv[-1]) as fd:
lines = fd.readlines()

i_last = -1
for i, l in enumerate(lines):
if l[:1] == '#':
i_last = i

author = [l for l in lines if 'Author:' in l]
if len(author) == 0:
author = os.popen('git show HEAD | grep Author').readlines()
author = author[0].split('Author: ', 1)[1].strip()

reviewed_by = os.environ.get('REVIEWED_BY', 'Anonymous').strip()
print 'AUTHOR*** ', repr(author)
print 'REVIEWER* ', repr(reviewed_by)

author_is_reviewer = reviewed_by[:5] == author[:5] # hack

if author_is_reviewer:
print "author is reviewer"

new_lines = []
signed_lines = []
reviewed_lines = []

for l in lines:
if l.startswith('Signed-of-by:') or l.startswith('Signed-off-by:'):
elif l.startswith('Reviewed-by:'):

print "=== Reviewed-by ==="
print ''.join(reviewed_lines)
print "=== Signed-off-by ==="
print ''.join(signed_lines)
def is_valid_email(x):
return '@' in x
reviewers = set([l.split(':', 1)[1].strip() for l in reviewed_lines
if is_valid_email(l.split(':', 1)[1])])
signers = set([l.split(':', 1)[1].strip() for l in signed_lines
if is_valid_email(l.split(':', 1)[1])])
reviewers -= set([''])
signers -= set([''])

if author_is_reviewer:
reviewers -= set([author])
reviewers |= set([reviewed_by])


new_lines.extend(['Signed-off-by: %s\n' % s for s in sorted(signers)])
new_lines.extend(['Reviewed-by: %s\n' % r for r in sorted(reviewers)])

with open(sys.argv[-1], 'w+') as fd: