O que é um gancho de alteração pré-revisão no SVN e como criá-lo?

168

Eu queria editar um comentário de log no navegador do repositório e recebi uma mensagem de erro informando que não existe um gancho de alteração pré-revprop para o repositório. Além de ter um nome assustador, o que é um gancho de mudança pré-revisão e como criá-lo?

Manu
fonte
16
este link é o segundo, logo após um link para esta pergunta :)
Ulysses
O link sobre leva ao SVNBook MUITO desatualizado 1.0. O atual é 1.7 e 1.8 (noturno): svnbook.red-bean.com/en/1.8
bahrep

Respostas:

52

Basicamente, é um script que é iniciado antes que a propriedade não versionada seja modificada no repositório, para que você possa gerenciar com mais precisão o que está acontecendo no seu repositório.

Existem modelos na distribuição do SVN para diferentes ganchos, localizados no subdiretório / hooks (* .tmpl que você precisa editar e renomear, dependendo do sistema operacional, para ativar).

PW.
fonte
2
Todas as instruções estão no script do modelo de gancho. Se você precisar do gancho para um svnsyncespelho, o script padrão precisará ser alterado, pois permite apenas alterações no svn: log. O Svnsync muda mais do que isso, então simplesmente coloquei um exit 0lá para permitir todas as alterações de propriedade (já que isso é um espelho apenas para mim).
Matt Connolly
... salve- pre-revprop-changeo no mesmo diretório e torne-o executável para o usuário do servidor da web (no Linux).
Mateng 31/08/2012
209

Para Windows, aqui está um link para um arquivo em lotes de exemplo que permite apenas alterações na mensagem de log (não em outras propriedades):

http://ayria.livejournal.com/33438.html

Basicamente, copie o código abaixo em um arquivo de texto e nomeie-o pre-revprop-change.bate salve-o no \hookssubdiretório do seu repositório.

@ECHO OFF
:: Set all parameters. Even though most are not used, in case you want to add
:: changes that allow, for example, editing of the author or addition of log messages.
set repository=%1
set revision=%2
set userName=%3
set propertyName=%4
set action=%5

:: Only allow the log message to be changed, but not author, etc.
if /I not "%propertyName%" == "svn:log" goto ERROR_PROPNAME

:: Only allow modification of a log message, not addition or deletion.
if /I not "%action%" == "M" goto ERROR_ACTION

:: Make sure that the new svn:log message is not empty.
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
set bIsEmpty=false
)
if "%bIsEmpty%" == "true" goto ERROR_EMPTY

goto :eof

:ERROR_EMPTY
echo Empty svn:log messages are not allowed. >&2
goto ERROR_EXIT

:ERROR_PROPNAME
echo Only changes to svn:log messages are allowed. >&2
goto ERROR_EXIT

:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1
patmortech
fonte
37
Poderia ter vinculado à versão lá stackoverflow.com/questions/6155/… . Eu escrevi esse gancho e publiquei no fórum SVN há um tempo atrás. Acho que deveria ter colocado alguns créditos nos comentários do gancho.
Philibert Perusse
1
Estou usando esse script com o VisualSVN 2.0.8 e o TortoiseSVN 1.6.11 e funciona muito bem.
precisa saber é o seguinte
27
Você pode editar ganchos no VisualSVN clicando com o botão direito do mouse no nome do seu repositório no VisualSVN Server e selecionando "Propriedades ...". Você verá uma guia "Ganchos". Lá você verá os diferentes tipos de ganchos disponíveis. Selecione o caminho certo, clique em "Editar" e cole o código acima nele. Espero que ajude os usuários do VisualSVN!
Chuck Le Butt
Trabalhou para mim desabilitando a linha: se / eu não "% action%" == "M" foi para ERROR_ACTION. Por outro lado, continuava dizendo apenas modificações permitidas.
Nathan
6
Método rápido e sujo para Windows é criar um arquivo vazio chamado ganchos \ pré-revprop-change.bat
Ben Claar
18

Para o Linux permitir a edição de um comentário de log,

  • localize o arquivo pre-revprop-change.tmplno hooksdiretório do seu repositório
  • copie o arquivo para o mesmo diretório, renomeando-o para pre-revprop-change
  • conceda permissão de execução ao arquivo (para o usuário do servidor, por exemplo www-data)

Editado: (graças a lindes)

  • depois disso, talvez você precise editar o script para retornar um valor de saída 0para o tipo de edições que deseja permitir.
Alois Heimer
fonte
Isso é insuficiente ... ainda é necessário alterar os valores de saída adequadamente. Mas achei útil de qualquer maneira, como um ponteiro para o lugar certo para procurar ... no qual algumas das outras respostas estavam faltando, ou dando respostas específicas para janelas. Então, obrigado por isso.
Lindes
1
Tenho certeza de que, na minha versão do Ubuntu Linux, copiar e dar permissão foi suficiente. Mas não tenho mais certeza. Eu editei a resposta de acordo. Obrigado.
Alois Heimer
Bem, tenho certeza de que não funcionou para mim como quando o testei há 2 dias e adicionei este comentário. Com a edição, porém, esta resposta funciona para mim.
Lindes
11

