Schreiben eines SVN-Hooks, der eine Kopie des festgeschriebenen Codes aktualisiert

Schreiben eines SVN-Hooks, der eine Kopie des festgeschriebenen Codes aktualisiert

Ich habe ein SVN-Repository mit vielen darin gespeicherten Unterprojekten. Im Moment post-commitdurchlaufe ich einfach alle möglichen Ordner auf der Maschine und führe svn updatein jedem aus:

REPOS="$1"
REV="$2"
DIRS=("/path/to/local/copy/firstproject" "/path/to/local/copy/anotherproject" ... "/path/to/local/copy/spam")
LOGNAME=`/usr/bin/whoami`

for DIR in ${DIRS[@]}
do
    cd $DIR
    sudo /usr/bin/svn update --accept=postpone 2>&1 | logger
    logger "$LOGNAME Updated $DIR to revision $REV (from $REPOS) "
done

Das Problem ist, dass dies langsam und redundant ist, wenn ich nur den Unterordner eines der Projekte übertrage. Ich frage mich, ob es eine bessere Möglichkeit gibt, herauszufinden, welches der DIRS ich verwenden sollte undnuraktualisiere das.

Gibt es eine Möglichkeit, dies zu tun? Soweit ich das beurteilen kann, gibt es keine Möglichkeit festzustellen, welcher Teil eines Repo festgeschrieben wurde und welches Verzeichnis daher aktualisiert werden muss.

Besteht die einzige Alternative darin, für jedes Projekt ein separates Repository zu erstellen? (Wenn ja, hätte man das wahrscheinlich von Anfang an tun sollen …)

Antwort1

Ich frage mich, ob es eine bessere Möglichkeit gibt, herauszufinden, welches DIRS ich verwenden sollte, und nur dieses zu aktualisieren.

svnlook dirs-changedist, was Sie suchen:

# svnlook dirs-changed -r 40270 /path/to/the/repo
project1/foo/bar

Versuchen Sie etwas wie Folgendes:

#!/usr/local/bash4/bin/bash

typeset -A IP
typeset -A DOCROOT

PROJECTS="project1 project2"

IP=([project1]="ip1" [project2]="ip2")
DOCROOT=([project1]="/var/www/html/project1/" [project2]="/var/www/html/project2/")

REPO="$1"
REV="$2"

USER='deployer'

PROJECT=`svnlook dirs-changed -r "$REV" "$REPO" | awk -F "/" '{ print $1 }'`

ssh -t "$USER@${IP[$PROJECT]}" "cd ${DOCROOT[$PROJECT]} && svn up"

Antwort2

Hier ist das Skript, das ich letztendlich mit der Hilfe von Quanta verwendet habe:

REPO="$1"
REV="$2"
declare -A PROJECTS
PROJECTS=(\
    [project1]="/path/to/projects/project1 /path/to/projects/project1-devel" \
    [project2]="/path/to/projects/project2 /path/to/projects/project2-devel" \
    [project3]="/path/to/projects/project3 /path/to/projects/project3-devel" \
)

PROJECT=`svnlook dirs-changed -r "$REV" "$REPO" | awk -F "/" '{ print $1 }'`
DIRS=${PROJECTS[$PROJECT]}

for DIR in $DIRS
do
    cd $DIR
    sudo /usr/bin/svn update --accept=postpone 2>&1 | logger
    logger "$LOGNAME Updated $DIR to revision $REV (from $REPOS) "
done

Beachten Sie, dass die Zeile das Wichtigste war, das ich hinzufügen musste declare -A PROJECTS. Aus irgendeinem Grund funktionierte das assoziative Array/Hash nicht, bis ich dies tat.

verwandte Informationen