Svn PRE-COMMIT Hook Analyse du contenu de la classe Java

La première fois que je fais un crochet comme ça ..

J’ai besoin d’un hook de pre-commit qui parsing toutes les classes Java à valider, il devrait vérifier la présence de certains personnages dans la classe et éviter le commit si certains d’entre eux sont trouvés, des caractères comme † ou ¥, etc. Une bonne façon de procéder dynamicment à ce changement pourrait être de mettre tous ces caractères non valides dans un fichier plan afin de le changer facilement si nécessaire …

Je commence par un simple crochet que j’ai écrit il y a longtemps.

Maintenant, le problème BIG est d’obtenir l’emplacement des fichiers de la copie de travail. Celui que je devrais parsingr le contenu.

J’ai essayé beaucoup de commandes svnlook, mais je suis vraiment incapable de saisir ces informations dans le hook pre-commit ….

Obtenir beaucoup d’informations mais pas le chemin local du fichier. Je l’utilise pour rechercher du contenu …

OUTPUT="$($SVNLOOK changed -t $TXN $REPOS)" echo $SVNLOOK changed -t $TXN $REPOS 1>&2 echo "$BASEDIR" 1>&2 echo "${OUTPUT}" 1>&2 echo "$TXN $REPOS" 1>&2 

Peut-être que c’est mon approche qui ne va pas?

Merci beaucoup!

ACTUALISÉ

Merci “CaffeineAddiction”, vous savez que c’est toujours une “grande question” quand vous faites quelque chose pour la première fois.

En réalité, le vrai problème à la fin, après un jour de tentatives, était un autre, un bug SVN lié au codage du caractère client:

  Error output could not be translated from the native locale to UTF-8 

Maintenant, ce dernier problème est résolu et le script fonctionne aussi, vous pouvez le voir ci-dessous, il faut juste l’embellir, au fait merci pour le vôtre, je vais avoir des idées de votre part:

  REPOS="$1" TXN="$2" SVNLOOK=/usr/bin/svnlook OUTPUT="$($SVNLOOK changed -t $TXN $REPOS | awk '{print $2}')" for LINE in $OUTPUT do FILE=`echo $LINE` MESSAGE=`$SVNLOOK cat -t "$TXN" "$REPOS" "${FILE}"` echo "File is: $FILE" 1>&2 echo "${MESSAGE}" > /tmp/app.txt grep -P -n '[\x80-\xFF]' /tmp/app.txt | cut -f1 -d: 1>&2 done 

Ce n’est pas une réponse complète, mais cela pourrait suffire à vous orienter dans la bonne direction. Il y a quelques temps, on m’a demandé de lancer gjslint contre des fichiers javascript avant de les autoriser à entrer dans SVN. Voici le pré-crochet que j’ai utilisé pour la tâche:

 #!/bin/sh SVNLOOK=/usr/bin/svnlook GJSLINT=/usr/local/bin/gjslint ECHO=$(which echo) GREP=$(which grep) SED=$(which sed) ## Used for Debug #MYRUNLOG=/run/svn-pre-commit/pre-commit.log #touch $MYRUNLOG #echo "" > $MYRUNLOG MYTEMPJS=/run/svn-pre-commit/temp.js touch $MYTEMPJS echo "" > $MYTEMPJS MYTEMPLOG=/run/svn-pre-commit/gjslint.log touch $MYTEMPLOG echo "" > $MYTEMPLOG REPOS="$1" TXN="$2" FILES_CHANGED=`$SVNLOOK changed -t$TXN $REPOS | $SED -e "s/^....//g"` LINTERROR=0 for FILE in $FILES_CHANGED do if $ECHO $FILE | $GREP "\.js$" then if ! $ECHO "$REPOS/$FILE" | $GREP "/paweb5/\|/pamc/"; then exit 0; fi if $ECHO "$REPOS/$FILE" | $GREP "/doc/"; then exit 0; fi if $ECHO "$REPOS/$FILE" | $GREP "/docs/"; then exit 0; fi $SVNLOOK cat -t$TXN $REPOS $FILE > $MYTEMPJS $ECHO "$REPO/$FILE" >> $MYTEMPLOG $GJSLINT --ssortingct --disable 0001 $MYTEMPJS >> $MYTEMPLOG GJSL_ERROR_CODE=$? if [ $GJSL_ERROR_CODE != 0 ] then LINTERROR=1 fi $ECHO "~~~" >> $MYTEMPLOG fi done if [ $LINTERROR != 0 ] then echo "..........................................................................." >&2 while read line; do if $ECHO $line | $GREP "Line\|no errors\|new errors\|paweb5\|~~~" then echo $line >&2 fi done < $MYTEMPLOG echo "..........................................................................." >&2 exit 1 fi # If we got here, nothing is wrong. exit 0 

Je pense que la réponse à votre “gros problème”, à savoir la localisation des fichiers de la copie de travail, pourrait se trouver dans $SVNLOOK cat -t$TXN $REPOS $FILE > $MYTEMPJS

Si vous avez des questions sur le script, n’hésitez pas à demander