Obtendo o número da última revisão no SVN?

104

Usando PHP, Perl ou Python (de preferência PHP), preciso consultar um banco de dados SVN e descobrir o último número de revisão enviado ao SVN. Eu não preciso de nada além disso. Ele precisa ser não intensivo (então eu faço isso a cada 5 minutos como um cron job; o desempenho do SVN não deve ser afetado).

O SVN está localizado na minha intranet, mas não no meu computador específico.

Tenho o SVN instalado, mas não há ligações instaladas para PHP / Perl / Python. Estou executando o Windows XP, mas prefiro uma solução independente de plataforma que também funcione no Linux. Se você tiver uma solução apenas para Linux (ou apenas XP), isso também seria útil.

Coltin
fonte
2
"svn info --show-item revision" fornecerá a revisão atual para a qual o diretório atual é atualizado.
GreatAndPowerfulOz
2
$ svn info --show-item revision svn: invalid option: --show-itemUsando Apache Subversion 1.8.16 (r1740329) compilado em 26 de abril de 2016. Também experimentado com CollabNet 1.6.11 (r934486) compilado em 6 de março de 2014.
IceArdor
Em conexão com esses comentários, verifique svn help infoas opções legais parasvn info
XavierStuvw
@IceArdor Estou usando o SVN v1.9.5 e --show-itemestá disponível
icc97

Respostas:

68
<?php
    $url = 'your repository here';
    $output = `svn info $url`;
    echo "<pre>$output</pre>";
?>

Você pode obter a saída em XML assim:

$output = `svn info $url --xml`;

Se houver um erro, a saída será direcionada para stderr. Para capturar stderr em sua saída, use da seguinte maneira:

$output = `svn info $url 2>&1`;
Daniel X Moore
fonte
2
Se houver um erro, a saída será direcionada para stderr. Para capturar stderr em sua saída, use da seguinte forma: $ output = svn info $url 2>&1;
Daniel X Moore
3
Obrigado! Usei --xml para construir minha própria ferramenta C # que me ajuda a gerar um atributo AssemblyFileVersion. PS: Inglês não é minha língua principal e fiquei intrigado com a palavra 'assim' que nunca tinha ouvido antes. A propósito, sua origem é bastante engraçada: cf ( en.wiktionary.org/wiki/thusly ); você usou intencionalmente (trocadilho?) ou é comum usar assim em vez de assim?
odalet
7
svn info $url | grep 'Last Changed Rev' | awk '{ print $4; }'
Cobra_Fast
7
@Cobra_Fast, você não precisa canalizar, você pode fazer svn info --show-item revision $urlou svn info --show-item last-changed-revision $url.
cp.engr
2
@ cp.engr Acredito que isso seja apenas desde o SVN v1.9 ou assim - ou seja, eu o tenho na v1.9.5 e não existe na v1.8.6
icc97
131

Se você deseja analisar uma cópia de trabalho local, a melhor ferramenta é svnversion, que vem com o Subversion e produz saída semelhante 968:1000M. A documentação diz:

O número da versão será um único número se a cópia de trabalho for de revisão única, não modificada, não trocada e com uma URL que corresponda ao argumento TRAIL_URL. Se a cópia de trabalho for incomum, o número da versão será mais complexo:

4123:4168     mixed revision working copy
4168M         modified working copy
4123S         switched working copy
4123:4168MS   mixed revision, modified, switched working copy
sth
fonte
2
concordou, muito melhor do que svn info
Richard
32
svnversion é para cópias de trabalho locais e não acessa o repositório na intranet como especificado na questão.
Daniel X Moore
5
Para aqueles não familiarizados com o svnversion, ele faz parte do cliente de linha de comando padrão e aqui está a página do manual: svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html .
Michael Sorens
45

svn info -r HEAD

Isso lhe dará o número da revisão mais recente no cabeçalho do seu repositório.

Existem alguns posts interessantes sobre a integração de números de subversão em seu script de construção:

