2009-04-02 7 views
20

Salut Je me demandais s'il existe un moyen pour le serveur SVN d'assigner automatiquement la propriété svn: needs-lock sur tout fichier binaire et non textuel.Ajouter automatiquement svn: needs-lock

Nous avons une équipe de développeurs plutôt petite, mais reposer sur tout le monde pour se rappeler de définir cette propriété sur des fichiers binaires nouvellement créés n'a pas de sens, car il est très facile d'oublier une telle chose.

Répondre

13

Modifiez le fichier svn config et ajoutez une entrée pour les accessoires automatiques ou utilisez la propriété versionnée svn:auto-props avec SVN 1.8 et les clients plus récents. Read SVNBook!

EDIT:

De SVN 1.8, vous pouvez l'appliquer la propriété svn:auto-props sur le chemin racine de votre référentiel. Voir ce release note et mis à jour SVNBook 1.8 chapter.

+3

Prenez garde! Vous devez configurer les accessoires automatiques sur chaque client SVN individuellement. Il n'y a aucun moyen que le serveur applique automatiquement needs-lock, au moins à partir de svn 1.7. –

+2

TSVN a la propriété tsvn: auto-props qui est utilisée pour cela: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-propertypage.html#tsvn-dug-propertypage-tsvn-props – Stefan

+0

@Dan mais vous pouvez créer un script de pré-validation qui rejette les fichiers binaires qui n'ont pas cette propriété. – greggo

4

Il convient de noter que la méthode des accessoires automatiques doit être configurée sur chaque client SVN utilisé. Ainsi, lorsque vous configurez un nouveau développeur ou un développeur existant sur une nouvelle machine, vous devez vous souvenir d'effectuer cette configuration.

Si vous utilisez tous TortoiseSVN, vous pouvez définir la propriété tsvn:autoprops sur le dossier de base de chaque commande et elle sera honorée par tous les clients TortoiseSVN.

Si vous voulez vraiment le clouer, vous devez placer un crochet pre-commit dans chaque référentiel. Le script enforcer peut être facilement créé pour cela.

Si vous avez un python-fu, RepoGuard (le successeur de SVNChecker) semble être aussi utile.

Quel que soit votre choix, il n'y a aucun moyen d'appliquer rétroactivement la propriété aux fichiers existants dans le référentiel, je pense. Cependant, vous pouvez probablement l'appliquer lors de la prochaine validation du fichier.

+0

Ceci est un excellent point. Si vous êtes habitué à l'application côté serveur (comme dans TFS), cela n'est pas immédiatement apparent. +1 – MutantNinjaCodeMonkey

+1

Périmé, aussi bien. Reportez-vous à la section «Configuration de configuration du référentiel» de SVN 1.8: http://subversion.apache.org/docs/release-notes/1.8.html#repos-dictated-config – bahrep

2

Il y a une page sur ce wiki Subversion qui décrit toutes les différentes options sur la façon d'ajouter automatiquement les besoins-verrou et comment garantir qu'il a été défini. La page donne également des exemples de scripts et les détails de configuration:

http://www.orcaware.com/svn/wiki/Automatic_lock-modify-unlock

+1

Notez qu'il n'y a aucun moyen de faire en sorte que le serveur applique automatiquement les besoins. fermer à clé. Cette documentation explique comment configurer chaque client SVN individuellement pour appliquer automatiquement le verrouillage des besoins, et comment configurer le serveur SVN pour rejeter les validations qui n'utilisent pas correctement le verrouillage des besoins. –

+2

@DanFabulich maintenant il y a moyen de demander au client SVN 1.8 d'appliquer les auto-props du dépôt. – bahrep

21

Apache Subversion 1.8 introduit la fonction Repository Dictated Configuration qui nécessite SVN 1.8 client, mais 1,8 serveur n'est pas nécessaire parce que c'est une fonctionnalité côté client. Avec Subversion 1.8, vous pouvez configurer des modèles auto-props dans un référentiel en utilisant la nouvelle Subversion svn:auto-props inherited property.

Par exemple, définissez la valeur svn:auto-props sur la propriété *.exe = svn:needs-lock=* à la racine de votre référentiel (ou chemin d'accès au référentiel qui représente la racine d'un projet). Cela se traduira par chaque nouveau fichier * .exe ajouté ayant la propriété svn:needs-lock=* appliquée.

Vous pouvez stocker des valeurs à plusieurs lignes dans les propriétés de Subversion, de sorte que vous pouvez ajouter le svn standard suivant: needs-lock et le modèle MIME à svn:auto-props:

