Dieser Artikel beschreibt, wie Sie python-svn in Python verwenden, um Subversion-Commit-Protokolle zu analysieren.
Dies erfolgt in 2.7, es werden jedoch Python 3.3-, 3.2- und 2.7-Bibliotheken bereitgestellt.
http://pysvn.tigris.org/
Installieren Sie die Binärdatei mit einer der folgenden Methoden
__Unix-Serie __
sudo apt-get install python-svn
Windows、MACOS Von unten herunterladen http://pysvn.tigris.org/project_downloads.html
Das folgende Beispiel zeigt den Verlauf des angegebenen Subversion-Repositorys.
svnlog.py
import pysvn
import time
import sys
from collections import defaultdict
class SvnRepController:
def __init__(self,url_or_path,user,passwd):
self.client = pysvn.Client()
self.url_or_path = url_or_path
self.user = user
self.passwd = passwd
self.client.callback_get_login = self.get_login
def get_login(self, realm, username, may_save):
return True, self.user,self.passwd, False
def log(self):
return self.client.log(self.url_or_path, discover_changed_paths=True)
if __name__ == '__main__':
argvs = sys.argv
argc = len(argvs)
if(argc != 4):
sys.stderr.write( 'Usage:\n python %s url_or_path user pass' % argvs[0] )
quit()
url_or_path = argvs[1]
user = argvs[2]
passwd = argvs[3]
client = SvnRepController(url_or_path,user,passwd)
logs = client.log()
for log in logs:
print ("RevNo:%d" % (log.revision.number))
print ("Author:%s date:%s" % (log.author, time.ctime(log.date)))
print (log.message)
for p in log.changed_paths:
print (" %s" % dict(p))
Es kann wie folgt ausgeführt werden.
python svnlog.py http://svn.sourceforge.jp/svnroot/simyukkuri/ "Nutzername" "Passwort"
Die Vorgehensweise wird erklärt.
(1) Generiere pysvn.Client ().
(2) Geben Sie die Authentifizierungsfunktion in client.callback_get_login an. Diese Funktion wird zurückgerufen, wenn eine Authentifizierung erforderlich ist. Anmeldeinformationen müssen im Rückgabewert angegeben werden.
(3) Sie können die Sequenz von PySvnLog durch Ausführen von client.log () abrufen.
(4) PySvnLog ist [PysvnDictBase](http://sourcecodebrowser.com/pysvn_1_ Es erbt "PysvnDictBase"). PysvnDictBase kann wie Directory betrieben werden. Mit anderen Worten, Sie können die erforderlichen Eigenschaften erhalten, indem Sie die folgenden Schritte ausführen.
logs = client.log()
for log in logs:
dict(log)
Die Erläuterung der hier erhaltenen Hauptelemente ist unten dargestellt.
__PySvnLog-Inhalt: __
Name | Erläuterung |
---|---|
revision.number | Revisionsnummer |
author | Autor |
date | Zeit festschreiben.Es wird numerisch ausgedrückt. |
message | Nachricht festschreiben |
changed_paths | Liste von PysvnLogChangedPath |
Inhalt von __PysvnLogChangedPath: __
Name | Erläuterung |
---|---|
action | Repräsentiert die Art der Operation http://svnbook.red-bean.com/en/1.7/svn.ref.svn.c.update.html |
path | Der Pfad der Operation |
copyfrom_path | Quellpfad kopieren |
copyfrom_revision | Quellrevision kopieren |
(5) Führen Sie danach die erforderliche Aggregation durch.
Ein Anwendungsbeispiel ist unten dargestellt.
Es ist auch möglich, die Muster von Dateien, die häufig gleichzeitig aktualisiert werden, aus dem Dateiaktualisierungsverlauf zu analysieren. Im folgenden Beispiel wird der Grad der Auswirkung analysiert, der auftritt, wenn eine Datei mit einer einfachen Erscheinungshäufigkeit geändert wird.
import pysvn
import time
import sys
from collections import defaultdict
class FilePair:
def __init__(self,path1,path2):
self.path1 = path1
self.path2 = path2
self.count = 0
self.reliability1 =0
self.reliability2 =0
class SvnRepController:
def __init__(self,url_or_path,user,passwd):
self.client = pysvn.Client()
self.url_or_path = url_or_path
self.user = user
self.passwd = passwd
self.client.callback_get_login = self.get_login
def get_login(self, realm, username, may_save):
return True, self.user,self.passwd, False
def log(self):
return self.client.log(self.url_or_path, discover_changed_paths=True)
def getSimpleLogicalCoupling(self):
files = defaultdict(int)
ret = defaultdict(FilePair)
logs = self.log()
for log in logs:
for i in range(0,len(log.changed_paths)-1):
path1 = log.changed_paths[i]
if path1.action != "M":
#Ignorieren Sie bis auf Änderungen
continue
files[path1.path] += 1
for j in range(i+1,len(log.changed_paths)-1):
path2 = log.changed_paths[j]
if path2.action != "M":
#Ignorieren Sie bis auf Änderungen
continue
if path1.path == path2.path:
continue
key = "%s %s" % (path1.path , path2.path)
if( ret.has_key(key) == False ):
key = "%s %s" % (path2.path , path1.path)
if( ret.has_key(key) == False ):
ret[key] = FilePair(path1.path,path2.path)
ret[key].count += 1
for k,v in ret.items():
v.reliability1 = float(v.count) / files[v.path1]
v.reliability2 = float(v.count) / files[v.path2]
return ret
if __name__ == '__main__':
argvs = sys.argv
argc = len(argvs)
if(argc != 6):
sys.stderr.write( 'Usage:\n python %s url_or_path user pass min_count min_reliability' % argvs[0] )
quit()
url_or_path = argvs[1]
user = argvs[2]
passwd = argvs[3]
min_count = argvs[4]
min_reliablility = float(argvs[5])
client = SvnRepController(url_or_path,user,passwd)
list = client.getSimpleLogicalCoupling()
print '"Path A","Path B","Count","Count/count of A","Count/count of B","reliability"'
for k,v in sorted(list.items(), key=lambda x:x[1].count, reverse=True):
if (v.reliability1 > float(min_reliablility) or v.reliability2 > float(min_reliablility)) and v.count > int(min_count):
print '"%s","%s","%d","%f","%f","%f"' % (v.path1,v.path2,v.count,v.reliability1,v.reliability2,v.reliability1 if v.reliability1>v.reliability2 else v.reliability2)
Melden Sie sich mit Benutzer: admin und Kennwort admin beim SampleProject-Repository an. Wenn die Häufigkeit des Auftretens 5 oder mehr beträgt und Sie die entsprechende Datei ändern, erhalten Sie in mindestens 80% der Fälle die Kombination aktualisierter Dateien. Kann wie folgt durchgeführt werden.
python svnSimpleLogicalCoupling.py http://127.0.0.1/svn/SampleProject admin admin 5 0.8 > out.csv
Darüber hinaus scheinen die folgenden Dinge getan werden zu können.
Wie oben erwähnt, kann erwartet werden, dass verschiedene Informationen durch Analysieren des Änderungsverlaufs erhalten werden können.
Recommended Posts