2009-04-02 11 views
20

Ciao Mi stavo chiedendo se esiste un modo per il server SVN di assegnare automaticamente la proprietà svn: needs-lock su qualsiasi file che sia binario e non testuale.Aggiungi automaticamente svn: needs-lock

Abbiamo un team di sviluppatori piuttosto piccolo, ma il fatto che tutti si ricordino di impostare questa proprietà sui file binari appena creati non ha senso poiché è molto facile dimenticare una cosa del genere.

risposta

13

Modificare il file di configurazione svn e aggiungere una voce per gli oggetti di scena automatici oppure utilizzare la proprietà con versione svn:auto-props con SVN 1.8 e i client più recenti. Read SVNBook!

EDIT:

Da SVN 1.8 la si può applicare la proprietà svn:auto-props al percorso principale del repository. Vedi questo release note e aggiornato SVNBook 1.8 chapter.

+3

Attenzione! È necessario configurare gli oggetti di scena automatici su ciascun client SVN singolarmente. Non c'è modo di fare in modo che il server applichi automaticamente need-lock, almeno a partire da svn 1.7. –

+2

TSVN ha la proprietà tsvn: auto-prop usata per questo: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-propertypage.html#tsvn-dug-propertypage-tsvn-props – Stefan

+0

@Dan ma potresti creare uno script di pre-commit che rifiuta i file binari che non hanno questa proprietà. – greggo

4

Si noti che il metodo di puntelli automatici deve essere configurato su ciascun client SVN utilizzato. Pertanto, quando si imposta un nuovo sviluppatore o uno sviluppatore esistente su una nuova macchina, è necessario ricordare di eseguire questa configurazione.

Se si utilizza lo TortoiseSVN, è possibile impostare la proprietà tsvn:autoprops nella cartella di base di ogni checkout e sarà onorato da tutti i client TortoiseSVN.

Se si vuole veramente inchiodarlo, è necessario inserire un hook pre-commit in ciascun repository. Lo script enforcer potrebbe essere facilmente utilizzato per questo.

Se si dispone di python-fu, RepoGuard (il successore di SVNChecker) sembra che potrebbe essere utile anche.

Non importa quale scegli, non c'è modo di applicare retroattivamente la proprietà ai file esistenti nel repository, penso. Probabilmente è possibile applicarlo al prossimo commit del file, comunque.

+0

Questo è un punto eccellente. Se sei abituato all'applicazione sul lato server di questo (come in TFS), non è immediatamente evidente. +1 – MutantNinjaCodeMonkey

+1

Non aggiornato. Vedi la funzionalità "Configurazione dettata del repository" di SVN 1.8: http://subversion.apache.org/docs/release-notes/1.8.html#repos-dictated-config – bahrep

2

C'è una pagina su questo wiki di Subversion che descrive tutte le diverse opzioni su come aggiungere automaticamente need-lock e su come garantire che sia stato impostato. La pagina fornisce anche esempi di script e dettagli di configurazione:

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

+1

Nota che non c'è modo di far applicare automaticamente al server le esigenze serratura. Questa documentazione spiega come configurare singolarmente ciascun client SVN per applicare automaticamente il blocco delle esigenze e come configurare il server SVN per rifiutare i commit che non utilizzano il blocco dei bisogni in modo corretto. –

+2

@DanFabulich ora c'è modo di istruire il client SVN 1.8 per applicare i puntelli automatici dal repository. – bahrep

21

subversion 1.8 introdotto la funzione Repository Dictated Configuration che richiede SVN 1.8 client, ma 1,8 server non è necessario perché questa è una caratteristica sul lato client.

Con Subversion 1.8, è possibile configurare i modelli di puntelli automatici all'interno di un repository utilizzando la nuova Subversion svn:auto-props inherited property.

Ad esempio, impostare il valore svn:auto-props sulla proprietà *.exe = svn:needs-lock=* nella radice del repository (o percorso del repository che rappresenta una radice di un progetto). Ciò comporterà ogni nuovo file * .exe con la proprietà svn:needs-lock=* applicata.

È possibile memorizzare i valori multilinea nelle proprietà di Subversion, in modo da poter aggiungere il seguente svn di serie: le esigenze-lock ed il modello MIME per 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

Se * è un carattere jolly, vorrebbe * = svn: needs-lock = * funziona se si desidera applicare semplicemente need-lock a TUTTI i tipi di file? –

+1

@JonathonCowley L'ho provato proprio ora con TortoiseSVN 1.8.7 (SVN 1.8.9) e l'impostazione di 'svn: auto-props' a' * = svn: needs-lock = * 'fa esattamente quello che chiedi, cioè "apply" richiede-lock su tutti i file sotto la cartella in cui si imposta la proprietà. – bahrep

+0

Grazie per la risposta molto veloce. L'avrei provato io stesso, ma sono su un PC dove non ho accesso a Subversion. –

1

Utilizzare un pre-commit hook

#!/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 

e un pre-lock hook

#!/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

Bello! Ho adattato l'hook 'pre-commit' per stampare il comando' svn propset' con i file necessari: https://gist.github.com/spl/0affe6cc0e06aae6cb46a45b8a9edd36 –