Listar todos los svn: externos de forma recursiva?

94

¿Cómo puedo obtener una lista de todos los svn: externos (recursivamente) en un directorio? ¿Hay alguna utilidad para esto?

(Estoy usando Windows (y tortuga))

Tengo un montón de svn: externals que se vinculan a diferentes partes compartidas de mi proyecto y cuando me ramifico, generalmente es bastante propenso a errores encontrar todos los externos y cambiarlos para que el enlace a las rutas dentro de la nueva rama.

Niels Bosma
fuente
Esta pregunta también está presente en stackoverflow.com/questions/5118320/…
Thiago Burgos

Respuestas:

144

Haga lo siguiente en la raíz de su copia de trabajo:

svn propget svn:externals -R

Como se analiza en los comentarios a continuación, esto no incluye los externos en los externos.

Nota para los usuarios de TortoiseSVN: hay una opción en el instalador de TortoiseSVN para instalar también el cliente de línea de comandos SVN. Esta opción no está habilitada de forma predeterminada.

Wim Coenen
fuente
eso solo me da una lista de todos los externos y hacia dónde apuntan ... pero no la 'ubicación' del externo ... es decir, si tengo lib \ my_ex como un externo, solo obtengo my_ex http: / svnlinkhere
ShoeLace
4
@ShoeLace: usted debe estar trabajando con un SVN mayores porque en la salida 1.6.1 hace contener esta información.
Wim Coenen
1
Lo siento, pero tengo que rechazarlo ya que a) esto no generará todos los externos; fx, si tenemos una carpeta externa a y hay una externa en algún lugar dentro de esta carpeta, esto no aparecerá b) la pregunta está etiquetada como tortuga svn, pero la respuesta está relacionada con el cliente de línea de comandos
pmod
2
@pmod: a) No lo sabía, pero me parece un error SVN en lugar de un error de mi parte. b) ¡El instalador de TortoiseSVN 1.7 incluye el cliente de línea de comandos!
Wim Coenen
1
La recursividad es con respecto a la estructura de carpetas de la copia de trabajo donde invoca el comando. No es con respecto a los externos anidados dentro de los externos. Entonces no creo que sea un error. De lo contrario, esto haría que la operación fuera aún más inutilizable en términos de duración.
Frank Rem
15

Cambiar manualmente todas esas propiedades externas suena tedioso. ¿Ha mirado la nueva funcionalidad para externos agregada en Subversion 1.5?

Subversion 1.5 da un gran paso para aliviar estas frustraciones. Como se mencionó anteriormente, las URL utilizadas en el nuevo formato de definición externa pueden ser relativas y Subversion proporciona magia de sintaxis para especificar múltiples sabores de la relatividad URL.

../

    Relativo a la URL del directorio en el que se establece la propiedad svn: externals

^ /

    Relativo a la raíz del repositorio en el que se versiona la propiedad svn: externals

//

    Relativo al esquema de la URL del directorio en el que se establece la propiedad svn: externals

/

    Relativo a la URL raíz del servidor en el que se versiona la propiedad svn: externals

¿Quizás uno de esos ayudaría? Supongo que depende exactamente de cómo se está ramificando y cómo se ve la estructura de su repositorio.

Sebastián Celis
fuente
8

Mi solución para TortoiseSVN:

Abra el cuadro de diálogo "Rama / etiqueta ..." desde el menú contextual de SVN. El cuadro de diálogo inferior muestra todos los externos, incluidos los externos anidados.

DrRobotNinja
fuente
Parece que TortoiseSVN no busca de forma recursiva svn: externals dentro de svn: externals, así que esto es lo mismo que hacer svn propget svn:externals -R.
paulie4
0

Tal vez, como solución alternativa, podría estructurar su proyecto de tal manera que todos los externos estén configurados en la misma carpeta, por ejemplo, en la carpeta del proyecto justo debajo de Trunk. (Por cierto, esto no significa que todas las carpetas externas tengan que tener la misma profundidad). Luego puede hacer clic derecho en la carpeta de su proyecto, luego Propiedades ..., luego la pestaña Subversion, luego Propiedades ... luego haga doble clic en svn: externals.

Cobarde anónimo
fuente
0

Usé la respuesta de Wim Coenen y escribí el siguiente script para crear una lista de todas las revisiones:

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
}

Afortunadamente, no tengo externos anidados, así que no tuve que probar esto y supongo que no funcionaría. Pero si lo necesita, probablemente sea suficiente con llamar a esta función de forma recursiva. Además, nunca probé con nombres de archivo que necesiten escapar. Probablemente no funcione entonces.

DESCARGO DE RESPONSABILIDAD: Sé que la pregunta original era sobre Windows, y el script de shell no funcionará allí a menos que esté usando cygwin o similar.

Daniel Alder
fuente
0

Tomé la respuesta de Daniel Alder , eliminé las llamadas a svnversion y la hice recursiva (NOTA: read a b c d eno funciona si hay un espacio en la fuente o en el destino). Este es un script bash, por lo que necesitará algo como Cygwin o usará el subsistema de Windows para 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
fuente