2011-10-21 5 views
3

J'essaie de modifier this Mercurial extension pour inviter l'utilisateur à ajouter un numéro de dossier FogBugz à son message de validation. Idéalement, j'aimerais que l'utilisateur tape simplement un nombre après avoir été invité et qu'il l'ajoute automatiquement au message de validation.Comment puis-je définir ou modifier le message de validation à partir d'une extension Mercurial?

Voici ce que j'ai jusqu'à présent:

def pretxncommit(ui, repo, **kwargs): 
    tip = repo.changectx(repo.changelog.tip()) 
    if not RE_CASE.search(tip.description()) and len(tip.parents()) < 2: 
     casenumResponse = ui.prompt('*** Please specify a case number, x to abort, or hit enter to ignore:', '') 
     casenum = RE_CASENUM.search(casenumResponse)   
     if casenum: 
      # this doesn't work! 
      # tip.description(tip.description() + ' (Case ' + casenum.group(0) + ')') 
      return True 
     elif (casenumResponse == 'x'): 
      ui.warn('*** User aborted\n') 
      return True 
     return True 
    return False 

Ce que je ne l'ai pas pu trouver est un moyen de modifier le message de commit. tip.description semble être en lecture seule, et je n'ai rien vu dans la documentation ou les exemples qui me permettraient de le modifier. Les seules références que j'ai vues à l'édition de messages de commit concernent les correctifs et l'extension Mq, et cela ne semble pas être utile ici.

Des idées sur la façon dont je pourrais définir le message de validation?

Répondre

6

Je n'ai pas fini par trouver un moyen d'utiliser un crochet, mais j'ai été capable de le faire en utilisant extensions.wrapcommand et en modifiant les options.

J'ai inclus ici la source de l'extension résultante.

Lors de la détection de l'absence d'un cas dans le message de validation, ma version invite l'utilisateur à entrer un, ignorer l'avertissement ou abandonner la validation.

Si l'utilisateur répond à l'invite en spécifiant un numéro de dossier, il est ajouté au message de validation existant.

Si l'utilisateur répond par 'x', la validation est annulée et les modifications restent en attente.

Si la réponse de l'utilisateur en appuyant simplement sur Entrée, la validation se poursuit avec le message de validation sans casse d'origine.

J'ai également ajouté l'option nofb, qui ignore l'invite si un utilisateur effectue délibérément un commit sans numéro de dossier.

Voici l'extension:

"""fogbugzreminder 

Reminds the user to include a FogBugz case reference in their commit message if none is specified 
""" 

from mercurial import commands, extensions 
import re 

RE_CASE = re.compile(r'(case):?\s*\d+', re.IGNORECASE) 
RE_CASENUM = re.compile(r'\d+', re.IGNORECASE) 

def commit(originalcommit, ui, repo, **opts): 

    haschange = False 
    for changetype in repo.status(): 
     if len(changetype) > 0: 
      haschange = True 

    if not haschange and ui.config('ui', 'commitsubrepos', default=True): 
     ctx = repo['.'] 
     for subpath in sorted(ctx.substate): 
      subrepo = ctx.sub(subpath) 
      if subrepo.dirty(): haschange = True 

    if haschange and not opts["nofb"] and not RE_CASE.search(opts["message"]): 

     casenumResponse = ui.prompt('*** Please specify a case number, x to abort, or hit enter to ignore:', '') 
     casenum = RE_CASENUM.search(casenumResponse)   

     if casenum:   
      opts["message"] += ' (Case ' + casenum.group(0) + ')' 
      print '*** Continuing with updated commit message: ' + opts["message"]   
     elif (casenumResponse == 'x'): 
      ui.warn('*** User aborted\n') 
      return False  

    return originalcommit(ui, repo, **opts) 

def uisetup(ui):  
    entry = extensions.wrapcommand(commands.table, "commit", commit) 
    entry[1].append(('', 'nofb', None, ('suppress the fogbugzreminder warning if no case number is present in the commit message'))) 

Pour utiliser cette extension, copiez la source dans un fichier nommé fogbugzreminder.py. Ensuite, dans votre fichier Mercurial.ini (ou hgrc, quelle que soit votre préférence), ajoutez la ligne suivante à la section [extensions]:

fogbugzreminder=[path to the fogbugzreminder.py file] 
0

Vous ne pouvez pas modifier un message de validation sans modifier l'ensemble de modifications.

Je suggère de regarder dans un crochet précommit qui refuse de commettre si un bugid est omis.

+0

j'ai pu accomplir ce que je avais besoin à l'aide extensions.wrapcommand. Regarde ma réponse :) –

Questions connexes