#!/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 += '%s
| %s %s %s |
|---|
| %s |
| %s |
| rev: %s |
| rev: %s |
| %s |
| %s |