2010-10-18 7 views
8

Come posso configurare un server Mercurial per limitare i commit a un ramo denominato una volta che è stato chiuso? Voglio solo che l'amministratore del repository abbia la possibilità di riaprire il ramo.Impedire l'invio di commit che si aggiungono ai rami chiusi

https://www.mercurial-scm.org/wiki/PruningDeadBranches afferma che i changeset chiusi possono essere identificati da "close = 1 nel campo extra del changeset". Non è chiaro come leggere il campo extra di un changeset usando lo Mercurial API.

+0

Accidenti! Dovrebbe essere più facile fermare le persone che si impegnano accidentalmente in rami chiusi. – Rory

+2

Tutti continuano a dire "commettere" ma intendi "spingere". Non impedirai mai un determinato committer, semplicemente rifiuterai la loro spinta. –

risposta

7

C'è un'estensione ACL che è distribuita insieme a Mercurial. Dovresti essere in grado di specificare i rami congelati negando il commit a tutti tranne l'amministratore. Non sono sicuro che le filiali nominate possano sfruttare questa struttura.

ACL Configurazione:

[acl.deny.branches] 
frozen-branch = * 

[acl.allow.branches] 
branch_name = admin 
4

Un server non può limitare commit, ma può rifiutare di accettare spinte che violano i vincoli. Ecco un gancio si può mettere su un server di rifiutare qualsiasi spinte che hanno alcuna di modifiche che si trovano su un ramo chiuso:

#!/bin/sh 
for thenode in $(hg log -r $HG_NODE:tip --template '{node}\n') ; do 
    if hg branches --closed | grep -q "^$(hg id --branch -r $thenode).*\(closed\)" ; then 
      echo Commits to closed branches are not allowed -- bad changeset $thenode 
      exit 1 
    fi 
done 

Faresti installare quel gancio in questo modo:

[hooks] 
prechangegroup = /path/to/that.sh 

C'è quasi certamente un modo per farlo usando gli hook in-python con l'API a cui si fa riferimento, ma anche gli hook shell funzionano abbastanza bene.

+0

Anche se non posso downvotare questa risposta, va notato che questo non funziona perché $ HG_NODE non è disponibile per prechangegroup. Sfortunatamente, la correzione dell'hook a pretxnchangegroup non funziona, perché la modifica per il fatto che il ramo sia chiuso o meno non funziona più, poiché pretxnchangegroup aggiunge provvisoriamente i changeset e, di conseguenza, il ramo è già stato riaperto. Preferirei scrivere un hook shell, ma mi chiedo ancora come farlo per lo scopo specifico discusso qui. –

+0

Ho fatto funzionare questo lavoro. Quello che puoi fare è usare l'hook pretxnchangegroup e usare uno script simile a quello sopra elencato che controlla ogni nodo in $ HG_NODE: suggerisci se uno dei suoi genitori ha "close = 1" nei suoi campi extra. Puoi usare hg log -r $ parentNode --template '{extras}' | grep -q "close = 1" per fare il secondo controllo. –

1

Ecco un hook in-process che dovrebbe rifiutare ulteriori changeset su un ramo chiuso.

from mercurial import context, ui 
def run(ui, repo, node, **kwargs): 
    ctx = repo[node] 
    for rev in xrange(ctx.rev(), len(repo)): 
     ctx = context.changectx(repo, rev) 
     parent1 = ctx.parents()[0] 
     if parent1 != None and parent1.extra().get('close'): 
      ui.warn("Commit to closed branch is forbidden!\n") 
      return True 
    return False 

Il gancio può essere eseguito in modalità pretxncommit (controllato durante un locale commit transazione) o in modalità pretxnchangegroup (controllato quando changeset aggiunti da repo esterno) con le seguenti voci hgrc:

[hooks] 
pretxncommit.forbid_commit_closed_branch = python:/path/to/forbid_commit_closed_branch.py:run 
pretxnchangegroup.forbid_commit_closed_branch = python:/path/to/forbid_commit_closed_branch.py:run 

Non so se questo hook funzionerà con le versioni Mercurial precedenti alla 2.2.

Problemi correlati