Pergunta

Na minha svn Pré cometer ganchos eu uso findstr para bloquear certos tipos de arquivo beign cometido. Agora eu quero estender isso para diretórios, em primeira instância \ obj \ diretórios no entanto eu estou tendo problemas com a expressão regular e escapando a \ do dir

Atualmente tenho

"C:\Program Files\VisualSVN Server\bin\svnlook.exe" changed -t %2 %1 | FindStr /R ".obj\\\"
IF %ERRORLEVEL% EQU 1 GOTO OK
echo "obj directories cannot be committed" >&2
exit 1
:OK
exit 0

Eu tentei com apenas \ no final, mas que parece escapar as aspas duplas bem?

Alguma idéia?

Foi útil?

Solução 4

Eu resolvi isso usando o seguinte.

:CHECKOBJDIRWITHFILES
"C:\Program Files\VisualSVN Server\bin\svnlook.exe" changed -t %2 %1  > "C:\Repositories\SoftwareRepository\hooks\out.txt"
"C:\Program Files\VisualSVN Server\bin\svnlook.exe" changed -t %2 %1 | FindStr /R ./obj/.
echo %ERRORLEVEL% > "C:\Repositories\SoftwareRepository\hooks\error.txt"
IF %ERRORLEVEL% EQU 1 GOTO CHECKOBJDIRWITHOUTFILES
echo "obj directories and their files cannot be committed" >&2
exit 1
:CHECKOBJDIRWITHOUTFILES
"C:\Program Files\VisualSVN Server\bin\svnlook.exe" changed -t %2 %1  > "C:\Repositories\SoftwareRepository\hooks\out.txt"
"C:\Program Files\VisualSVN Server\bin\svnlook.exe" changed -t %2 %1 | FindStr /R ./obj
echo %ERRORLEVEL% > "C:\Repositories\SoftwareRepository\hooks\error.txt"
IF %ERRORLEVEL% EQU 1 GOTO OK
echo "obj directories cannot be committed" >&2
exit 1
:OK
echo %ERRORLEVEL%  >&2
exit 0

Outras dicas

Empiricamente, um dos seguintes comandos faz o que quiser:

... | findstr /R \.obj\\

... | findstr /R "\.obj\\\\"

Uma vez que você especificou /R, você também precisa de um barra invertida antes do . porque, caso contrário, ser interpretado como um carácter universal.

Nota lateral: parece de meus testes que usos Findstr.exe as regras citando um pouco estranhas utilizadas por biblioteca C do MS, descrito em da Microsoft site . Neste caso específico, a regra em questão é a mencionar que um caractere de aspas duplas precedido por um número par de barras invertidas é interpretado como metade do número de barras invertidas. (Sim, é estranho, e fica mais estranho quando você percebe que cmd.exe trata caracteres de aspas duplas especialmente também ... Citando as coisas corretamente no Windows é um mundo de dor, francamente.)

Em um regexp, barra invertida devem ser dupla escapou de ser correctamente interpretada de regex Cadeia:

FindStr /R "\\.obj\\\\"

Mas no seu caso, uma vez que seu regex deve corresponder ambos os arquivos e diretórios .obj "obj", gostaria de sugerir:

FindStr /R "\\.?obj\\\\?"

porque seu regex orignal ( ".obj\\") apenas teria detectado ".obj" diretório, não "obj". Daí a '?'

Uma vez que ''. meios qualquer personagem, você também precisa "\\" antes de mudar a sua interpretação.

O que é o erro que você está recebendo?

Este pode ser um arenque vermelho, mas SVN usa / como o seperator caminho, o que faz com que alguns problemas no Windows. Eu tive que colocar o seguinte em todos os meus scripts de gancho para a mudança / para \:

SET REPOS=%1

:: Transform forward-slashes to back-slashes for Windows
SET REPOS=%REPOS:/=^\%

Você realmente precisa de uma expressão regular neste caso? Se você está apenas procurando o substring "\ obj \" você pode usar / C, em vez de / R para tratar o texto como uma string literal jogo:

{command} | findstr /C:\obj\
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top