Analysieren Sie das Subversion-Commit-Protokoll in Python

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/

Installation

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

Beispiel und Beschreibung der Protokollerfassung

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.

Anwendung

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

Analysieren Sie das Subversion-Commit-Protokoll in Python
Analysieren Sie das Git-Commit-Protokoll in Python
CSS-Analyse mit cssutils in Python
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Lassen Sie uns das Git-Commit-Protokoll in Python analysieren!
Sortierte Liste in Python
Täglicher AtCoder # 36 mit Python
Clustertext in Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 32 in Python
Täglicher AtCoder # 6 in Python
Täglicher AtCoder # 18 in Python
Bearbeiten Sie Schriftarten in Python
Singleton-Muster in Python
Lesen Sie DXF mit Python
Täglicher AtCoder # 53 in Python
Verwenden Sie config.ini mit Python
Täglicher AtCoder # 33 in Python
Löse ABC168D in Python
Logistische Verteilung in Python
Täglicher AtCoder # 7 in Python