Browse Source

Ticket #4505 : afficher la révision GIT de SPIP ou des plugins, comme l’on avait avec SVN.

(Refonte de la PR #49 de Real3t.)

- version_svn_courante() est dépréciée et s’appuie sur la nouvelle fonction decrire_version_svn()
- pour decrire_version_svn() on ne s’embarrase plus de svn < 1.7, ni de svn.revision (on zip depuis un tag maintenant avec le «Débardeur» et ce fichier n’est plus présent)
- on introduit decrire_version_git()
- on introduit version_vcs_courante() qui retourne un texte affichable (tel que "GIT [master: c0f3219b]"), mais peut retourner les quelques données brutes si besoin.
remotes/checkIfPRContentChanged-1593596415272318282/master
Matthieu Marcillaud 2 years ago
parent
commit
6b8693c0ce
  1. 111
      ecrire/inc/filtres.php
  2. 22
      ecrire/inc/presentation_mini.php
  3. 6
      ecrire/plugins/afficher_plugin.php

111
ecrire/inc/filtres.php

@ -165,33 +165,73 @@ function spip_version() {
return $version;
}
/**
* Retrouve un numéro de révision SVN d'un répertoire
* Retourne une courte description d’une révision VCS d’un répertoire
*
* Mention de la révision SVN courante d'un répertoire
* Retourne un nombre négatif si on est sur .svn, et positif si on utilise svn.revision
* @param string $dir Le répertoire à tester
* @param array $raw True pour avoir les données brutes, false pour un texte à afficher
* @retun string|array|null
* - array|null si $raw = true,
* - string|null si $raw = false
*/
function version_vcs_courante($dir, $raw = false) {
$desc = decrire_version_git($dir);
if ($desc === null) {
$desc = decrire_version_svn($dir);
}
if ($desc === null or $raw) {
return $desc;
}
// affichage "GIT [master: abcdef]"
$commit = isset($desc['commit_short']) ? $desc['commit_short'] : $desc['commit'];
if ($desc['branch']) {
$commit = $desc['branch'] . ': ' . $commit;
}
return "{$desc['vcs']} [$commit]";
}
/**
* Retrouve un numéro de révision Git d'un répertoire
*
* @param string $dir Chemin du répertoire
* @return int
*
* - 0 si aucune info trouvée
* - NN (entier) si info trouvée par svn.revision (créé par le générateur de paquet Zip)
* - -NN (entier) si info trouvée par .svn/entries
*
* @return array|null
* null si aucune info trouvée
* array ['branch' => xx, 'commit' => yy] sinon.
**/
function version_svn_courante($dir) {
function decrire_version_git($dir) {
if (!$dir) {
$dir = '.';
}
// version installee par paquet ZIP
if (lire_fichier($dir . '/svn.revision', $c)
and preg_match(',Revision: (\d+),', $c, $d)
) {
return intval($d[1]);
// version installee par GIT
if (lire_fichier($dir . '/.git/HEAD', $c)) {
$currentHead = trim(substr($c, 4));
if (lire_fichier($dir . '/.git/' . $currentHead, $hash)) {
return [
'vcs' => 'GIT',
'branch' => basename($currentHead),
'commit' => trim($hash),
'commit_short' => substr(trim($hash), 0, 8),
];
}
}
return null;
}
/**
* Retrouve un numéro de révision Svn d'un répertoire
*
* @param string $dir Chemin du répertoire
* @return array|null
* null si aucune info trouvée
* array ['commit' => yy, 'date' => xx, 'author' => xx] sinon.
**/
function decrire_version_svn($dir) {
if (!$dir) {
$dir = '.';
}
// version installee par SVN
if (file_exists($dir . '/.svn/wc.db') && class_exists('SQLite3')) {
$db = new SQLite3($dir . '/.svn/wc.db');
@ -199,24 +239,35 @@ function version_svn_courante($dir) {
if ($result) {
$row = $result->fetchArray();
if ($row['changed_revision'] != "") {
return -$row['changed_revision'];
return [
'vcs' => 'SVN',
'branch' => '',
'commit' => $row['changed_revision'],
];
}
}
} else if (lire_fichier($dir . '/.svn/entries', $c)
and (
(preg_match_all(
',committed-rev="([0-9]+)",', $c, $r1, PREG_PATTERN_ORDER)
and $v = max($r1[1])
)
or
(preg_match(',^\d.*dir[\r\n]+(\d+),ms', $c, $r1) # svn >= 1.4
and $v = $r1[1]
))
) {
return -$v;
}
return null;
}
// Bug ou paquet fait main
/**
* Retrouve un numéro de révision SVN d'un répertoire
*
* Mention de la révision SVN courante d'un répertoire
* /!\ Retourne un nombre négatif si on est sur .svn
*
* @deprecated Utiliser version_vcs_courante()
* @param string $dir Chemin du répertoire
* @return int
*
* - 0 si aucune info trouvée
* - -NN (entier) si info trouvée par .svn/wc.db
*
**/
function version_svn_courante($dir) {
if ($desc = decrire_version_svn($dir)) {
return -$desc['commit'];
}
return 0;
}

22
ecrire/inc/presentation_mini.php

@ -223,11 +223,23 @@ function info_copyright() {
//
// Mention, le cas echeant, de la revision SVN courante
//
if ($svn_revision = version_svn_courante(_DIR_RACINE)) {
$version .= ' ' . (($svn_revision < 0) ? 'SVN ' : '')
. "[<a href='http://core.spip.net/projects/spip/repository/revisions/"
. abs($svn_revision) . "' target=\"_blank\" rel=\"noopener noreferrer\">"
. abs($svn_revision) . "</a>]";
if ($vcs = version_vcs_courante(_DIR_RACINE, true)) {
if ($vcs['vcs'] === 'GIT') {
$url = 'https://git.spip.net/spip/spip/commit/' . $vcs['commit'];
} elseif ($vcs['vcs'] === 'SVN') {
$url = 'http://core.spip.net/projects/spip/repository/revisions/' . $vcs['commit'];
} else {
$url = '';
}
// affichage "GIT [master: abcdef]"
$commit = isset($vcs['commit_short']) ? $vcs['commit_short'] : $vcs['commit'];
if ($url) {
$commit = "<a href=\"$url\" target=\"_blank\" rel=\"noopener noreferrer\">$commit</a>";
}
if ($vcs['branch']) {
$commit = $vcs['branch'] . ': ' . $commit;
}
$version .= " {$vcs['vcs']} [$commit]";
}
// et la version de l'ecran de securite

6
ecrire/plugins/afficher_plugin.php

@ -304,9 +304,9 @@ function affiche_bloc_plugin($plug_file, $info, $dir_plugins = null) {
$infotech = array();
$version = "<dt>" . _T('version') . "</dt><dd>" . $info['version'];
// Version SVN
if ($svn_revision = version_svn_courante($dir_plugins . $plug_file)) {
$version .= ($svn_revision < 0 ? ' SVN' : '') . ' [' . abs($svn_revision) . ']';
// Version VCS
if ($vcs = version_vcs_courante($dir_plugins . $plug_file)) {
$version .= ' ' . $vcs;
}
$version .= "</dd>";
$infotech[] = $version;

Loading…
Cancel
Save