2010-10-18 2 views
8

Wie kann ich einen Mercurial-Server so konfigurieren, dass Commits auf einen benannten Zweig beschränkt werden, nachdem er geschlossen wurde? Ich möchte nur, dass der Repository-Administrator die Zweigstelle erneut öffnen kann.Pushen von Commits verhindern, die zu geschlossenen Zweigen hinzugefügt werden

https://www.mercurial-scm.org/wiki/PruningDeadBranches besagt, dass geschlossene Changesets durch "close = 1 im zusätzlichen Feld des Changesets" identifiziert werden können. Es ist nicht klar, wie das zusätzliche Feld eines Änderungssets unter Verwendung der Mercurial API gelesen wird.

+0

Verdammt richtig! Es sollte einfacher sein, Menschen daran zu hindern, sich versehentlich in geschlossene Zweige zu begeben. – Rory

+2

Jeder sagt immer "committing", aber du meinst "pushing". Du wirst niemals einen entschlossenen Committer verhindern, du lehnst einfach ihren Push ab. –

Antwort

7

Es gibt eine ACL-Erweiterung, die zusammen mit Mercurial vertrieben wird. Sie sollten in der Lage sein, die eingefrorenen Verzweigungen anzugeben, indem Sie jedem außer dem Administrator das Commit verweigern. Ich bin mir nicht sicher, ob benannte Branchen diese Möglichkeit nutzen können.

konfigurieren acls:

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

[acl.allow.branches] 
branch_name = admin 
4

Ein Server Commits nicht beschränken kann, aber es kann sich weigern Schübe zu akzeptieren, die Einschränkungen verletzen. Hier ist ein Haken Sie auf einem Server keine Schübe ablehnen setzen können, die keine Differenzmengen haben, die auf einem geschlossenen Zweig sind:

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

Sie würden, dass die Haken wie folgt installieren:

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

ist es fast sicher Eine Möglichkeit, dies mit Hilfe von In-Python-Hooks mit der von Ihnen referenzierten API zu tun, aber Shell-Hooks funktionieren auch ziemlich gut.

+0

Obwohl ich diese Antwort nicht ablehnen kann, sollte beachtet werden, dass dies nicht funktioniert, da $ HG_NODE nicht für die prechangegroup verfügbar ist. Das Fixieren des Hooks an pretxnchangegroup funktioniert leider auch nicht, weil dann die Änderung, ob die Verzweigung geschlossen ist oder nicht, nicht mehr funktioniert, da pretxnchangegroup die Änderungsmengen vorläufig hinzufügt und die Verzweigung daher bereits wieder geöffnet wird. Ich würde es vorziehen, einen Shell-Haken zu schreiben, aber ich frage mich immer noch, wie ich das für den hier beschriebenen Zweck tun soll. –

+0

Ich habe diese Arbeit zu arbeiten. Sie können den Haken pretxnchangegroup verwenden und ein Skript ähnlich dem oben aufgeführten verwenden, das für jeden Knoten in $ HG_NODE: tip überprüft, ob einer seiner Eltern in seinen zusätzlichen Feldern "close = 1" hat. Sie können hg log -r $ parentNode --template '{extras}' | verwenden grep -q "close = 1", um die letzte Prüfung durchzuführen. –

1

Hier ist ein In-Process-Hook, der zusätzliche Changesets in einem geschlossenen Zweig ablehnen sollte.

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 

Der Haken in pretxncommit Modus ausgeführt werden kann (bei einem lokalen Commit-Transaktion überprüft) oder pretxnchangegroup Modus (aktiviert, wenn Differenzmengen aus anderen Repo hinzugefügt) mit folgenden hgrc Einträgen:

[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 

Nicht sicher, ob Dieser Hook funktioniert mit Mercurial-Versionen vor Version 2.2.