web-dev-qa-db-fra.com

Obtenir le dernier numéro de révision dans SVN?

En utilisant PHP, Perl ou Python (de préférence PHP), j'ai besoin d'un moyen d'interroger une base de données SVN et de connaître le dernier numéro de révision envoyé à SVN. Je n'ai besoin de rien d'autre que ça. Il doit être non intensif (je le fais donc toutes les 5 minutes en tant que tâche cron; les performances de SVN ne devraient pas être affectées).

SVN se trouve sur mon intranet, mais pas sur mon ordinateur spécifique.

J'ai SVN installé, mais pas de liaisons installées pour PHP/Perl/Python. J'utilise Windows XP, mais je préférerais une solution indépendante de la plate-forme pouvant également fonctionner sous Linux. Si vous avez une solution exclusivement Linux (ou XP uniquement), cela serait également utile.

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

Vous pouvez obtenir le résultat en XML comme suit:

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

En cas d'erreur, la sortie sera dirigée vers stderr. Pour capturer stderr dans votre sortie, utilisez donc: 

$output = `svn info $url 2>&1`;
66
Daniel X Moore

Si vous souhaitez analyser une copie de travail locale, le meilleur outil est svnversion, fourni avec Subversion et produisant une sortie telle que 968:1000M. La documentation dit:

Le numéro de version sera un simple numéro si la copie de travail est unique révision, non modifiée, non commutée et avec une URL qui correspond à la TRAIL_URL argument. Si le travail copie est inhabituel le numéro de version sera plus complexe:

4123:4168     mixed revision working copy
4168M         modified working copy
4123S         switched working copy
4123:4168MS   mixed revision, modified, switched working copy
124
sth

svn info -r HEAD

Cela vous donnera le dernier numéro de révision en tête de votre référentiel.

Il existe quelques articles de blog sur l’intégration des numéros Subversion dans votre script de construction:

43
Nick Haddad

Cela devrait fonctionner dans Bash, à partir d'un répertoire de travail. Je l'ai utilisé sous Windows avec unixutils installed:

svn info |grep Revision: |cut -c11-
35
Blorgbeard

Ce qui suit devrait fonctionner:

svnlook youngest <repo-path>

Il renvoie un numéro de révision unique.

31
Magentus

Pour obtenir vraiment le numéro de la dernière révision ("révision principale") sur votre remote repository, utilisez ceci:

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

Sorties par exemple:

35669
13
derFunk

Une note sur l'obtention du dernier numéro de révision:

Disons que j'ai cd- dans un sous-répertoire révisé (MyProjectDir). Ensuite, si j'appelle svnversion:

$ svnversion .
323:340

... Je reçois "323:340", ce qui signifie, je suppose: "vous avez des éléments ici, allant de la révision 323 à 340".

Ensuite, si j'appelle 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)

... Je reçois "323" comme révision - qui est en fait la révision la plus basse de celles rapportées par svnversion!

Nous pouvons ensuite utiliser svn info en mode récursif pour obtenir plus d'informations à partir du répertoire 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
...

... (retirez la grep pour afficher plus de détails).

Enfin, que faire lorsque nous voulons vérifier quelle est la dernière révision du référentiel online (dans ce cas, @ server.com)? Ensuite, nous émettons à nouveau svn info, mais avec -r HEAD (notez la différence entre l’option majuscule -R précédemment et la minuscule -r maintenant):

> 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)

La chose intéressante est - svn info fait toujours référence au sous-répertoire actuel (MyProjectDir), cependant, le chemin d'accès en ligne est signalé par MyProjectDir (par opposition à . pour le cas local) - et la révision en ligne signalée est plus haute (340 - par opposition au plus bas, 323 rapporté localement).

12
sdaau
  • Depuis Subversion 1.9, vous pouvez utiliser l’option --show-item pour obtenir la valeur d’un des champs de la sortie de la commande svn info. Cette commande affichera uniquement le numéro de révision:

    svn info --show-item=revision <URL-to-repository>
    
  • Obtenez une sortie XML de svn info à l'aide de l'option --xml et utilisez PowerShell pour obtenir le numéro de révision. Voici un exemple simple:

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • À l'aide de VisualSVN Server 3.4 ou version ultérieure, vous pouvez obtenir le nombre de révisions dans un référentiel en exécutant les commandes suivantes:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    Voir Get-SvnRepository Référence de la cmdlet PowerShell pour plus d'informations.

8
bahrep