Nick Haddad
fonte
Esta é a maneira mais simples, pois você não precisa descobrir a url do repositório primeiro. Obrigado!
derFunk de
Recebi erros ao usar aspas no HEAD, então deve sersvn info -r HEAD
icc97
39

Isso deve funcionar no Bash, de um diretório de trabalho. Eu usei no Windows com unixutils instalado:

svn info |grep Revision: |cut -c11-
Blorgbeard está fora
fonte
Funciona se você colocar a URL do repositório onde você tem% *, o que quer que você queira dizer com isso. Bela sintaxe de corte, não sabia antes.
ypnos
1
Nota: já que falta -rHEAD, isso retornará a revisão de commit para o arquivo ou diretório solicitado. Esta pode não ser a revisão geral mais recente (porque outras alterações podem ter sido confirmadas em outro lugar ou em uma subárvore).
Sr. Fooz
4
Além disso, isso não funciona para versões localizadas do SVN (em polonês deve ser | cut -c9-).
zgoda
2
essa é, aliás, a razão pela qual não gosto de ferramentas de desenvolvedor de linha de comando localizadas; vantagem zero, um monte de problemas. Eu geralmente removo as localizações exatamente por esse motivo.
gimpf
8
Passar um delimitador em vez de uma contagem de caracteres funciona melhor para conteúdo localizado, por exemplo svn info | grep Revision | cut -d " " -f 2, retornará a segunda string após ser dividida com espaços.
Butifarra 01 de
34

O seguinte deve funcionar:

svnlook youngest <repo-path>

Ele retorna um único número de revisão.

Magentus
fonte
15

Para realmente obter o número da revisão mais recente ("revisão principal") em seu repositório remoto , use isto:

svn info -r 'HEAD' | grep Revision | egrep -o "[0-9]+"

Saídas, por exemplo:

35669
derFunk
fonte
12

Uma nota sobre como obter o número da revisão mais recente:

Digamos que eu cdmodifiquei em um subdiretório revisado ( MyProjectDir). Então, se eu ligar svnversion:

$ svnversion .
323:340

... Recebo " 323:340", que acho que significa: " você tem itens aqui, variando da revisão 323 a 340 ".

 

Então, se eu ligar svn info:

$ svn info
Path: .
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 323
Node Kind: directory
Schedule: normal
Last Changed Author: USER
Last Changed Rev: 323
Last Changed Date: 2011-11-09 18:34:34 +0000 (Wed, 09 Nov 2011)

... Recebo " 323" como revisão - que na verdade é a revisão mais baixa daquelas relatadas por svnversion!

 

Podemos então usar svn infono modo recursivo para obter mais informações do diretório local:

> svn info -R | grep 'Path\|Revision'
Path: .
Revision: 323
Path: file1.txt
Revision: 333
Path: file2.txt
Revision: 327
Path: file3.txt
Revision: 323
Path: subdirA
Revision: 328
Path: subdirA/file1.txt
Revision: 339
Path: subdirA/file1.txt
Revision: 340
Path: file1.txt
Revision: 323
...

... (remova o greppara ver mais detalhes).

 

Finalmente, o que fazer quando queremos verificar qual é a última revisão do repositório online (neste caso, @ server.com)? Em seguida, emitimos novamente svn info, mas com -r HEAD(observe a diferença entre a -Ropção de maiúsculas anteriormente e as minúsculas -ragora):

> svn info -r 'HEAD'
[email protected]'s password:
Path: MyProjectDir
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 340
Node Kind: directory
Last Changed Author: USER
Last Changed Rev: 340
Last Changed Date: 2011-11-11 01:53:50 +0000 (Fri, 11 Nov 2011)

O interessante é - svn infoainda se refere ao subdiretório atual ( MyProjectDir), no entanto, o caminho online é relatado como MyProjectDir(em oposição ao .caso local) - e a revisão online relatada é a mais alta ( 340- em oposição à mais baixa, 323relatada localmente).

