Domanda

Ho un post-commit hook in svn che funziona bene dalla riga di comando quando si esegue

env - ./foo.sh /path/to/svn/repos/ 12345

, ma quando lo script viene chiamato da svn non sembra funzionare.

Quello che sto praticamente facendo sta controllando i file impegnati e se un particolare file viene modificato, faccio un export svn di esso per una condivisione di rete. Funziona bene dalla riga di comando.

Il post-commit script è il seguente:

#!/bin/sh

REPOS="$1"
REV="$2"

CHANGED=`/usr/bin/svnlook changed -r "$REV" "$REPOS"`
SOURCE="svn+ssh://localhost/path/to/svn/repos/somefile.zip"
DEST="/mnt/build/somefile-r$REV.zip"

if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]]
then
        `/usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST`
fi

exit 0

C'è un modo per produrre eventuali messaggi di errore in un file quando lo script viene eseguito, o specificamente la linea svn export (dove penso che ci potrebbe essere un problema)?

È stato utile?

Soluzione

Lo standard output da uno script gancio viene scartato, ma l'errore standard risale al cliente, almeno nelle versioni recenti di Subversion. Ho pensato che fosse stato così per un po ', ma il libro svn 1.4 dice che l'uscita viene scartato, così come si potrebbe verificare che si sta eseguendo una versione up-to-date del server - vedere l'errore standard stream è un buon modo per ottenere di allerta precoce dei tipi comuni di errore.

Per inviare l'output di un comando a un file, e includere l'output standard error nel file troppo per tenere tutto in un unico luogo, fare

command >/path/to/logfile 2>&1

Usa >> piuttosto che > da aggiungere al file:

command >>/path/to/logfile 2>&1

Poiché l'output di errore standard viene inviato al client svn, si può anche passare le informazioni dal standard output di nuovo in questo modo, sia per un singolo comando,

command 1>&2

o per l'intero script, mettendo

exec 1>&2

nella parte superiore dello script.

A colpo d'occhio, io non vedo una questione con il tuo script: assumendo le apici sulla linea svn export non sono un artefatto della marcatura, si dovrebbe rimuovere. (Essi eseguire il comando di esportazione che hai scritto, e poi prendere la sua produzione, ed eseguire che l'uscita da un altro comando -. Quasi certamente non è quello che si intende)

if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]]
then
        /usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST 1>&2
fi

(non sapevo sulla sintassi di prova doppio quadrato-staffa in bash, questa è una bella nuova scoperta per me!)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top