Pregunta

Estoy tratando de crear un gancho mercurial que se ejecute cuando las confirmaciones se están empujando al repositorio principal. Creé un script de Python como se da a continuación:

# 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)

Para cada rama, esta commit.py se duplica, ya que contiene mecanismos que deben ejecutarse antes de que el código se empuje a la resposición principal. El impulso solo debe tener éxito si pasan esos mecanismos previos al empuje. Los usuarios pueden modificar su comet.py local para que solo ejecuten un subconjunto de esas operaciones previas al empuje dependiendo del proyecto en el que funcionen y cada persona podría estar trabajando en más de un proyecto a la vez. Y entonces, commit.py no puede ser un guión global de Python que pueda residir en .hg carpeta.

Para hacer que Mercurial corra el local commit.py, En mi archivo Mercurial.ini (en c: users username Mercurial.ini), agregué la siguiente declaración:

[hooks]
prechangegroup = python:./commit.py:getV1ID

El guión de Python se ejecuta si lo coloco adentro .hg carpeta, pero no cuando hago esto. ¿Alguien puede ayudarme a arrojar luz sobre este tema? Muchas gracias.

¿Fue útil?

Solución

Obtuve esta solución sobre IRC para Mercurial. Como se indica en uno de mis comentarios, el script para el gancho debe especificarse como una ruta absoluta o si un módulo de Python en Pythonpath. Por lo tanto, me sugirieron pmezard sobre irc que debería tener un guión fijo que invoque el local commit.py. Esto se puede hacer como se muestra a continuación:

En mercurial.ini, gancho a un script de pitón 'global' que reside en .hg Directorio de la casa del usuario como se muestra a continuación:

[hooks]
preoutgoing = python:%USERPROFILE%\.hg\commit.py:run

El script de python 'global', commit.py se parece a esto:

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

los localcommit.py en el directorio del repositorio se ejecuta por el global Commit-script y, por lo tanto, cada repositorio puede mantener su propio Script de commit de comandos personalizado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top