Question

Pourriez-vous s'il vous plaît me guider sur la façon svnlook travaille ci-dessous.Je souhaite l'inclure dans un hook pour empêcher les validations dans une balise sous /tags:

$SVNLOOK changed -t "$TXN" "$REPOS" | grep "^U\W.*\/tags\/" && /bin/echo "Cannot commit to tags!" 1>&2 && exit 1
Était-ce utile?

La solution

Un hook de pré-commit Subversion permettra à un commit d'être effectué s'il renvoie un code de sortie de 0.Sinon, le hook de pré-commit sera échouer et le commit ne sera pas traité.

Le $SVNLOOK changed -t "$TXN" "$REPOS" montrera les changements dans $REPOS qui a eu lieu dans $TXN.Les variables shell doivent être définies par vous.Si vous regardez le pre-commit script fourni avec Subversion, vous verrez :

$TXN=$1
$REPO=$2

La sortie du svnlook changed la commande ressemble à ceci :

$ $SVNLOOK changed -t $TXN $REPOS
A   trunk/vendors/deli/
A   trunk/vendors/deli/chips.txt
A   trunk/vendors/deli/sandwich.txt
A   trunk/vendors/deli/pickle.txt
U   trunk/vendors/baker/bagel.txt
_U  trunk/vendors/baker/croissant.txt
UU  trunk/vendors/baker/pretzel.txt
D   trunk/vendors/baker/baguette.txt

La première colonne indique si quelque chose a été Uprité, UNdded, ou Dsupprimé.La deuxième colonne fait référence aux attributs.

Le reste est le nom du fichier sur lequel il a été traité.Tu peux voir ça baguette.txt a été supprimée et qu'une propriété sur croissant.txt a été modifié, mais le fichier lui-même n'a pas été mis à jour.

Disons que quelqu'un a essayé de modifier une balise.La sortie de svnlook changed ressemblera à ceci :

$SVNLOOK changed -t $TXN $REPOS
U   tags/4.2.1/vendors/baker/bagel.txt

La commande grep est la suivante :

grep "^U\W.*\/tags\/" 

Ceci recherche une ligne qui commence par ^U ce qui signifie que c'était une mise à jour.Ensuite, il recherche une chaîne commençant par /tags.Hmmm...cela pourrait être un problème.Cela ne correspond pas à la sortie du svnlook changed commande.

Peut-être que ça devrait être :

grep -q "^U.[[\s+tags/"

Cela correspondra à n'importe quelle chaîne commençant par U, éventuellement suivi d'un autre caractère, suivi d'un espace, puis immédiatement du mot tags/.

Vous voudrez peut-être vérifier cette expression.

Le && est un opérateur de liste.Si l'expression à gauche de && s'exécute avec succès (c'est-à-direil renvoie un code de sortie nul), l'instruction du côté droit sera exécutée.Sinon, l'instruction de droite ne sera pas exécutée.

Ainsi, si votre grep correspond à un modèle qui ressemble à quelqu'un qui a mis à jour une balise, ce sera vrai.La déclaration sur le côté droit du && sera exécuté.

Ainsi,

/bin/echo "Cannot commit to tags!" 1>&2

sera exécuté.Ceci est envoyé à STDERR qui sera envoyé au client Subversion, mais seulement si le code de sortie du hook de pré-commit est zéro.

Ainsi, la prochaine commande de l'opérateur de liste exit 1 s'exécutera si le /bin/echo est réussi.(Ce n’est peut-être pas le cas, mais ce sera généralement le cas).Avec cela, le hook de pré-validation se termine avec un code de sortie différent de zéro, le hook échoue et le Cannot commit to tags! sera envoyé au client SVN pour que l'utilisateur puisse le voir.

Il n’y a absolument aucune raison au monde pour que cette déclaration ressemble à ceci.C'est presque équivalent et plus facile à comprendre :

if $SVNLOOK changed -t $TXN $REPOS | grep -q "^U.[[\s+tags/"
then
    /bin/echo "Cannot commit to tags!" 1>&2"
    exit 1
fi
exit 0

Après tout, vous devez mettre cela dans un script shell appelé pre-commit de toute façon et j'ai les variables shell $SVNLOOK, $REPOS, et $TXN réglé de toute façon.

La raison pour laquelle ce n'est pas tout à fait équivalent est que cela fera échouer la validation même si le /bin/echo échoue.


Si vous recherchez un hook de pré-validation pour contrôler les balises, vous devriez jeter un œil à le mien.Cela a été testé sur des centaines de sites et vous donnera beaucoup plus de contrôle sur votre référentiel et effectuera une meilleure vérification des erreurs.

Ce hook utilise un fichier de contrôle pour contrôler l'accès au référentiel.Par exemple, vous souhaiterez peut-être pouvoir modifier les balises si nécessaire.

[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/**
access = read-only
users = @ALL

[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/
access = add-only
users = @ALL

[file I can modify and delete tags]
file = /tags/**
access = read-write
users = jazzr

Jetez un œil au crochet.Il fonctionne avec l'installation standard de Perl 5.8.8 et versions ultérieures.Il ne nécessite aucun autre module.Toutefois, si vous utilisez LDAP ou Active Directory pour le contrôle d'accès Subversion, vous pouvez installer le Net::LDAP Module Perl et utilisez des groupes LDAP ou Active Directory dans votre hook de pré-validation pour le contrôle d'accès.

Autres conseils

$SVNLOOK changed -t "$TXN" "$REPOS" imprime tous les chemins qui ont été modifiés.Voir ici pour plus d'informations sur les paramètres :http://svnbook.red-bean.com/en/1.7/svn.ref.svnlook.c.changed.html

Ensuite, la liste des chemins modifiés est transmise à grep qui vérifie si quelque chose a changé et qui contient "/tags/" dans le chemin, | grep "^U\W.*\/tags\/".

Le && est un opérateur AND dans le shell.Si la commande grep trouve une correspondance, elle renvoie le code d'état 0 qui dans ce cas est équivalent à "TRUE" et la commande après le && s'exécutera, sinon elle ne le sera pas.

La partie après le &&, /bin/echo "Cannot commit to tags!" 1>&2 exécute la commande echo et écrit le message de 1 (sortie standard) à &2 qui est l'erreur standard.Si cela réussit, la commande se termine avec un code d'état 1 exit 1.Cela fera que votre script de crochet reviendra avec un code d'état non nul et votre engagement échouera à renvoyer le "Impossible de s'engager sur les balises!" Message à l'utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top