Valider 6b8693c0 rédigé par marcimat's avatar marcimat
Parcourir les fichiers

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.
parent ae72cd20
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+81 −30
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -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 dun 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;
}

+17 −5
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -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
+3 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -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;