Listar todos os svn: externals recursivamente?

94

Como posso obter uma lista de todos os svn: externals (recursivamente) em um diretório? Existe algum utilitário para isso?

(Estou usando Windows (e tartaruga))

Eu tenho um monte de svn: externals vinculados a diferentes partes compartilhadas do meu projeto e eu, quando faço um branch, é geralmente bastante sujeito a erros encontrar todos os externos e alterá-los para que o link para caminhos dentro do novo branch.

Niels Bosma
fonte
Esta pergunta também está presente em stackoverflow.com/questions/5118320/…
Thiago Burgos

Respostas:

144

Faça o seguinte na raiz da sua cópia de trabalho:

svn propget svn:externals -R

Conforme discutido nos comentários abaixo, isso não lista externos em externos.

Nota para usuários do TortoiseSVN: há uma opção no instalador do TortoiseSVN para também instalar o cliente de linha de comando SVN. Esta opção não está habilitada por padrão.

Wim Coenen
fonte
que só me dá uma lista de todos os externos e onde eles apontam .. mas não a 'localização' do exterior .. isto é, se eu tiver lib \ my_ex como um i externo somente get my_ex http: / svnlinkhere
cadarço
4
@ShoeLace: você deve estar trabalhando com um SVN mais velhos porque em 1.6.1 a saída faz conter esta informação.
Wim Coenen
1
Desculpe, mas eu tenho que votar contra ele, pois a) isso não gerará todos os externos; fx, se tivermos externo para a pasta e houver um externo em algum lugar dentro dessa pasta - isso não aparecerá b) a pergunta está marcada como tartaruga svn, mas a resposta está relacionada ao cliente de linha de comando
pmod
2
@pmod: a) Eu não sabia disso, mas me parece mais um bug do SVN do que um erro da minha parte. b) O instalador do TortoiseSVN 1.7 inclui o cliente de linha de comando!
Wim Coenen
1
A recursividade diz respeito à estrutura de pastas da cópia de trabalho onde você invoca o comando. Não é com respeito a elementos externos aninhados dentro de elementos externos. Então, não acho que seja um bug. Caso contrário, isso tornaria a operação ainda mais inutilizável em termos de duração.
Frank Rem
15

Alterar manualmente todas essas propriedades externas parece tedioso. Você já olhou para a nova funcionalidade para recursos externos adicionados no Subversion 1.5?

O Subversion 1.5 dá um grande passo para aliviar essas frustrações. Como mencionado anteriormente, os URLs usados ​​no novo formato de definição externa podem ser relativos, e o Subversion fornece magia de sintaxe para especificar vários tipos de relatividade de URL.

../

    Relativo ao URL do diretório no qual a propriedade svn: externals é definida

^ /

    Relativo à raiz do repositório no qual a propriedade svn: externals é versionada

//

    Relativo ao esquema da URL do diretório no qual a propriedade svn: externals é definida

/

    Relativo ao URL raiz do servidor no qual a propriedade svn: externals é versionada

Talvez um desses ajudasse? Eu acho que depende exatamente de como você está ramificando e como sua estrutura de repositório se parece.

Sebastian celis
fonte
8

Minha solução alternativa para o TortoiseSVN:

Abra a caixa de diálogo "Branch / tag ..." no menu de contexto do SVN. A caixa de diálogo inferior mostra todos os externos, incluindo os externos aninhados.

DrRobotNinja
fonte
Parece que o TortoiseSVN não procura recursivamente por svn: externals dentro de svn: externals, então isso é o mesmo que fazer svn propget svn:externals -R.
paulie4
0

Talvez, como alternativa, você possa estruturar seu projeto de forma que todos os externos sejam configurados na mesma pasta, por exemplo, na pasta do projeto logo abaixo do tronco. (Isso não significa que todas as pastas externas tenham que ter a mesma profundidade.) Em seguida, você pode clicar com o botão direito do mouse na pasta do projeto, Propriedades ..., a guia Subversion, Propriedades ... e clique duas vezes em svn: externals.

Covarde anônimo
fonte
0

Usei a resposta de Wim Coenen e escrevi o seguinte script para criar uma lista de todas as revisões:

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
}

Felizmente, não tenho itens externos aninhados, então não precisei testar isso e acho que não funcionaria. Mas se você precisar disso, provavelmente é o suficiente apenas chamar essa função recursivamente. Além disso, nunca testei nomes de arquivos que precisassem de escape. Provavelmente não funcionará então.

AVISO DE RESPONSABILIDADE: Eu sei que a pergunta original era sobre o Windows, e o shell script não funcionará lá a menos que você esteja usando o cygwin ou similar.

Daniel Alder
fonte
0

Peguei a resposta de Daniel Alder , removi as chamadas svnversion e tornei-a recursiva (NOTA: read a b c d enão funciona se houver um espaço na origem ou no destino). Este é um script bash, então você precisará de algo como Cygwin ou usar o subsistema do 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
fonte