2011-07-06 9 views
5

Necesito un gancho simple para mercurial que comprueba el comentario de compromiso utilizando el patrón. Aquí está mi gancho:¿Cómo se muestra la salida del gancho en la ventana de registro de Tortoise Hg?

#!/usr/bin/env python 
# 
# save as .hg/check_whitespace.py and make executable 

import re 

def check_comment(comment): 
    # 
    print 'Checking comment...' 
    pattern = '^((Issue \d+:)|(No Issue:)).+' 
    if re.match(pattern, comment, flags=re.IGNORECASE): 
     return 1 
    else: 
     print >> sys.stderr, 'Comment does not match pattern. You must start it with "Issue 12323:" or "No Issue:"' 
     return 0 

if __name__ == '__main__': 
    import os, sys 
    comment=os.popen('hg tip --template "{desc}"').read() 
    if not check_comment(comment): 
     sys.exit(1) 
sys.exit(0) 

Funciona. Incluso muestra el mensaje de error 'Comment does not match pattern. You must start it with "Issue 12323:" or "No Issue:"' cuando confirmo desde la consola. Pero cuando intento comprometerme desde Tortoise Hg Workbench, solo se muestra el mensaje del sistema: abort: pretxncommit.check_comment hook exited with status 1.

Necesito informar al usuario de lo que está mal. ¿Hay alguna manera de forzar a Tortoise Hg a mostrar la salida del anzuelo?

+0

Solo supongo, pero ¿ha intentado escribir en sys.out en lugar de sys.err? – bbaja42

+0

Sí. No ayudó. –

Respuesta

5

Lo hice funcionar haciéndolo gancho en proceso en lugar de un gancho externo. En el proceso hooks se definen de manera bastante diferente, sin embargo.

En primer lugar, el archivo python solo necesita una única función que el nombre llamará en la definición del enlace. La función de enlace se pasa a los objetos ui, repo y hooktype. También se pasan objetos adicionales en función del tipo de gancho. Para pretrxncommit, se aprobó node, parent1 y parent2, pero solo está interesado en el nodo, por lo que el resto se recopila en kwargs. El objeto ui se usa para proporcionar el estado y los mensajes de error.

Contenido de check_comment.py:

#!/usr/bin/env python 

import re 

def check_comment(ui, repo, hooktype, node=None, **kwargs): 
    ui.status('Checking comment...\n') 
    comment = repo[node].description() 
    pattern = '^((Issue \d+:)|(No Issue:)).+' 
    if not re.match(pattern, comment, flags=re.IGNORECASE): 
     ui.warn('Comment does not match pattern. You must start it with "Issue 12323:" or "No Issue:"\n') 
     return True 

En el hgrc, el gancho se definen con python:/path/to/file.py:function_name, como este:

[hooks] 
pretxncommit.check_comment = python:/path/to/check_comment.py:check_comment 

El .suffix_name en pretxncommit es evitar anulando cualquier gancho definido a nivel mundial, especialmente si esto está definido en el repositorio hgrc en lugar del global. Los sufijos son cómo uno permite respuestas múltiples al mismo gancho.

0

En caso de que el gancho se ejecute en un repositorio que se sirve a través, p. hgserve:
utilizo esta función Python pequeña en un script pretxnchangegroup para mostrar la misma salida

  • en el registro del servidor
  • en la sartén banco de trabajo de registro TortoiseHg o la línea cmd

:

def log(ui, string): 
    print(string) # will show up as "remote:" on the client 
    ui.status("{0}\n".format(string)) # will show up in the same hg process: hgserve ; append newline 
    return 
Cuestiones relacionadas