Intentando crear un gancho precompromiso que verifique los externos

Actualmente estoy intentando crear un enlace de precompromiso que evite que el usuario etiquete una versión de código con un código externo que no sean tags.

Solo estoy tratando de encontrar una forma de get los datos externos que se especifican en una transacción, pero no puedo entender cómo. El command svnlook no parece ser capaz de devolver nada que remotamente parezca una modificación externa. Y con el command svn, parece ser la transacción que no puedo especificar. No tengo idea de qué command usar en mi gancho precompromiso. Actualmente estoy en Windows pero haciendo un script de python para poder probar esto en nuestro server de Linux.

Lo que probé hasta ahora es el siguiente:

svnlook propget C:\TestReposLocal svn:externals <== Give me error something is missing svn propget svn:externals C:\Test <== Give me externals but I cant figure out how to get this from a transaction to place in a pre-commit hook. 

En mi repository (C: \ TestReposLocal) tengo uno externo que es el tronco de otro repository. Este repository se muestra con el command svn propget, pero necesito saber con la transacción actual en una confirmación previa si esta externa es algo más que una label.

Cualquier ayuda sería feliz de recibir.

Tnx

Bueno, no puedo ver realmente tu problema aquí

  • Cualquier operación (casi cualquier) en el enlace precompromiso con la transacción (y el repository local ) se puede realizar con svnlook
  • svnlook tiene subcommand propget, con puede operar en el nivel de transacción y extraer cualquier propiedad de cualquier ruta dentro de repos (transacción en este caso), y usted ya debe saber, allí puede cumplir con elementos externos dentro del tree de repository
  • puede identificar el formatting correcto y necesario de los externos de cualquier revisión previa dentro del repository

Editar

OK, ya veo: se necesitan detalles adicionales aquí. Para las testings y la experimentación utilicé el repository abierto Proving Ground para los externos en Assembla , que tienen una revisión PEG-ed en las tags y no PEG-ed en el tronco. Para usar svnlook localmente, simplemente lo svnrdump'ed en el repository local.

  • El equivalente más cercano para get propiedad de la transacción es getlo de una revisión comprometida.

Tag 1.0.1 fue creado con r7

 >svnlook pg rep svn:externals tags/1.0.1/ -r 7 -r 2 https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/[email protected] lib 

dónde:

  1. rep es una ruta relativa al repository en el sistema de files local
  2. tags/1.0.1/ es la ruta dentro del repository, para la cual yo sé previamente, que debería tener definición
  3. -r 7 es revisión, que quiero probar

Tag se creó desde trunk, en el que external no está vinculado a una revisión específica

 >svnlook pg rep svn:externals trunk/ -r 6 https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib lib 

Deberá ver la diferencia en la especificación ahora

ADVERTENCIA : el formatting de la definición externa será diferente en el caso de utilizar SVN-clients antiguos (pre 1.4) y puede ser ligeramente diferente (no puede recordar detalles exactos) en caso de usar la versión CLI de la integración SVN o SVN de IDE (las definiciones anteriores creé con TortoiseSVN), pero será tu parte del trabajo

  • Ofrezco aplicar la lógica de negocios de hook solo cuando es necesario (para commits en / tags solamente) y terminar commits más rápido, también has check in hook (en etapas tempranas) condición adicional – ¿está relacionado o no con la label de commit? De nuevo, es el subcommand svnlook y dirs-changed

dirs-changed para commit en las tags

 >svnlook dirs-changed rep -r 7 tags/ tags/1.0.1/ 

dirs-changed para commit en otra location

 >svnlook dirs-changed rep -r 6 trunk/ 

puedes |grep tags en un buen sistema operativo, hacer algunos trucos en Windows, operar según los resultados

PD: No olvide replace -r con -t en producción y almacenar transacción-id + repo-ruta, que obtendrá como parameters para enganchar

Esto solo funciona para mi

 REPOS="$1" TXN="$2" SVNLOOK=svnlook Grep_In_List() { EX_STATUS=1 while read line do echo "$line" | grep "$1" > /dev/null if [[ $? == 0 ]] then echo "$line" EX_STATUS=0 fi done exit $EX_STATUS } CHANGED_PATHS=$($SVNLOOK dirs-changed -t "$TXN" "$REPOS" | Grep_In_List "^tags") if [[ $? != 0 ]] then # no tags exit 0 fi CHANGED_SUB_PATHS=$(echo $CHANGED_PATHS | xargs -I {} $SVNLOOK tree "$REPOS" "{}" --full-paths -t "$TXN" | sort | uniq | xargs -I {} echo "{}\n") CHANGED_EXTERNALS=$(echo $CHANGED_SUB_PATHS | xargs -I {} $SVNLOOK pg "$REPOS" svn:externals "{}" -t "$TXN" 2>/dev/null | xargs -I {} echo "{}") while read external do echo "$external" | grep ' -r' > /dev/null if [[ $? != 0 ]] then echo "$external does not have an explicit revision number" 1>&2 exit 1 fi done <<<"$CHANGED_EXTERNALS" # all tags correct exit 0