*.bmp = svn:mime-type=image/bmp;svn:needs-lock=* 
*.gif = svn:mime-type=image/gif;svn:needs-lock=* 
*.ico = svn:mime-type=image/x-icon;svn:needs-lock=* 
*.jpeg = svn:mime-type=image/jpeg;svn:needs-lock=* 
*.jpg = svn:mime-type=image/jpeg;svn:needs-lock=* 
*.png = svn:mime-type=image/png;svn:needs-lock=* 
*.tif = svn:mime-type=image/tiff;svn:needs-lock=* 
*.tiff = svn:mime-type=image/tiff;svn:needs-lock=*  
*.doc = svn:mime-type=application/x-msword;svn:needs-lock=* 
*.docx = svn:mime-type=application/x-msword;svn:needs-lock=* 
*.jar = svn:mime-type=application/octet-stream;svn:needs-lock=* 
*.odc = svn:mime-type=application/vnd.oasis.opendocument.chart;svn:needs-lock=* 
*.odf = svn:mime-type=application/vnd.oasis.opendocument.formula;svn:needs-lock=* 
*.odg = svn:mime-type=application/vnd.oasis.opendocument.graphics;svn:needs-lock=* 
*.odi = svn:mime-type=application/vnd.oasis.opendocument.image;svn:needs-lock=* 
*.odp = svn:mime-type=application/vnd.oasis.opendocument.presentation;svn:needs-lock=* 
*.ods = svn:mime-type=application/vnd.oasis.opendocument.spreadsheet;svn:needs-lock=* 
*.odt = svn:mime-type=application/vnd.oasis.opendocument.text;svn:needs-lock=* 
*.pdf = svn:mime-type=application/pdf;svn:needs-lock=* 
*.ppt = svn:mime-type=application/vnd.ms-powerpoint;svn:needs-lock=* 
*.ser = svn:mime-type=application/octet-stream;svn:needs-lock=* 
*.swf = svn:mime-type=application/x-shockwave-flash;svn:needs-lock=* 
*.vsd = svn:mime-type=application/x-visio;svn:needs-lock=* 
*.xls = svn:mime-type=application/vnd.ms-excel;svn:needs-lock=* 
*.zip = svn:mime-type=application/zip;svn:needs-lock=* 
+1

Si * est un joker, est-ce que * = svn: needs-lock = * si vous voulez simplement appliquer needs-lock à TOUS les types de fichiers? –

+1

@JonathonCowley Je l'ai testé en ce moment avec TortoiseSVN 1.8.7 (SVN 1.8.9) et en réglant 'svn: auto-props' sur' * = svn: needs-lock = * 'fait exactement ce que vous demandez, ie "apply" needs-lock à tous les fichiers sous le dossier où vous définissez la propriété. – bahrep

+0

Merci pour la réponse très rapide. Je l'aurais testé moi-même, mais je suis sur un PC où je n'ai pas accès à Subversion. –

1

Utilisez un crochet pre-commit

#!/bin/bash 

REPOS="$1" 
TXN="$2" 

SVNLOOK=/usr/bin/svnlook 
ICONV=/usr/bin/iconv 

SVNLOOKOK=1 

# Check files for svn:needs-lock property 
# Exit on all errors. 
set -e 

echo "`$SVNLOOK changed -t "$TXN" "$REPOS"`" | while read REPOS_PATH 
do 
if [[ $REPOS_PATH =~ (A|M|U)[[:blank:]]{3}(.*)\.(.*) ]] 
then 
    if [ ${#BASH_REMATCH[*]} -ge 2 ] 
    then 
    FILENAME=${BASH_REMATCH[2]}.${BASH_REMATCH[3]}; 

    # Make sure every file has the svn:needs-lock property set 
    if [ "" == "`$SVNLOOK propget -t \"$TXN\" \"$REPOS\" svn:needs-lock \"$FILENAME\" 2> /dev/null`" ] 
    then 
    ERROR=1; 
    echo "" >&2 
    echo "svn:needs-lock property has to be set on \"$FILENAME\"" >&2 
    echo "" >&2 
    fi 
    fi 
fi 
test -z $ERROR || (exit 1) 
done 

# All checks passed, so allow the commit. 
exit 0 

et un crochet pré-verrouillage

#!/bin/bash 

REPOS="$1" 
PATH="$2" 
USER="$3" 

# If a lock exists and is owned by a different person, don't allow it 
# to be stolen (e.g., with 'svn lock --force ...'). 

# (Maybe this script could send email to the lock owner?) 
SVNLOOK=/usr/bin/svnlook 
GREP=/bin/grep 
SED=/bin/sed 

LOCK_OWNER=`$SVNLOOK lock "$REPOS" "$PATH" | \ 
      $GREP '^Owner: ' | $SED 's/Owner: //'` 

# If we get no result from svnlook, there's no lock, allow the lock to 
# happen: 
if [ "$LOCK_OWNER" = "" ]; then 
    exit 0 
fi 

# If the person locking matches the lock's owner, allow the lock to 
# happen: 
if [ "$LOCK_OWNER" = "$USER" ]; then 
    exit 0 
fi 
+0

Bien! J'ai adapté le hook 'pre-commit' pour imprimer la commande' svn propset' avec les fichiers nécessaires: https://gist.github.com/spl/0affe6cc0e06aae6cb46a45b8a9edd36 –

Questions connexes