Liste tous les svn: externals récursivement?

94

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

(J'utilise Windows (et tortue))

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

Niels Bosma
la source
Cette question est également présente sur stackoverflow.com/questions/5118320/…
Thiago Burgos

Réponses:

144

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 dans les externes.

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

Wim Coenen
la source
cela me donne juste une liste de tous les externes et où ils pointent .. mais pas le 'emplacement' de l'externe .. c'est-à-dire si j'ai lib \ my_ex comme externe, je ne reçois que my_ex http: / svnlinkhere
ShoeLace
4
@ShoeLace: vous devez travailler avec un SVN plus parce que dans la sortie 1.6.1 ne contient ces informations.
Wim Coenen
1
Désolé mais je dois voter à la baisse car a) cela ne produira pas tous les externes; fx, si nous avons un dossier externe et qu'il y a un externe quelque part dans ce dossier - cela n'apparaîtra pas b) la question est étiquetée tortoise svn, mais la réponse est liée au client de ligne de commande
pmod
2
@pmod: a) Je ne le savais pas, mais cela me semble être un bug SVN plutôt qu'une erreur de ma part. b) Le programme d'installation de TortoiseSVN 1.7 inclut le client en ligne de commande!
Wim Coenen
1
La récursivité se rapporte à la structure des dossiers de la copie de travail où vous appelez la commande. Ce n'est pas par rapport aux externes imbriqués à l'intérieur des externes. Donc je ne pense pas que ce soit un bug. Sinon, cela rendrait l'opération encore plus inutilisable en termes de durée.
Frank Rem
15

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 soulager ces frustrations. Comme mentionné précédemment, les URL utilisées dans le nouveau format de définition externe peuvent être relatives, et Subversion fournit la magie de la syntaxe pour spécifier plusieurs types de relativité des URL.

../

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

^ /

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

//

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

/

    Par rapport à 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 exactement de la façon dont vous créez des branches et de l'apparence de votre structure de référentiel.

Sébastien Celis
la source
8

Ma solution de contournement pour TortoiseSVN:

Ouvrez la boîte de dialogue "Branche / étiquette ..." dans le menu contextuel SVN. La boîte de dialogue inférieure affiche tous les externes, y compris les externes imbriqués.

DrRobotNinja
la source
Il semble que TortoiseSVN ne recherche pas récursivement svn: externals dans svn: externals, donc c'est la même chose que faire svn propget svn:externals -R.
paulie4
0

Pour contourner le problème, vous pourriez peut-être structurer votre projet de manière à ce que tous les éléments externes soient définis sur le même dossier, par exemple sur le dossier du projet juste en dessous de Trunk. (Cela ne signifie pas que tous les dossiers externes doivent être à la même profondeur d'ailleurs.) Ensuite, vous pouvez faire un clic droit sur votre dossier de projet, puis Propriétés ..., puis l'onglet Subversion, puis Propriétés ... puis double-cliquez sur svn: externals.

Lâche anonyme
la source
0

J'ai utilisé la réponse de Wim Coenen et j'ai é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'externes imbriqués, 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 des noms de fichiers qui doivent s'échapper. Cela ne fonctionnera probablement pas alors.

AVERTISSEMENT: Je sais que la question initiale concernait Windows, et le script shell ne fonctionnera pas là-bas à moins que vous n'utilisiez cygwin ou similaire.

Daniel Alder
la source
0

J'ai pris la réponse de Daniel Alder , supprimé les appels svnversion et l'ai rendu récursif (NOTE: read a b c d ene fonctionne pas s'il y a un espace dans la source ou la destination). Il s'agit d'un script bash, vous aurez donc besoin de quelque chose comme Cygwin ou d'utiliser 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
}
paulie4
la source