Analysons le journal de validation git en Python!

table des matières

1.Tout d'abord 2. module de sous-processus 3. Créez un objet Commit 4. Analyser le journal de validation

introduction

Avez-vous déjà voulu créer un module en utilisant git en Python? J'ai. C'est un projet en cours.

Donc, cette fois, j'écrirai avec le thème de ** Parsing Git's commit log with Python **.

module de sous-processus

Pour utiliser un module qui utilise git, vous devez d'abord ** obtenir la sortie de la commande git **. Créons donc une fonction git '' qui récupère la sortie de la commande git en utilisant le module subprocess`.

git.py


from subprocess import Popen, PIPE

class GitError(BaseException):
    """Se produit lorsqu'une erreur se produit dans le résultat de l'acquisition de la fonction git"""
    pass

def git(cmd, *args):
    """Récupère et renvoie le résultat de l'exécution de git"""
    proc = Popen(
        ("git", cmd) + args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
    out, err = proc.communicate()
    if len(err) == 0:
        return out[:-1]
    else:
        raise GitError(err)

Pour expliquer brièvement le contenu de la fonction (numéros de ligne entre parenthèses), importez la classe Popen et les variables PIPE du module de sous-processus (1), et définissez le processus de git avec la fonction Popen. (8 ~ 9) Exécute le processus défini par la méthode ** commun ** de la classe Popen. Lorsqu'ils sont exécutés **, le résultat de sortie de la sortie standard et le résultat de sortie de l'erreur standard sont renvoyés dans un taple **, de sorte que le résultat de sortie de la sortie standard et le résultat de sortie de l'erreur standard sont acquis avec la variable out et la variable err. .. (10) Après cela, vérifiez s'il y a une erreur standard, et si oui, GitError Élevez la classe. Sinon, le résultat de sortie standard est renvoyé tel quel.

C'est à peu près comme ça. Ensuite, récupérons le journal de validation en utilisant cette fonction git.

Créer un objet Commit

Avant cela, j'ai quelque chose à faire. Créez une classe de validation ** qui stocke les journaux de validation analysés **.

commit.py


class Commit(object):
    """Valider la valeur de hachage, l'auteur, la date et l'heure, le commentaire de validation, la classe pour contenir les données fusionnées en cas de fusion"""
    def __init__(self, commithash, author, date, comment, merge_data=None):
        self.commithash = commithash
        self.author = self._get_user_obj(author)
        self.date = date
        self.comment = comment
        self.merge_data = merge_data

    def _get_user_obj(self, author_string):
        if " " in author_string:
            lines = author_string.split(" ")
            name = lines[0]
            email = lines[1][1:-1]
            return User(name, email)
        else:
            return User(author_string)


    def __repr__(self):
        return "CommitObject(%s)" % self.commithash

Créez une classe qui hérite de la classe intégrée ʻObject`.

Les données que l'objet Commit veut conserver sont

  1. Valider la valeur de hachage
  2. Committer
  3. Date et heure de l'engagement
  4. Commit comment
  5. Données fusionnées (Aucune sinon)

Ceux-ci sont. Ainsi, la méthode __init__ prend simplement chacun comme argument et valorise la classe Self.

La méthode _get_user_obj insère à l'origine les informations de validation dans l'objet Commit avec les données ʻAuthor <[email protected]> `. C'est donc votre travail de diviser cette chaîne en informations «Auteur» et «Email». La classe qui contient ces deux informations est la classe ** User **.

user.py



class User(object):
    """Conservez le nom et l'adresse e-mail du committer"""
    def __init__(self, name, email=None):
        self.name = name
        self.email = email

    def __repr__(self):
        return "UserObject(name=&#39;%s&#39;, email=&#39;%s&#39;)" % (
                                    self.name, self.email)
    def __str__(self):
        return self.__repr__()

Ce cours est facile. C'est juste une classe pour l'auteur de tenir un e-mail.

Analyser le journal de validation

Commençons par le code en premier.

parser.py



from dateutil import parser as dateparser 

def get_commits():
    """Récupérez le journal de validation du shell, faites-en un objet Commit et renvoyez-le sous forme de liste"""
    commits = []
    commits_string = git("log")

    # analyzing
    commitlines = commits_string.split("\n\n")
    commits_string_list = []
    while 0 < len(commitlines):
        commits_string_list.append(
                    "\n".join(commitlines[0:2]))
        commitlines = commitlines[2:]

    # parse
    for commitline in commits_string_list:
        commitdata = parse_commit(commitline)
        commits.append(
            Commit(**commitdata))

    return commits


def parse_commit():
    """Analyse le journal de validation obtenu à partir du shell et renvoie la valeur de hachage de validation, le validateur, la date / heure, le commentaire de validation et la source et la destination si fusionnées"""

    commitlines = commitstring.split("\n")

    # 1 row
    commithash = commitlines[0].replace("commit ","")

    # 2 row
    merge_source = merge_dest = None
    author = None
    if "Merge" in commitlines[1]:
        # parse merge data
        merge_source = commitlines[1].split(" ")[1]
        merge_dest = commitlines[1].split(" ")[2]
    else:
        # parse author
        author = commitlines[1].replace("Author: ","")

    # 3 row
    if "Author" in commitlines[2]:
        # parse author
        author = commitlines[2].replace("Author: ","")
    else:
        # parse date
        date = dateparser.parse(commitlines[2].replace("Date:   ",""))

    # 4 row
    if "Date" in commitlines[3]:
        # parse date
        date = dateparser.parse(commitlines[3].replace("Date:   ",""))
    else:
        # parse comment
        comment = " ".join([i.strip() for i in commitlines[3:]])

    # 5 row
    if "Merge" in commitlines[1]:
        # comment -> under 4 row
        comment = " ".join([i.strip() for i in commitlines[4:]])

    return {"commithash": commithash,
            "merge_data": (merge_source, merge_dest) if merge_source != None else None,
            "author"    : author,
            "date"      : date,
            "comment"   : comment}

commit c92b57f9418eddf75cd96e268bac616aaecd95c4
Merge: 46a71a7 137a6ca
Author: alice <[email protected]>
Date:   Sat Nov 17 01:00:14 2012 +0900

    Merge branch &#39;rewrite&#39;

    Conflicts:
        commithash.py

Un journal de validation normal ressemble à celui ci-dessus. (Version avec fusion) L'analyseur ci-dessus est un script qui évalue ce journal de validation ligne par ligne et obtient la valeur de hachage et les données de fusion de la validation, la date / heure dans le valideur et le commentaire de validation. C'est très ennuyeux d'expliquer ligne par ligne, alors laissez-moi l'omettre ... Eh bien, vous pouvez le comprendre en lisant le code. Je n'ai rien fait d'aussi avancé.

La façon dont vous gérez ces données de validation dépend de vous! !!

Recommended Posts

Analysons le journal de validation git en Python!
Analyser le journal de validation Git en Python
Analyser XML en Python
Trier en Python. Pensons ensuite à l'algorithme.
Utilisons les données ouvertes de "Mamebus" en Python
Voyons comment utiliser def en python
Trouver des erreurs en Python
Analyser l'agent utilisateur en Python
Encapsulation des opérations git en Python
[Python 2/3] Analyser la chaîne de format
Trouvons le rapport de circonférence avec Python
Une ligne pour obtenir le nième hachage de commit dans Git
Obtenir l'API arXiv en Python
Python dans le navigateur: la recommandation de Brython
Lançons "python -m antigravity" en python
Enregistrez le fichier binaire en Python
Frappez l'API Sesami en Python
Obtenez le chemin du bureau en Python
Obtenez le chemin du script en Python
Essayons Fizz Buzz avec Python
Dans la commande python, python pointe vers python3.8
Implémenter le modèle Singleton en Python
Analyser le journal des validations de Subversion en Python
Accédez à l'API Web en Python
Voyons voir l'utilisation de l'entrée en python
J'ai écrit la file d'attente en Python
Calculer le mois précédent en Python
Examiner la classe d'un objet avec python
Obtenez le chemin du bureau en Python
Obtenez le nom d'hôte en Python
Accéder à l'API Twitter avec Python
La première étape de Python Matplotlib
J'ai écrit la pile en Python
Maîtriser le module lowref en Python
Comment est le progrès? Continuons le boom ?? en Python
[Python] Réduisons le nombre d'éléments dans le résultat dans le fonctionnement de l'ensemble
Formatez le journal Git et obtenez le nom du fichier validé au format csv
Apprenez le modèle de conception "Prototype" avec Python
Charger le SDK Python distant avec IntelliJ
Essayez d'utiliser l'API Wunderlist en Python
[Blender x Python] Maîtrisons le matériel !!
git / python> analyse git log (v0.1, v0.2)> calculer le temps de travail total en minutes à partir de git log
Apprenez le modèle de conception "Flyweight" en Python
Django ~ Affichons-le sur le navigateur ~
Essayez d'utiliser l'API Kraken avec Python
Apprenez le modèle de conception "Observer" en Python
Apprenez le modèle de conception "Memento" avec Python
Apprenez le modèle de conception "Proxy" en Python
Ecrire le test dans la docstring python
Apprenez le modèle de conception "Commande" en Python
Prenez la somme logique de List en Python (fonction zip)
Afficher Python 3 dans le navigateur avec MAMP
Tweet à l'aide de l'API Twitter en Python
Apprenez le modèle de conception "Visiteur" avec Python
Apprenez le modèle de conception "Bridge" avec Python
Vérifiez si l'URL existe en Python
Apprenez le modèle de conception "Mediator" avec Python
Associez l'ensemble de tables dans les modèles de python.py
Apprenez le modèle de conception "Décorateur" avec Python
Connectez-vous à Slack à l'aide de requêtes en Python