Créer une nouvelle version sur un projet géré par Subversion, c'est très souvent créer une nouvelle branche. Afin d'harmoniser le nom des branches on peut être tenté de respecter une convention de nommage et de les numéroter.
Exemple de structure attendue
`-----trunk
| `-----fichier1
| `-----fichier2
`-----branches
`-----VERSION_1
| `-----fichier1
| `-----fichier2
`-----VERSION_1_1
| `-----fichier1
| `-----fichier2
`-----VERSION_2
`-----fichier1
`-----fichier2
mkbranch
Cette procédure devant être répétée à chaque nouvelle version, il est intéressant d'automatiser cette procédure. Voici donc le script mkbranch qui permet de créer des branches versionnées pour n'importe quel répertoire présent dans le trunk d'un dépôt subversion.
#!/bin/sh
# @author Nicolas Thouvenin
# @link http://github.com/touv/misc/blob/master/mkbranch
SCRIPT_NAME=`basename $0`
SCRIPT_PATH=`dirname $0`
usage() {
cat <<EOF
SYNTAXE :
${SCRIPT_NAME} [ [-n|--new] |
[-u|--update] |
[[-v|--version] VERSION ]
] REPERTOIRE
DETAILS :
Création d'une branche versionnée sur un répertoire sous le contrôle de svn
--new : Bascule majeur, création d'un nouveau numéro de version
--update : Bascule minueur, création d'une sous version
--version : Force le numéro de version (très utile en cas de problème)
EXEMPLES :
$SCRIPT_NAME .
$SCRIPT_NAME -n trunk
$SCRIPT_NAME -u trunk/module
$SCRIPT_NAME --update trunk/module
$SCRIPT_NAME --version VERSION_4_2 module
EOF
exit 0;
}
PREFIX="VERSION" # Préfix du nom de chaque branche
SEPARATOR="_" # Séparateur entre le préfix et les numéros majeurs et mineurs
VERSION=""
ACTION=""
MODULE=""
NEXT=""
for argument in $*
do
if [ ! -z "${NEXT}" ]
then
CMD="if [ -z \"\${${NEXT}}\" ]; then export ${NEXT}=\"${argument}\"; else export ${NEXT}=\"\${${NEXT}} ${argument}\"; fi;"
eval ${CMD}
NEXT=""
else
case $argument in
-h | --help )
usage
;;
-n | --new )
ACTION="new"
;;
-u | --update )
ACTION="upd"
;;
-v | --version )
NEXT="VERSION"
;;
* )
MODULE=$argument
;;
esac
fi
done
VERSION=${VERSION:=}
ACTION=${ACTION:=upd}
SKIPPING=${ACTION:=}
if test ${#} -eq 0
then
usage
fi
if test "x${MODULE}" = "x"
then
usage
fi
TRUNK=`svn info --xml ${MODULE} | grep "<url>" | sed -e "s/<url>//" -e "s/<\/url>//"`/
if test "x${TRUNK}" = "x/"
then
usage
fi
BRANCHES=`echo ${TRUNK} | sed -e "s/\/trunk/\/branches/"`
if test "${TRUNK}" = "${BRANCHES}"
then
usage
fi
echo "Dépôt trouvé : ${TRUNK}"
if test "x${VERSION}" = "x"
then
echo "Calcul du nouveau numéro de version ..."
AWK=`echo "awk '\$""0 !~ /${SEPARATOR}/ { print \$""0\"${SEPARATOR}0\"} $""0 ~/${SEPARATOR}/ { print $""0}'"`
MAJEUR=`svn list ${BRANCHES}/ | grep "${PREFIX}${SEPARATOR}" | sed -e"s/\///" -e"s/${PREFIX}${SEPARATOR}//" | eval ${AWK} | sed -e"s/${SEPARATOR}/ /" | sort -n | cut -f 1 -d " " | tail -1`
MINEUR=`svn list ${BRANCHES}/ | grep "${PREFIX}${SEPARATOR}" | sed -e"s/\///" -e"s/${PREFIX}${SEPARATOR}//" | eval ${AWK} | sed -e"s/${SEPARATOR}/ /" | sort -n | cut -f 2 -d " " | tail -1`
if test "x${MAJEUR}" = "x"
then
MAJEUR="0"
fi
if test "x${MINEUR}" = "x"
then
MINEUR="0"
fi
echo "Version trouvée : ${PREFIX}${SEPARATOR}${MAJEUR}${SEPARATOR}${MINEUR}"
if test "x${ACTION}" = "xupd"
then
MINEUR=`expr $MINEUR + 1 2>/dev/null`
VERSION="${PREFIX}${SEPARATOR}${MAJEUR}${SEPARATOR}${MINEUR}"
elif test "x${ACTION}" = "xnew"
then
MAJEUR=`expr ${MAJEUR} + 1 2>/dev/null`
VERSION="${PREFIX}${SEPARATOR}${MAJEUR}"
fi
fi
echo "Nouveau numéro : ${VERSION}"
echo "Confirmer le branchage (O/N)"
read -r CONFIRM
if test "x${CONFIRM}" != "xO"
then
echo "Branchage abandonné !"
exit 1
fi
echo "Branchage de ${MODULE} en ${VERSION} ..."
svn cp ${TRUNK} ${BRANCHES}${VERSION}/ -m "$0 ${VERSION}"
exit $?
Téléchargement et code source
Le code source de ce script est consultable et téléchargeable depuis GitHub à cette adresse http://github.com/touv/misc/blob/master/mkbranch
Remarques
- Ce script a uniquement été testé sous Ubuntu et Debian sur des dépôts svn distants. Il n'y a pas raison qui ne fonctionne pas sur d'autres distribution et sur des dépôts locaux, mais je ne peux pas l'affirmer.
- Le nom des branches est paramétrable suivant cette régle : ${PREFIX}${SEPARATEUR}${NUMERO}${SEPARATEUR}${NUMERO}
- Le script peut être renommé indifféremment.
Aucun commentaire:
Enregistrer un commentaire