Mercurial pre-commit hook: come agganciare al programma Python nella directory corrente?
-
26-10-2019 - |
Domanda
Sto cercando di creare un gancio Mercurial che corre quando i commit vengono spinte nel repository principale. Ho creato uno script python come indicato di seguito:
# commit.py from mercurial import ui, hg from mercurial.i18n import gettext as _ def getV1ID(ui, repo, **kwargs): ui.write("The hook works!!!") v1id = ui.prompt('Enter the VersionOne ID') ui.write('VersionOne ID: '+v1id)
Per ogni ramo, questo commit.py
è duplicato in quanto contiene meccanismi che deve funzionare prima che il codice viene spinto sul respository principale. La spinta deve avere successo soltanto se tali meccanismi di pre-spinta passano. Gli utenti possono modificare la loro commit.py locale in modo che possano girare solo un sottoinsieme di quelle operazioni di pre-spinta a seconda del progetto il loro lavoro sulla e ogni persona potrebbe essere al lavoro su più di un progetto alla volta. E così, commit.py
non può essere uno script python globale che può risiedere nella cartella .hg
.
Per rendere corsa mercuriale il commit.py
locali, nel mio file mercurial.ini (in C: \ Utenti \ nomeutente \ mercurial.ini), ho aggiunto la seguente dichiarazione:
[hooks] prechangegroup = python:./commit.py:getV1ID
Le piste di script python se posizionarlo all'interno della cartella .hg
, ma non quando faccio questo. Qualcuno può aiutarmi a far luce su questo tema? Molte grazie.
Soluzione
ho ottenuto questa soluzione su IRC per Mercurial. Come affermato in uno dei miei commenti, la sceneggiatura per il gancio deve essere specificato come un percorso assoluto o si dovrebbe un modulo Python in PYTHONPATH. Quindi, mi è stato suggerito da pmezard
su IRC che dovrei avere un copione fisso che richiama il commit.py
locale. Questo può essere fatto come illustrato di seguito:
In mercurial.ini
, gancio per un pitone-script 'globale' che risiede in .hg
directory di home dell'utente come illustrato di seguito:
[hooks] preoutgoing = python:%USERPROFILE%\.hg\commit.py:run
Il pitone-script 'globale', sguardi commit.py
qualcosa di simile:
from mercurial import ui, hg import os class Chdir: def __init__(self, newPath): self.savedPath = os.getcwd() os.chdir(newPath) def __enter__(self): return self def __exit__(self, type, value, traceback): os.chdir(self.savedPath) def run(ui, repo, **kwargs): if kwargs['source'] == 'push': with Chdir(repo.root) as dirchanged: import localcommit sys.exit(localcommit.main(ui, repo, **kwargs))
Il localcommit.py
nella directory del repository poi viene gestito dalla global
commit-script, e quindi ogni repository può mantenere il proprio impegno-script personalizzato.