web-dev-qa-db-fra.com

Lister tous les svn: externals récursivement?

Comment puis-je obtenir une liste de tous les svn: externals (récursivement) dans un répertoire? Y at-il une utilité pour cela?

(J'utilise Windows (et tortue))

J'ai un tas de svn: externals liant différentes parties partagées de mon projet et lorsque je branche, il est généralement très sujet aux erreurs de trouver tous les externes et de les modifier afin que le lien vers les chemins de la nouvelle branche.

83
Niels Bosma

Procédez comme suit à la racine de votre copie de travail:

svn propget svn:externals -R

Comme indiqué dans les commentaires ci-dessous, cela ne répertorie pas les externes en externes.

Remarque pour les utilisateurs de TortoiseSVN: le programme d’installation de TortoiseSVN permet également d’installer le client en ligne de commande SVN. Cette option n'est pas activée par défaut.

130
Wim Coenen

Changer manuellement toutes ces propriétés externes semble fastidieux. Avez-vous examiné la nouvelle fonctionnalité pour les externes ajoutée dans Subversion 1.5?

Subversion 1.5 fait un grand pas en avant pour atténuer ces frustrations. Comme mentionné précédemment, les URL utilisées dans le nouveau format de définition des externals peuvent être relatives et Subversion fournit une magie syntaxique permettant de spécifier plusieurs types de relativité d'URL.

../

Relative à l'URL du répertoire sur lequel la propriété svn: externals est définie

^ /

Relative à la racine du référentiel dans lequel la propriété svn: externals est versionnée

//

Relative au schéma de l'URL du répertoire sur lequel la propriété svn: externals est définie

/

Relative à l'URL racine du serveur sur lequel la propriété svn: externals est versionnée

Peut-être que l'un de ceux-là aiderait? Je suppose que cela dépend de la manière dont vous branchez et de la structure de votre référentiel.

15
Sebastian Celis

Ma solution de contournement pour TortoiseSVN:

Ouvrez la boîte de dialogue "Branch/tag ..." dans le menu contextuel SVN. La boîte de dialogue inférieure affiche toutes les références externes, y compris les références externes imbriquées.

8
DrRobotNinja

J'ai utilisé la réponse de Wim Coenen et écrit le script suivant pour créer une liste de toutes les révisions:

getSvnRevs() {
  cd "$1"
  wcver="$(svnversion)"
  [ -n "$wcver" ] || panic "Unable to get version for $wcdir"
  echo "$1: $wcver"
  svn propget svn:externals -R | while read a b c d e; do
    [ -n "$a" ] || continue
    if [ "$b" = "-" ]; then
      wcparent="$a"
      wcdir="$wcparent/$c"
      [ -z "$e" ] || panic "Invalid format #1"
    else
      [ -n "$wcparent" ] || panic "Invalid format #2"
      wcdir="$wcparent/$a"
      [ -z "$c" ] || panic "Invalid format #3"
    fi
    [ -d "$wcdir" ] || panic "Invalid directory: $wcdir"
    wcver="$(svnversion "$wcdir")"
    [ -n "$wcver" ] || panic "Unable to get version for $wcdir"
    echo "$1/$wcdir: $wcver"
  done
}

Heureusement, je n'ai pas d'imbrication externe, donc je n'ai pas eu à tester cela et je suppose que cela ne fonctionnerait pas. Mais si vous en avez besoin, il suffit probablement d'appeler cette fonction de manière récursive. De plus, je n'ai jamais testé avec les noms de fichiers qui doivent s'échapper. Cela ne fonctionnera probablement pas alors.

CLAUSE DE NON-RESPONSABILITÉ: Je sais que la question initiale concernait les fenêtres et que le script Shell ne fonctionnerait pas là-bas, sauf si vous utilisez cygwin ou similaire.

0
Daniel Alder

Comme solution de contournement, vous pourriez peut-être structurer votre projet de manière à ce que tous les externes soient placés dans le même dossier, par exemple dans le dossier de projet situé juste en dessous de Trunk. (Cela ne veut pas dire que tous les dossiers externes doivent être à la même profondeur.) Ensuite, vous pouvez cliquer avec le bouton droit sur votre dossier de projet, puis sur Propriétés ..., puis sur l'onglet Subversion, puis sur Propriétés ... double-cliquez sur svn: externals.

0
Anonymous Coward

J'ai pris la réponse de Daniel Alder , j'ai supprimé les appels svnversion et les ai rendus récursifs (NOTE: read a b c d e ne fonctionne pas s'il y a un espace dans la source ou la destination). Ceci est un script bash, vous aurez donc besoin de quelque chose comme Cygwin ou vous utiliserez le sous-système Windows pour Linux .

getSvnExternals() {
  svnbase="$1"
  svnpath="$2"
  svn propget svn:externals -R "$svnbase/$svnpath" 2> /dev/null | while read a b c d e; do
    [ -n "$a" ] || continue
    if [ "$b" = "-" ]; then
      wcparent="$a"
      external="$c"
      wcdir=$(echo "$wcparent/$d" | sed s#^./##)
      [ -z "$e" ] || echo "WARNING: Invalid format #1. line='$a $b $c $d $e'"
    else
      [ -n "$wcparent" ] || echo "WARNING: Invalid format #2. wcparent=$wcparent"
      external="$a"
      wcdir=$(echo "$wcparent/$b" | sed s#^./##)
      [ -z "$c" ] || echo "WARNING: Invalid format #3. line='$a $b $c $d $e'"
    fi
    echo "$1/$wcdir: $external"
    ## recurse into external directory
    [ -d "$wcdir" ] && getSvnExternals "$1/$wcdir"
  done
}
0
paulie4