Pregunta

En mis ganchos de confirmación previa de svn, uso findtr para bloquear la confirmación de ciertos tipos de archivos.Ahora quiero extender esto a los directorios, en primera instancia los directorios \obj\ sin embargo, tengo problemas con la expresión regular y escapo del \ del directorio.

Actualmente tengo

"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

Lo he intentado con solo \ al final, pero eso también parece escapar de las comillas dobles.

¿Algunas ideas?

¿Fue útil?

Solución 4

He resuelto esto usando la siguiente.

: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

Otros consejos

Empíricamente, cualquiera de los siguientes comandos hace lo que quieres:

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

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

Desde que especificaste /R, también necesita una barra invertida antes del . porque de lo contrario se interpretará como un carácter comodín.

Nota al margen:De mis pruebas se desprende que findstr.exe usa las reglas de cotización algo extrañas utilizadas por la biblioteca C de MS, descritas en sitio web de microsoft.En este caso particular, la regla relevante es la que menciona que un carácter de comillas dobles precedido por un número par de barras invertidas se interpreta como la mitad de barras invertidas.(Sí, es extraño, y se vuelve aún más extraño cuando te das cuenta de que cmd.exe también trata especialmente los caracteres entre comillas dobles...Francamente, citar cosas correctamente en Windows es un verdadero dolor de cabeza).

En una expresión regular, la barra invertida debe ser el doble escapó a ser interpretado correctamente en una expresión regular de la secuencia:

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

Sin embargo, en su caso, ya que su expresión regular debe coincidir ambos archivos y directorios ".obj obj", sugeriría:

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

debido a que su expresión regular orignal ( ".obj\\") sólo se habría detectado directorio ".obj", no "obj". Por lo tanto el '?'

Desde '' significa cualquier carácter, también es necesario "\\" antes de que cambie su interpretación.

¿Qué es el error que está recibiendo?

Esto puede ser una pista falsa, pero SVN utiliza / como separador de ruta, lo que provoca algunos problemas en Windows. Tenía que poner el siguiente en todos mis scripts gancho para cambiar / a \:

SET REPOS=%1

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

¿Usted realmente necesita una expresión regular en este caso? Si sólo está buscando la subcadena "\ obj \" se puede usar / C en lugar de / R para tratar el texto como una cadena de coincidencia literal:

{command} | findstr /C:\obj\
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top