sdaau
fonte
9
  • A partir do Subversion 1.9, você pode usar a opção --show-item para obter o valor de um dos campos de svn infosaída do comando. Este comando exibirá apenas o número da revisão:

    svn info --show-item=revision <URL-to-repository>
    
  • Obtenha a saída XMLed de svn info usando a --xmlopção e use o PowerShell para obter o número de revisão. Aqui está um exemplo simples:

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • Usando o VisualSVN Server 3.4 ou mais recente, você pode obter o número de revisões em um repositório executando estes comandos:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    Consulte a Get-SvnRepositoryreferência de cmdlet do PowerShell para obter mais informações.

bahrep
fonte
7

Eu acho que você está procurando

svn info -r HEAD

Você pode cumprir esse comando?

Provavelmente, você também precisará fornecer credenciais de login com o repositório.

Tim
fonte
Acho que precisa ser svn info -r HEAD
Stephen
-r pode ser facilmente omitido então.
ypnos
Certo - eu não especifiquei a opção para o -r - isso era apenas para ele encontrar o que ele precisa e começar com o help / book.
Tim
4

Alguém me adiantou para postar a resposta sobre svnversion, que é definitivamente a melhor solução se você tiver uma cópia de trabalho (IIRC, não funciona com URLs). Vou acrescentar o seguinte: se você está no servidor que hospeda o SVN, a melhor maneira é usar o svnlookcomando. Este é o comando que você usa ao escrever um script de gancho para inspecionar o repositório (e até mesmo a transação atual, no caso de ganchos de pré-confirmação). Você pode digitar svnlook helppara obter detalhes. Você provavelmente deseja usar o svnlook youngestcomando. Observe que ele requer acesso direto ao diretório repo, portanto, deve ser usado no servidor.

rmeador
fonte
2
nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svnversion
12354

Ou

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml |     xmlstarlet sel -t --value-of "//entry/@revision"
12354

Ou

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml | xmlstarlet sel -t --value-of "//commit/@revision"
12335
Nick Henry
fonte
2

Você pode usar qualquer um dos comandos:

1)
> svn info | awk '/Revision:/ { print $2 }' =>returns the latest version


2)
> svn log -l 1 | grep '^r[0-9]\+' | awk '{print $1}'

svn log -l 1     => returns the latest version commit 
grep '^r[0-9]\+' => greps the r4324 (revision) number
awk '{print $1}' => prints the match found
Angelin Nadar
fonte
2

Se você quiser um realmente curto:

svn info ^/

A notação circunflexa é uma abreviação para "a URL do diretório raiz do repositório".

Sanghyun Lee
fonte
2

Se você tiver a infelicidade de precisar fazer isso a partir de um arquivo em lote do Windows, aqui está o encantamento que você está procurando:

set REV=unknown
for /f "usebackq tokens=1,2 delims=: " %%A in (`svn info`) do if "%%A" == "Revision" set REV=%%B
echo Current SVN revision is %REV%

Isso executa "svn info", iterando em cada linha de saída gerada. Ele usa dois pontos como delimitador entre o primeiro e o segundo token na linha. Quando o primeiro token é "Revisão", ele define a variável de ambiente REV como o segundo token.

yoyo
fonte
1
você também pode usar FINDSTR:FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
icc97
veja esta outra resposta do SO para a base disso
icc97
2

Você está procurando uma chamada semelhante à chamada da linha de comando

svn info URL

Parece que isso é possível usando a biblioteca pysvn, e há uma receita que deve ajudá-lo a começar. Não tenho certeza se há algo semelhante para PHP.

Se você precisar recorrer à chamada do binário SVN por conta própria, certifique-se de usar o --xmlparâmetro para obter o resultado como XML. Isso deve ser mais fácil de analisar do que a saída da linha de comando.

Sander Rijken
fonte
Eu uso subprocess.check_outputem python para evitar outra chamada de biblioteca. Se você está apenas verificando os números de revisão / retirando as últimas cópias, é mais simples usar o svn na linha de comando via subprocess. Agora, se você estiver fazendo check-ins automáticos e mesclagens ...
Droogans
2

