Gancho pós-commit de multi checkout do Subversion?

Gancho pós-commit de multi checkout do Subversion?

O título deve parecer estranho, mas estou tentando conseguir o seguinte:

Localização do repositório SVN: /home/flx/svn/flxdev Estrutura "flxdev" do repositório SVN:

 + Project1
 ++ files
 + Project2
 + Project3
 + Project4

Estou tentando configurar um gancho pós-commit que faz check-out automaticamente do outro lado quando faço um commit.

O documento pós-commit lista explicitamente o seguinte:

# POST-COMMIT HOOK
#
# The post-commit hook is invoked after a commit.  Subversion runs
# this hook by invoking a program (script, executable, binary, etc.)
# named 'post-commit' (for which this file is a template) with the
# following ordered arguments:
#
#   [1] REPOS-PATH   (the path to this repository)
#   [2] REV          (the number of the revision just committed)

Então fiz o seguinte comando para testar:

REPOS="$1"
REV="$2"
echo "Updated project $REPOS to $REV"

No entanto, quando edito arquivos no Projeto1, por exemplo, isso gera"Projeto atualizado /home/flx/svn/flxdev para 1016"

Eu gostaria que isso fosse:"Projeto atualizado Project1 para 1016"

Ter essa variável me permite especificar diferentes ações por projeto pós-confirmação. Como posso especificar o parâmetro do projeto?

Obrigado!

Denis

Responder1

O seguinte pode fazer o que você deseja:

#!/bin/bash

REPOS="$1"
REV="$2"

echo In revision $REV, the following projects were changed:
svnlook dirs-changed "$REPOS" --revision "$REV" \ 
    | sed 's%/.*%%' \
    | sort -u \
    | while read PROJ ; do
          echo "$PROJ"
      done

Uma explicação do que está acontecendo, caso você não esteja muito familiarizado com scripts de shell:

  • usamos svnlookpara obter a lista de diretórios que foram alterados
  • usamos sedpara cortar o primeiro " /" e tudo depois dele - então temos uma lista de nomes de projetos, possivelmente com duplicatas.
  • usamos sort -u("classificar exclusivo") para eliminar duplicatas
  • um por um, lemos cada nome em $PROJ e fazemos algo com ele.

Você pode substituir a echo "$PROJ"linha pelo que quiser fazer com o nome do projeto. Se vários projetos foram alterados no mesmo commit, tudo o que você colocar lá será executado uma vez para cada projeto alterado, com $PROJ definido apropriadamente.

Este script não mostrará se os arquivos foram adicionados à raiz do repositório, mas se foram adicionados diretórios, eles aparecerão na lista de projetos modificados. Se você quiser que a raiz também seja listada, você pode substituir a seguinte linha sed e ela aparecerá como "/". Se você fizer isso, tome cuidado para não verificar todo o repositório por acidente!

...
    | sed '/^\/$/!s%/.*%%' \
...

informação relacionada