Como usar o svnlook no svn para pesquisar itens alterados
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
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.