Je pense que tu cherches

svn info -r HEAD

Pouvez-vous Shell à cette commande?

Vous devrez probablement également fournir les informations de connexion avec le référentiel.

5
Tim

Quelqu'un m'a battu pour poster la réponse à propos de svnversion, qui est certainement la meilleure solution si vous avez une copie de travail (IIRC, cela ne fonctionne pas avec les URL). J'ajouterai ceci: si vous êtes sur le serveur hébergeant SVN, le meilleur moyen consiste à utiliser la commande svnlook. C'est la commande que vous utilisez lors de l'écriture d'un script de hook pour inspecter le référentiel (et même la transaction en cours, dans le cas de hooks de pré-validation). Vous pouvez taper svnlook help pour plus de détails. Vous voudrez probablement utiliser la commande svnlook youngest. Notez qu'il nécessite un accès direct au répertoire repo, il doit donc être utilisé sur le serveur.

4
rmeador

Vous pouvez utiliser le format de sortie XML, par exemple:

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

Exemple: utilisation du numéro de révision

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

Vous pouvez essayer la commande ci-dessous:

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

Vous recherchez un appel similaire à l'appel en ligne de commande

svn info URL

Il semble que cela soit possible en utilisant la bibliothèque pysvn, et il y a une recette qui devrait vous aider à démarrer. Je ne sais pas s'il existe quelque chose de similaire pour PHP.

Si vous devez appeler vous-même le fichier binaire SVN, veillez à utiliser le paramètre --xml pour obtenir le résultat au format XML. Cela devrait être plus facile à analyser que la sortie en ligne de commande.

2
Sander Rijken

Vous pouvez utiliser l'une des commandes suivantes: 

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
2
Angelin Nadar

Si vous voulez un très court:

svn info ^/

La notation caret est un raccourci pour "l'URL du répertoire racine du référentiel".

2
Sanghyun Lee
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
2
Nick Henry

Juste svn info dans BASH vous donnera tous les détails

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

Vous obtiendrez la REVISION de cette

1
D_D

Si vous avez le malheur de devoir le faire à partir d'un fichier batch Windows, voici l'incantation que vous recherchez:

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%

Cela lance "svn info", en parcourant chaque ligne de la sortie générée. Il utilise deux points comme séparateur entre le premier et le deuxième jeton sur la ligne. Lorsque le premier jeton est "Révision", la variable d'environnement REV est définie sur le deuxième jeton.

1
yoyo

Cela n'obtiendra que le numéro de révision de la dernière révision modifiée:

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

J'espère que ça aide.

0
Kram

Les solutions publiées ne traitent pas le cas lorsque des externes sont utilisés.

Si j'ai une URL ou une copie de travail avec le jeu de propriétés svn:externals, les données externes peuvent changer et, par conséquent, la dernière révision du serveur Subversion sera modifiée. Mais la dernière révision de la copie de travail ou de l'URL ne signalera le numéro de révision que lorsque la propriété svn: externals a été modifiée, ou tout élément situé plus bas dans le chemin de l'URL, ce qui correspond au comportement attendu.

Vous devez donc obtenir la propriété svn:externals et effectuer une itération sur les URL et choisir la révision des hauteurs ou interroger l'URL de base auprès du serveur Subversion. La version indiquée à partir de l'URL de base contiendra la dernière révision de TOUT sur le serveur.

Ainsi, si vous utilisez des externes, il est préférable d’utiliser svn info BASE_URL, où BASE_URL est l’URL racine Pour tous les chemins du serveur Subversion.

0
Nick

Le moyen le plus simple et le plus simple de le faire (en fait, svn 1.9, publié en 2015) utilise:

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

La sortie est le numéro de la dernière révision (joungest) pour SVNURL, Ou le numéro de la révision actuelle de la copie de travail de SVNPATH . Le --no-newline est facultatif, indique à svn de ne pas émettre de nouvelle ligne esthétique (\n) après la valeur, si vous souhaitez une sortie minimale (uniquement le numéro de révision).

Voir: https://Subversion.Apache.org/docs/release-notes/1.9.html#svn-info-item

0
F.Igor

svn info ou svnversion ne prendront pas en compte les sous-répertoires. Pour trouver la dernière révision du code-base en direct, la méthode piratée ci-dessous a fonctionné pour moi. L'exécution peut prendre un certain temps:

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

$ svn log | head -10 sur n'importe quel répertoire contenant un dossier .svn

0
kip2