Pergunta

Você poderia me orientar sobre como svnlook está funcionando abaixo.Quero incluir isso em um gancho para evitar commits em uma tag em /tags:

$SVNLOOK changed -t "$TXN" "$REPOS" | grep "^U\W.*\/tags\/" && /bin/echo "Cannot commit to tags!" 1>&2 && exit 1
Foi útil?

Solução

Um gancho de pré-commit do Subversion permitirá que um commit seja realizado se retornar um código de saída de 0.Caso contrário, o gancho pré-commit será falhar e o commit não será processado.

O $SVNLOOK changed -t "$TXN" "$REPOS" mostrará as mudanças em $REPOS que aconteceu em $TXN.As variáveis ​​do shell devem ser definidas por você.Se você olhar para o pre-commit script que vem com o Subversion, você verá:

$TXN=$1
$REPO=$2

A saída do svnlook changed comando fica assim:

$ $SVNLOOK changed -t $TXN $REPOS
A   trunk/vendors/deli/
A   trunk/vendors/deli/chips.txt
A   trunk/vendors/deli/sandwich.txt
A   trunk/vendors/deli/pickle.txt
U   trunk/vendors/baker/bagel.txt
_U  trunk/vendors/baker/croissant.txt
UU  trunk/vendors/baker/pretzel.txt
D   trunk/vendors/baker/baguette.txt

A primeira coluna é se algo foi vocêpraticou, Add, ou Deleito.A segunda coluna refere-se aos atributos.

O resto é o nome do arquivo que sofreu ação.Você pode ver isso baguette.txt foi excluído e que uma propriedade em croissant.txt foi alterado, mas o arquivo em si não foi atualizado.

Digamos que alguém tentou alterar uma tag.A saída de svnlook changed ficará assim:

$SVNLOOK changed -t $TXN $REPOS
U   tags/4.2.1/vendors/baker/bagel.txt

O comando grep é este:

grep "^U\W.*\/tags\/" 

Isso está procurando uma linha que começa com ^U o que significa que foi uma atualização.Em seguida, ele procura uma string que comece com /tags.Hmmm...isso pode ser um problema.Não corresponde à saída do svnlook changed comando.

Talvez devesse ser:

grep -q "^U.[[\s+tags/"

Isso corresponderá a qualquer string que comece com U, possivelmente seguido por outro caractere, seguido por um espaço em branco e imediatamente a palavra tags/.

Você pode querer verificar essa expressão.

O && é um operador de lista.Se a expressão do lado esquerdo de && é executado com sucesso (ou seja,retorna um código de saída zero), a instrução do lado direito será executada.Caso contrário, a instrução à direita não será executada.

Assim, se o seu grep corresponde a um padrão que parece que alguém atualizou uma tag, será verdade.A afirmação do lado direito do && será executado.

Por isso,

/bin/echo "Cannot commit to tags!" 1>&2

será executado.Isso é enviado para STDERR, que será enviado ao cliente Subversion, mas somente se o código de saída do gancho de pré-confirmação for zero.

Assim, o próximo comando do operador de lista exit 1 será executado se o /bin/echo é bem sucedido.(Pode não ser, mas geralmente será).Com isso, o gancho pré-commit sai com um código de saída diferente de zero, o gancho falha e o Cannot commit to tags! será enviado ao cliente SVN para o usuário ver.

Não há absolutamente nenhuma razão no mundo para esta afirmação ser assim.Isso é quase equivalente e é mais fácil de entender:

if $SVNLOOK changed -t $TXN $REPOS | grep -q "^U.[[\s+tags/"
then
    /bin/echo "Cannot commit to tags!" 1>&2"
    exit 1
fi
exit 0

Afinal, você precisa colocar isso em um script de shell chamado pre-commit de qualquer maneira e tenha as variáveis ​​​​do shell $SVNLOOK, $REPOS, e $TXN definido de qualquer maneira.

A razão pela qual isso não é exatamente equivalente é que isso falhará no commit, mesmo que o /bin/echo falha.


Se você está procurando um gancho de pré-confirmação para controlar tags, você deve dar uma olhada em meu.Isso foi testado em centenas de sites e lhe dará muito mais controle sobre seu repositório e fará uma melhor verificação de erros.

Este gancho usa um arquivo de controle para controlar o acesso ao repositório.Por exemplo, você pode querer alterar as tags, se necessário.

[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/**
access = read-only
users = @ALL

[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/
access = add-only
users = @ALL

[file I can modify and delete tags]
file = /tags/**
access = read-write
users = jazzr

Dê uma olhada no gancho.Ele funciona com a instalação padrão do Perl 5.8.8 e superior.Não requer outros módulos.No entanto, se você usar LDAP ou Active Directory para controle de acesso Subversion, poderá instalar o Net::LDAP Módulo Perl e use grupos LDAP ou Active Directory em seu gancho de pré-confirmação para controle de acesso.

Outras dicas

$SVNLOOK changed -t "$TXN" "$REPOS" imprime todos os caminhos que foram alterados.Veja aqui mais informações sobre os parâmetros:http://svnbook.red-bean.com/en/1.7/svn.ref.svnlook.c.changed.html

Em seguida, a lista de caminhos alterados está sendo canalizada para o grep, que verifica se alguma coisa mudou que tenha "/tags/" no caminho, | grep "^U\W.*\/tags\/".

O && é um operador AND no shell.Se o comando grep encontrar uma correspondência, ele retornará o código de status 0, que neste caso é equivalente a "TRUE" e o comando após o && será executado, caso contrário, não será.

A parte depois do &&, /bin/echo "Cannot commit to tags!" 1>&2 executa o comando echo e grava a mensagem de 1 (saída padrão) para &2, que é o erro padrão.Se isso for bem-sucedido, o comando sai com um código de status 1 exit 1.Isso fará com que seu script de gancho retorne com um código de status diferente de zero e sua confirmação falhará ao retornar a mensagem "Não é possível confirmar com tags!" para o usuário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top