From f1a37c0adcaf759ed9b3559b5189bf47004c6cc3 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Wed, 5 Feb 2020 12:54:23 +0100
Subject: [PATCH] salvatore:recharger pour tirer+lire les modules suceptibles
 d'avoir change sur la base d'un changelog json fourni par l'empaqueteur

---
 spip-cli/SalvatoreRecharger.php | 212 ++++++++++++++++++++++++++++++++
 1 file changed, 212 insertions(+)
 create mode 100644 spip-cli/SalvatoreRecharger.php

diff --git a/spip-cli/SalvatoreRecharger.php b/spip-cli/SalvatoreRecharger.php
new file mode 100644
index 0000000..f86bcfe
--- /dev/null
+++ b/spip-cli/SalvatoreRecharger.php
@@ -0,0 +1,212 @@
+<?php
+
+/*
+    This file is part of Salvatore, the translation robot of Trad-lang (SPIP)
+
+    Salvatore is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    Trad-Lang is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Trad-Lang; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+    Copyright 2003-2020
+        Florent Jugla <florent.jugla@eledo.com>,
+        Philippe Riviere <fil@rezo.net>,
+        Chryjs <chryjs!@!free!.!fr>,
+        kent1 <kent1@arscenic.info>
+        Cerdic <cedric@yterium.com>
+*/
+
+/**
+ * Prend les fichiers de langue de référence de salvatore/modules/ et met à jour la base de données
+ * pour les modules decrits dans le fichier traductions/traductions.txt
+ *
+ */
+
+
+use Spip\Cli\Console\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Helper\ProgressHelper;
+
+
+class SalvatoreRecharger extends Command {
+	protected function configure(){
+		$this
+			->setName('salvatore:recharger')
+			->setDescription('Tirer&Lire les modules modifies des fichiers de langue de référence de salvatore/modules/')
+			->addOption(
+				'traductions',
+				null,
+				InputOption::VALUE_REQUIRED,
+				'Chemin vers le fichier traductions.txt a utiliser [salvatore/traductions/traductions.txt]',
+				null
+			)
+			->addOption(
+				'changelog',
+				null,
+				InputOption::VALUE_REQUIRED,
+				'Chemin vers le fichier JSON changelog des dernières modifications sur la zone',
+				null
+			)
+			->addOption(
+				'from',
+				null,
+				InputOption::VALUE_REQUIRED,
+				'Date ou intervalle de temps sur lequel considerer les changements. Defaut : -1hour',
+				null
+			)
+			->addOption(
+				'module',
+				null,
+				InputOption::VALUE_REQUIRED,
+				'Un ou plusieurs modules a traiter (par defaut tous les modules du fichier de traduction seront traites)',
+				null
+			)
+			->addOption(
+				'force',
+				null,
+				InputOption::VALUE_NONE,
+				'Forcer la relecture du ou des modules et la mise a jour en base indépendament de la date de dernière mise a jour des fichiers',
+				null
+			)
+			->addOption(
+				'time',
+				null,
+				InputOption::VALUE_NONE,
+				'Ajouter date/heure sur les sorties pour les logs',
+				null
+			)
+		;
+	}
+
+	protected function execute(InputInterface $input, OutputInterface $output){
+		global $spip_racine;
+		global $spip_loaded;
+
+		include_spip('inc/salvatore');
+
+		$time = $input->getOption('time');
+		salvatore_init(array($output, 'writeln'), !!$time);
+
+		salvatore_log("<comment>=======================================</comment>");
+		salvatore_log("<comment>RECHARGER [Tirer&Lire les modules modifies sur la zone]</comment>");
+		salvatore_log("<comment>=======================================</comment>");
+
+
+		$traductions = $input->getOption('traductions');
+		$liste_trad = salvatore_charger_fichier_traductions($traductions);
+		$n = count($liste_trad);
+		salvatore_log("<info>$n modules dans le fichier traductions " . ($traductions ? $traductions : '') . "</info>");
+
+		$modules = $input->getOption('module');
+		if ($modules = trim($modules)) {
+			$liste_trad = salvatore_filtrer_liste_traductions($liste_trad, $modules);
+			$n = count($liste_trad);
+			salvatore_log("<info>$n modules à traiter : " . $modules . "</info>");
+		}
+
+		$changelogFile = $input->getOption('changelog');
+		if (!$changelogFile or !file_exists($changelogFile)) {
+			salvatore_log("<error>Indiquez un fichier valide comme changelog</error>");
+			exit(1);
+		}
+		$changelog = file_get_contents($changelogFile);
+		if (!$changelog or !$changelog = json_decode($changelog, true)) {
+			salvatore_log("<info>Rien a faire, changelog vide</info>");
+			return;
+		}
+
+		$from = $input->getOption('from');
+		if (!$from) {
+			$from = '-1hour';
+		}
+		$t_since = strotime($from);
+		if (!$t_since) {
+			salvatore_log("<error>Indiquez un temps valide pour l'option --from</error>");
+			exit(1);
+		}
+
+		$changed_trad = $this->filter_changed_traductions($liste_trad, $changelog, $t_since);
+		if ($changed_trad) {
+			$n = count($changed_trad);
+			$changed_modules = array_column($changed_trad, 'module');
+			$changed_modules = array_unique($changed_modules);
+			salvatore_log("<info>$n modules modifiés à recharger : " . implode(',', $changed_modules) . "</info>");
+
+			include_spip('salvatore/lecteur');
+			include_spip('salvatore/tireur');
+			salvatore_tirer($changed_trad);
+
+			$force = $input->getOption('force');
+			salvatore_lire($liste_trad, $force);
+		}
+		else {
+			salvatore_log("<info>Rien a faire, aucun fichier correspondant a un module</info>");
+		}
+
+	}
+
+	protected function filter_changed_traductions($liste_trad, $changelog, $t_since) {
+
+		$changed_trad = array();
+		$changed = array();
+		foreach($changelog as $file => $lastmodified) {
+			if ($lastmodified > $t_since
+			  and strpos($file, "/lang") !== false
+			) {
+				$changed[] = $file;
+			}
+		}
+		$changed = array_unique($changed);
+		salvatore_log(count($changed) . " fichiers changés");
+
+		foreach($changed as $c) {
+			$depots_possibles = [
+				"svn://zone.spip.org/spip-zone/" . rtrim($c, '/'),
+			];
+			if (strpos($c, "spip-zone/_core_/plugins/") === 0) {
+				$r = explode('/', $c);
+				array_shift($r);
+				array_shift($r);
+				array_shift($r);
+				$r = array_shift($r);
+				$depots_possibles[] = "https://git.spip.net/spip/$r.git";
+			}
+			if (strpos($c, "spip-zone/_plugins_/") === 0) {
+				$r = explode('/', $c);
+				array_shift($r);
+				array_shift($r);
+				$r = array_shift($r);
+				$depots_possibles[] = "https://git.spip.net/spip-contrib-extensions/$r.git";
+			}
+			if (strpos($c, "spip-zone/_squelette_/") === 0) {
+				$r = explode('/', $c);
+				array_shift($r);
+				array_shift($r);
+				$r = array_shift($r);
+				$depots_possibles[] = "https://git.spip.net/spip-contrib-squelettes/$r.git";
+			}
+			foreach ($liste_trad as $k=>$source) {
+				if (in_array(rtrim($source['url'], '/'), $depots_possibles)) {
+					$changed_trad[] = $source;
+					unset($liste_trad[$k]);
+					break;
+				}
+			}
+		}
+
+		return $changed_trad;
+	}
+}
+
-- 
GitLab