Você pode usar o formato XML out, por exemplo:

  svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +

Exemplo: usando o número de revisão

working=`svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +`
svn diff -r $working:HEAD --summarize --xml
fitorec
fonte
2

Você pode tentar o comando abaixo:

svn info -r 'HEAD' | grep Revision: | awk -F' ' '{print $2}'
mrajiv
fonte
1

svn infono BASH te darei todos os detalhes

RESULT:
Path: .
URL: 
Repository Root: 
Repository UUID: 
Revision: 54
Node Kind: directory
Schedule: normal
Last Changed Author: 
Last Changed Rev: 54
Last Changed Date: 

Você obterá a REVISÃO deste

D_D
fonte
1

A maneira mais simples e limpa de fazer isso (na verdade, svn 1.9, lançado em 2015) é usando:

svn info --show-item revision [--no-newline] [SVNURL/SVNPATH] 

A saída é o número da última revisão (mais jovem) para o SVNURL, ou o número da revisão atual da cópia de trabalho do SVNPATH. O --no-newlineé opcional, instrui a svnnão emitir uma nova linha cosmética ( \n) após o valor, se você precisar de saída mínima (apenas o número da revisão).

Veja: https://subversion.apache.org/docs/release-notes/1.9.html#svn-info-item

F.Igor
fonte
1
Tentei o svn 1.9.3 e o comando aqui é svn info --show-item, em vez de--show item
elopio
0

As soluções postadas não resolvem o caso quando externos estão sendo usados.

Se eu tiver uma URL ou uma cópia de trabalho com a svn:externalspropriedade definida, os externos podem mudar e, portanto, a última revisão do servidor subversion mudará. Mas a última revisão da cópia de trabalho ou URL somente relatará o número da revisão quando a propriedade svn: externals foi alterada ou qualquer item abaixo no caminho da URL, o que é o comportamento esperado.

Então você obtém o svn:externals propriedade e itera sobre os URLs e escolhe a revisão das alturas ou consulta a URL base do servidor subversion. A versão relatada a partir do URL base conterá a revisão mais recente de TUDO no servidor.

Portanto, se você estiver usando externos, é melhor usar svn info BASE_URLonde BASE_URLestá a URL raiz para todos os caminhos no servidor subversion.

usuario
fonte
0

Isso obterá apenas o número de revisão da última revisão alterada:

<?php
$REV="";
$repo = ""; #url or directory
$REV = svn info $repo --show-item last-changed-revision;
?>

Eu espero que isso ajude.

Kram
fonte
0

$ svn log | head -10 em qualquer diretório que tenha uma .svnpasta

kip2
fonte
0

svn infoou svnversionnão levará em consideração os subdiretórios, para encontrar a última 'revisão' da base de código ao vivo que a forma hackeada abaixo funcionou para mim - pode demorar um pouco para executar:

repo_root$ find ./ | xargs -l svn info  | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
$
Daniel Sokolowski
fonte
0

Isso pode ser obtido usando a biblioteca "SVN" :

import svn.remote

file_path = "enter your filepath"

svn_inf = svn.remote.RemoteClient(file_path)

head_revision = ([x for x in svn_inf.log_default(revision_to = 'HEAD')] [-1]).revision

O head_revision deve conter o número de revisão mais recente do arquivo

Naga Ravi Teja Lella
fonte
-1

Parece que há uma entrada no FAQ oficial para isso . O código-fonte está em C, mas o mesmo princípio se aplica, conforme descrito aqui nesta postagem da lista de discussão .

matt b
fonte
Esta é uma ótima ferramenta / resposta, mas não acho que ele precise de muito - entendi que só precisava da revisão mais recente, então talvez ele possa iniciar uma construção se sua revisão atual for diferente da anterior desde a última verificação. Talvez eu tenha entendido mal.
Tim