Aqui está o link para a pergunta de estouro de pilha com muitos ganchos comuns Tipos comuns de ganchos de subversão , incluindo a fonte original do pre-revprop-changegancho para Windows postada aqui.

Você deve consultar lá, pois eles podem melhorar com o tempo.

Philibert Perusse
fonte
7

Obrigado #patmortech

E adicionei seu código que "apenas o mesmo usuário pode alterar o código".

:: Only allow editing of the same user.
for /f "tokens=*" %%a in ( 
'"%VISUALSVN_SERVER%\bin\svnlook.exe" author -r %revision% %repository%') do ( 
set orgAuthor=%%a
)
if /I not "%userName%" == "%orgAuthor%" goto ERROR_SAME_USER
yasin
fonte
4

O nome do script de gancho não é tão assustador se você conseguir decifrá-lo: é um gancho de alteração de propriedade antes da revisão . Em resumo, o objetivo do pre-revprop-changescript hook é controlar as alterações das propriedades não revisadas (de revisão) e enviar notificações (por exemplo, enviar um email quando a propriedade de revisão for alterada).

Existem 2 tipos de propriedades no Subversion:

  • propriedades com versão (por exemplo, svn:needs-locke svn:mime-type) que podem ser definidas em arquivos e diretórios,
  • propriedades não revisadas (revisão) (por exemplo, svn:loge svn:date) que são definidas nas revisões do repositório .

As propriedades com versão têm histórico e podem ser manipuladas por usuários comuns que têm acesso de leitura / gravação a um repositório. Por outro lado, propriedades não versionadas não têm histórico e servem principalmente para fins de manutenção. Por exemplo, se você confirmar uma revisão, ela será svn:daterecebida imediatamente com a hora UTC de sua confirmação, svn:authorcom seu nome de usuário e svn:logcom sua mensagem de log de confirmação (se você especificou alguma).

Como já especifiquei, o objetivo do pre-revprop-changescript hook é controlar as alterações nas propriedades da revisão. Você não deseja que todos os que têm acesso a um repositório possam modificar todas as propriedades de revisão, portanto, alterar as propriedades de revisão é proibido por padrão. Para permitir que os usuários alterem propriedades, é necessário criar um pre-revprop-changegancho.

O gancho mais simples podem conter apenas uma linha: exit 0. Isso permitirá que qualquer usuário autenticado altere qualquer propriedade de revisão e não deve ser usado em ambiente real. No Windows, você pode usar script em lote ou script baseado no PowerShell para implementar alguma lógica dentro do pre-revprop-changegancho.

Esse script do PowerShell permite alterar svn:logapenas a propriedade e nega mensagens de log vazias.

# Store hook arguments into variables with mnemonic names
$repos    = $args[0]
$rev      = $args[1]
$user     = $args[2]
$propname = $args[3]
$action   = $args[4]

# Only allow changes to svn:log. The author, date and other revision
# properties cannot be changed
if ($propname -ne "svn:log")
{
  [Console]::Error.WriteLine("Only changes to 'svn:log' revision properties are allowed.")
  exit 1
}

# Only allow modifications to svn:log (no addition/overwrite or deletion)
if ($action -ne "M")
{
  [Console]::Error.WriteLine("Only modifications to 'svn:log' revision properties are allowed.")
  exit 2
}

# Read from the standard input while the first non-white-space characters
$datalines = ($input | where {$_.trim() -ne ""})
if ($datalines.length -lt 25)
{
  # Log message is empty. Show the error.
  [Console]::Error.WriteLine("Empty 'svn:log' properties are not allowed.")
  exit 3
}

exit 0

Esse script em lote permite que apenas o usuário "svnmgr" altere as propriedades da revisão:

IF "%3" == "svnmgr" (goto :label1) else (echo "Only the svnmgr user may change revision properties" >&2 )

exit 1
goto :eof

:label1
exit 0
bahrep
fonte
2

Para usuários de PC: A extensão .bat não funcionou para mim quando usada no processamento do Windows Server. Usei o VisualSvn como Django Reinhardt sugeriu, e ele criou um gancho com uma extensão .cmd.

noti
fonte
0
  1. Vá para o diretório de repositório SVN na subpasta "hooks", por exemplo, "D: \ SVN \ hooks \"
  2. crie o arquivo vazio "pre-revprop-change.bat" lá
  3. no arquivo, escreva "exit 0" (sem "") e salve-o
  4. desfrutar :)

(Essa solução certamente tem desvantagens, pois nada é verificado / proibido. Mas, para o meu caso - um repositório local que apenas estou usando - parece funcionar.)

Janis
fonte