J'ai écrit une fonction pour charger le script d'extension Git en Python

Particularités de Git

Git a une fonction spéciale que si vous avez un script appelé git-xxx (** avec l'autorisation d'exécution et sous votre PATH **), vous pouvez l'exécuter sous la forme ** git xxx **. (Le célèbre git-flow utilise également cette fonctionnalité pour appeler git flow)

Réinventons cette fonction en Python.

je l'ai écrit

mygit.py


# coding: utf-8

import os
import sys

from subprocess import call


class ExtensionLoader:

    def __init__(self):

        #Puisque la variable d'environnement PATH est une chaîne reliée par deux-points,
        #Convertir en tableau en divisant par deux points
        self.PATH = os.environ["PATH"].split(":")

    def load(self, ext, args):

        # ext: 'mygit init' -> 'init'
        ext_absname = "mygit-{}".format(ext)
        found_flag = None
        extension = None

        for directory in self.PATH:
            # 'mygit-init'Est dans le répertoire
            if ext_absname in os.listdir(directory):
                found_flag = True
                extension = os.path.join(directory, ext_absname)

        if found_flag:
            # 'mygit-init'Courez quand vous trouvez
            cmd = [extension]
            cmd += args #Passer des arguments au script d'extension à exécuter ici
            return call(cmd)

        else:
            raise IOError("Extension does not found: {}".format(ext))

if __name__ == "__main__":

    if len(sys.argv) == 1:
        print "usage: mygit {command}"
        sys.exit(1)

    extloader = ExtensionLoader()

    # argv: ["mygit" "command", "arg1", "arg2", "arg3"]
    command = sys.argv[1]
    arguments = sys.argv[2:]
    exit_status = extloader.load(command, arguments)

    sys.exit(exit_status)

C'était étonnamment facile.

Le problème est qu'il ne peut pas être utilisé avec ** argparse **. argparse peut analyser les sous-commandes, mais si une commande non enregistrée est entrée, elle générera une erreur et il n'est pas possible d'enregistrer la commande de script d'extension à l'avance ...

Recommended Posts

J'ai écrit une fonction pour charger le script d'extension Git en Python
J'ai écrit un script pour extraire les liens de pages Web en Python
J'ai écrit un script pour obtenir un site populaire au Japon
Je veux créer une fenêtre avec Python
J'ai écrit une classe en Python3 et Java
J'ai écrit "Introduction à la vérification des effets" en Python
J'ai écrit un script pour télécharger un plug-in WordPress
J'ai écrit un code pour convertir quaternion en angle de graissage de type z-y-x avec Python
[Python] J'ai écrit de force une courte fonction de génération de bruit parlin dans Numpy.
J'ai créé un script en python pour convertir des fichiers .md au format Scrapbox
Je souhaite intégrer une variable dans une chaîne Python
Je veux facilement implémenter le délai d'expiration en python
J'ai écrit python en japonais
Créer une fonction en Python
Je veux écrire en Python! (2) Écrivons un test
J'ai fait un script pour mettre un extrait dans README.md
J'ai essayé d'implémenter un pseudo pachislot en Python
Un mémorandum pour exécuter un script python dans un fichier bat
Je veux échantillonner au hasard un fichier avec Python
Je veux travailler avec un robot en python.
J'étais sobrement accro à appeler awscli à partir d'un script Python 2.7 enregistré dans crontab
J'ai essayé d'implémenter un automate cellulaire unidimensionnel en Python
J'ai écrit rapidement un programme pour étudier la DI avec Python ①
J'ai essayé "Comment obtenir une méthode décorée en Python"
J'ai écrit un script de création automatique de répertoire vide en Python
Pour renvoyer char * dans une fonction de rappel à l'aide de ctypes en Python
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
J'ai fait un chronomètre en utilisant tkinter avec python
Je veux ajouter un joli complément à input () en python
J'ai écrit un script qui divise l'image en deux
J'ai écrit Fizz Buzz en Python
J'ai écrit la file d'attente en Python
J'ai écrit la pile en Python
J'ai créé un script en Python pour convertir un fichier texte pour JSON (pour l'extrait d'utilisateur vscode)
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai écrit un script pour créer rapidement un environnement de développement pour Twitter Bot avec AWS Lambda + Python 2.7
Comment passer des arguments à un script Python dans SPSS Modeler Batch
J'ai écrit un script pour vous aider à démarrer avec AtCoder à grande vitesse!
J'ai écrit le code pour écrire le code Brainf * ck en python
J'ai essayé de mettre en œuvre un jeu de dilemme de prisonnier mal compris en Python
J'ai écrit un script pour aider goodnotes5 et Anki à travailler ensemble
J'ai essayé d'implémenter la permutation en Python
Je veux imprimer dans la notation d'inclusion
J'ai fait un programme de gestion de la paie en Python!
Précautions lors du décapage d'une fonction en python
Épingler le répertoire actuel au répertoire de script en Python
Exemple de script pour piéger les signaux en Python
J'ai essayé d'implémenter PLSA dans Python 2
Je veux créer un environnement Python
Un simple script IDAPython pour nommer une fonction
Exécuter l'interpréteur Python dans le script
Comment obtenir stacktrace en python
J'ai essayé d'implémenter ADALINE en Python
Je voulais résoudre ABC159 avec Python
J'ai essayé d'implémenter PPO en Python
J'ai fait un script pour afficher des pictogrammes
J'ai créé un outil de mot de passe en Python.