2010-10-18 12 views
8

¿Cómo puedo configurar un servidor Mercurial para restringir confirmaciones a una rama con nombre una vez que se ha cerrado? Solo quiero que el administrador del repositorio tenga la capacidad de volver a abrir la sucursal.Evitar el envío de confirmaciones que se agregan a las ramas cerradas

https://www.mercurial-scm.org/wiki/PruningDeadBranches dice que los conjuntos de cambios cerrados se pueden identificar por "close = 1 en el campo adicional del conjunto de cambios". No está claro cómo leer el campo adicional de un conjunto de cambios con el Mercurial API.

+0

¡Maldición! Debería ser más fácil evitar que las personas se comprometan accidentalmente con ramas cerradas. – Rory

+2

Todo el mundo dice "comprometerse" pero te refieres a "empujar". Nunca evitarás un committer determinado, solo rechazas su push. –

Respuesta

7

Hay una extensión de ACL que se distribuye junto con Mercurial. Debería poder especificar las ramas congeladas al denegar el compromiso a todos excepto al administrador. No estoy seguro de si las sucursales con nombre pueden aprovechar esta instalación.

ACL Configuración:

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

[acl.allow.branches] 
branch_name = admin 
4

Un servidor no puede restringir confirmaciones, pero puede negarse a aceptar empujones que infringen las restricciones. Aquí está un gancho que puede poner en un servidor de rechazar cualquier empujones que tienen alguna conjuntos de cambios que están en una rama cerrada:

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

Se podría instalar ese gancho de la siguiente manera:

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

Hay casi seguro una forma de hacerlo utilizando anzuelos in-python con la API a la que hizo referencia, pero los anzuelos de shell funcionan bastante bien también.

+0

Aunque no puedo restar importancia a esta respuesta, debe tenerse en cuenta que esto no funciona porque $ HG_NODE no está disponible para prechangegroup. Tampoco funciona la corrección del enlace a pretxnchangegroup, porque entonces el cambio para si la rama está cerrada ya no funciona, ya que pretxnchangegroup agrega provisionalmente los conjuntos de cambios y, como tal, la rama ya se volvió a abrir. Preferiría escribir un anzuelo pero todavía me pregunto cómo hacerlo para el propósito específico que se discute aquí. –

+0

Tengo este trabajo para trabajar. Lo que puede hacer es usar el enlace pretxnchangegroup y usar un script similar al mencionado anteriormente que comprueba cada nodo en $ HG_NODE: indique si uno de sus padres tiene "close = 1" en sus campos adicionales. Puede usar hg log -r $ parentNode --template '{extras}' | grep -q "cerrar = 1" para hacer el último control. –

1

Aquí hay un gancho durante el proceso que debería rechazar conjuntos de cambios adicionales en una rama cerrada.

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 

El gancho se puede ejecutar en el modo de pretxncommit (comprobado durante un local de cometer transacción) o el modo de pretxnchangegroup (comprobado cuando changesets añadidos desde repo externa) con las siguientes entradas 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 

No estoy seguro si este gancho funcionará con versiones Mercurial anteriores a la 2.2.

Cuestiones relacionadas