2010-10-18 8 views
8

Comment puis-je configurer un serveur Mercurial pour limiter les validations à une branche nommée lorsqu'elle a été fermée? Je veux seulement que l'administrateur du référentiel ait la possibilité de rouvrir la branche.Empêche le push des validations qui s'ajoutent aux branches fermées

https://www.mercurial-scm.org/wiki/PruningDeadBranches indique que les changesets fermés peuvent être identifiés par "close = 1 dans le champ supplémentaire du changeset". Il n'est pas clair comment lire le champ supplémentaire d'un changeset en utilisant le Mercurial API.

+0

Bon sang! Il devrait être plus facile d'empêcher les gens de s'engager accidentellement dans des branches fermées. – Rory

+2

Tout le monde dit "commettre" mais vous voulez dire "pousser". Vous n'empêcherez jamais un committer déterminé, vous venez de rejeter leur poussée. –

Répondre

7

Il existe une extension ACL distribuée avec Mercurial. Vous devriez être en mesure de spécifier les branches gelées en refusant la validation à tous sauf à l'administrateur. Je ne suis pas certain que les succursales nommées puissent tirer parti de cette facilité.

acls Configuration:

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

[acl.allow.branches] 
branch_name = admin 
4

Un serveur ne peut pas restreindre commits, mais il peut refuser d'accepter les contraintes qui violent pousse. Voici un crochet que vous pouvez mettre sur un serveur pour rejeter les poussées qui ont des changesets qui sont sur une branche fermée:

#!/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 

Vous souhaitez installer ce crochet comme ceci:

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

Il y a certainement un moyen de le faire en utilisant des hooks in-python avec l'API que vous avez référencé, mais les hooks shell fonctionnent assez bien aussi.

+0

Bien que je ne puisse pas downvoter cette réponse, il convient de noter que cela ne fonctionne pas car $ HG_NODE n'est pas disponible pour prechangegroup. Malheureusement, la modification du hook sur pretxnchangegroup ne fonctionne pas, parce que le changement pour savoir si la branche est fermée ne fonctionne plus car pretxnchangegroup ajoute provisoirement les changesets et ainsi la branche est déjà rouverte. Je préférerais écrire un crochet de coquille mais je me demande toujours comment faire ceci dans le but spécifique discuté ici. –

+0

J'ai eu ce travail à travailler. Ce que vous pouvez faire est d'utiliser le hook pretxnchangegroup et d'utiliser un script similaire à celui listé ci-dessus qui vérifie pour chaque nœud dans $ HG_NODE: tip si un de ses parents a "close = 1" dans ses champs supplémentaires. Vous pouvez utiliser hg log -r $ parentNode --template '{extras}' | grep -q "close = 1" pour faire ce dernier contrôle. –

1

Voici un hook en cours de traitement qui devrait rejeter des changesets supplémentaires sur une branche fermée.

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 

Le crochet peut fonctionner en mode pretxncommit (vérifié lors d'une validation de la transaction locale) ou le mode pretxnchangegroup (vérifié lorsque changesets ajoutée de repo externe) avec les entrées hgrc suivantes:

[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 

Je ne sais pas si ce crochet fonctionnera avec les versions de Mercurial antérieures à 2.2.