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.
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