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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top