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.
<?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`;
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
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:
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-
Ce qui suit devrait fonctionner:
svnlook youngest <repo-path>
Il renvoie un numéro de révision unique.
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
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).
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.
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.
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.
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
Vous pouvez essayer la commande ci-dessous:
svn info -r 'HEAD' | grep Revision: | awk -F' ' '{print $2}'
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.
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
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".
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
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
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.
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.
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.
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
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
$
$ svn log | head -10
sur n'importe quel répertoire contenant un dossier .svn