#!/usr/bin/env python from subprocess import Popen, PIPE import re import datetime class SVN: def __init__(self,address): stdin = '' command = Popen(['svn','log',address], shell=False, stdin=PIPE, stdout=PIPE) #,stderr=PIPE) (stdout, _) = command.communicate(stdin) revs = re.findall(r'(r\d+)|(\d\d\d\d-\d\d-\d\d)|(\d\d:\d\d)',stdout.decode('UTF-8')) self.list_of_revisions = [] index = 0 while index < len(revs): self.list_of_revisions.append((revs[index][0], revs[index+1][1], revs[index+2][2])) index += 3 def revisions(self): return self.list_of_revisions def _sort_neg_pos(self,lst): positive = set() negative = set() changed = set() for change in lst: (pos,neg) = (set(),set()) for line in change: if line[0] == '+' and line[0:2] != '++': pos.add(line[1:].split('\t')[0]) elif line[0:2] != '++' and line[0:2] != '--': neg.add(line[1:].split('\t')[0]) if len(neg) == 0: positive.update(pos) elif len(pos) == 0: negative.update(neg) else: changed.update(pos) return (positive,changed,negative) def difference(self,revision1,revision2): stdin = '' command = Popen(['svn', 'diff','-r', '%s:%s' % (revision1,revision2),address], shell=False, stdin=PIPE, stdout=PIPE) #,stderr=PIPE) (stdout, _) = command.communicate(stdin) return self._sort_neg_pos( [[c for c in re.split(r'\n',s) if c != '' and c[0] in '+-'] for s in re.split(r'@@.+@@\n',stdout.decode('UTF-8'))]) def ref(address,item): if address == '': return item else: return '%s' % (address,item,item) def produce_report(address,number=10,posref='',negref=''): tdate = str(datetime.date.today()) date_and_time = str(datetime.datetime.now()).split('.')[0] svn = SVN(address) revs = svn.revisions() result = '' result += '' result += '' result += '' result += '' result += '' result += '' result += '

' result += 'SALDO

%s

' % date_and_time count = 0 for i in range(len(revs)-1): (rev,d,t) = revs[i] (rev2,_,_) = revs[i+1] (pos,changed,neg) = svn.difference(rev2,rev) if len(pos) > 0 or len(changed) > 0 or len(neg) > 0: count += 1 result += '' % (rev, rev,d, t) if len(pos) > 0: if tdate == d: result += '' % (' '.join(pos)) else: result += '' % (' '.join([ref(posref,p) for p in pos])) if len(changed) > 0: if tdate == d: result += '' % (' '.join(changed)) else: result += '' % (' '.join([ref(posref,c) for c in changed])) if len(neg) > 0: if tdate == d: result += '' % (' '.join(neg)) else: result += '' % (' '.join([ref(negref,n) for n in neg])) result += '
%s %s %s
%s
%s
rev: %s
rev: %s
%s
%s
' if count >= number: break result += '' result += '' return result if __name__ == '__main__': address = 'https://svn.spraakdata.gu.se/repos/sblex/sal/trunk/saldo.txt' print produce_report(address,number=50,posref='http://spraakbanken.gu.se/ws/saldo-ws/lid/html/').encode('UTF-8')