MDL-69583 tool_customlang: add CLI import
authorFerran Recio <ferran@moodle.com>
Tue, 25 Aug 2020 14:20:16 +0000 (16:20 +0200)
committerFerran Recio <ferran@moodle.com>
Wed, 14 Oct 2020 09:59:33 +0000 (11:59 +0200)
admin/tool/customlang/cli/import.php [new file with mode: 0644]
admin/tool/customlang/lang/en/tool_customlang.php

diff --git a/admin/tool/customlang/cli/import.php b/admin/tool/customlang/cli/import.php
new file mode 100644 (file)
index 0000000..4daff05
--- /dev/null
@@ -0,0 +1,204 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle 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 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle 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 Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * CLI customlang import tool.
+ *
+ * @package    tool_customlang
+ * @copyright  2020 Ferran Recio <ferran@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+use tool_customlang\local\importer;
+use core\output\notification;
+
+define('CLI_SCRIPT', true);
+
+require(__DIR__ . '/../../../../config.php');
+require_once($CFG->dirroot.'/'.$CFG->admin.'/tool/customlang/locallib.php');
+require_once("$CFG->libdir/clilib.php");
+
+$usage =
+"Import lang customization.
+
+It can get a single file or a folder.
+If no lang is provided it will try to infere from the filename
+
+Options:
+--lang                  The target language (will get from filename if not provided)
+--source=path           File or folder of the custom lang files (zip or php files)
+--mode                  What string should be imported. Options are:
+                            - all: all string will be imported (default)
+                            - new: only string with no previous customisation
+                            - update: only strings already modified
+--checkin               Save strings to the language pack
+-h, --help              Print out this help
+
+Examples:
+\$ sudo -u www-data /usr/bin/php admin/tool/customlang/cli/import.php --lang=en --source=customlangs.zip
+
+\$ sudo -u www-data /usr/bin/php admin/tool/customlang/cli/import.php --source=/tmp/customlangs --checkin
+
+\$ sudo -u www-data /usr/bin/php admin/tool/customlang/cli/import.php --lang=en --source=/tmp/customlangs
+
+";
+
+list($options, $unrecognized) = cli_get_params(
+    [
+        'help' => false,
+        'lang' => false,
+        'source' => false,
+        'mode' => 'all',
+        'checkin' => false,
+    ],
+    ['h' => 'help']
+);
+
+if ($unrecognized) {
+    $unrecognized = implode("\n  ", $unrecognized);
+    cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
+}
+
+if ($options['help']) {
+    cli_write($usage);
+    exit(0);
+}
+
+$source = $options['source'] ?? null;
+$lang = $options['lang'] ?? null;
+$modeparam = $options['mode'] ?? 'all';
+$checkin = $options['checkin'] ?? false;
+
+$modes = [
+    'all' => importer::IMPORTALL,
+    'update' => importer::IMPORTUPDATE,
+    'new' => importer::IMPORTNEW,
+];
+if (!isset($modes[$modeparam])) {
+    cli_error(get_string('climissingmode', 'tool_customlang'));
+}
+$mode = $modes[$modeparam];
+
+if (empty($source)) {
+    $source = $CFG->dataroot.'/temp/customlang';
+}
+
+if (!file_exists($source)) {
+    cli_error(get_string('climissingsource', 'tool_customlang'));
+}
+
+// Emulate normal session - we use admin account by default.
+cron_setup_user();
+
+// Get the file list.
+$files = [];
+$langfiles = [];
+
+if (is_file($source)) {
+    $files[] = $source;
+}
+if (is_dir($source)) {
+    $filelist = glob("$source/*");
+    foreach ($filelist as $filename) {
+        $files[] = "$filename";
+    }
+}
+
+$countfiles = 0;
+foreach ($files as $filepath) {
+    // Try to get the lang.
+    $filelang = $lang;
+    // Get component from filename.
+    $pathparts = pathinfo($filepath);
+    $filename = $pathparts['filename'];
+    $extension = $pathparts['extension'];
+    if ($extension == 'zip') {
+        if (!$filelang) {
+            // Try to get the lang from the filename.
+            if (strrpos($filename, 'customlang_') === 0) {
+                $parts = explode('_', $filename);
+                if (!empty($parts[1])) {
+                    $filelang = $parts[1];
+                }
+            }
+        }
+    } else if ($extension != 'php') {
+        // Ignore any other file extension.
+        continue;
+    }
+    if (empty($filelang)) {
+        cli_error(get_string('climissinglang', 'tool_customlang'));
+    }
+    if (!isset($langfiles[$filelang])) {
+        $langfiles[$filelang] = [];
+    }
+    $langfiles[$filelang][] = $filepath;
+    $countfiles ++;
+}
+
+if (!$countfiles) {
+    cli_error(get_string('climissingfiles', 'tool_customlang'));
+}
+
+foreach ($langfiles as $lng => $files) {
+    $importer = new importer($lng, $mode);
+    $storedfiles = [];
+    $fs = get_file_storage();
+
+    cli_heading(get_string('clifiles', 'tool_customlang', $lng));
+
+    foreach ($files as $file) {
+        // Generate a valid stored_file from this file.
+        $record = (object)[
+            'filearea' => 'draft',
+            'component' => 'user',
+            'filepath' => '/',
+            'itemid'   => file_get_unused_draft_itemid(),
+            'license'  => $CFG->sitedefaultlicense,
+            'author'   => '',
+            'filename' => clean_param(basename($file), PARAM_FILE),
+            'contextid' => \context_user::instance($USER->id)->id,
+            'userid' => $USER->id,
+        ];
+        cli_writeln($file);
+        $storedfiles[] = $fs->create_file_from_pathname($record, $file);
+    }
+    cli_writeln("");
+
+    // Import files.
+    cli_heading(get_string('cliimporting', 'tool_customlang', $modeparam));
+    $importer->import($storedfiles);
+    // Display logs.
+    $log = $importer->get_log();
+    if (empty($log)) {
+        cli_problem(get_string('clinolog', 'tool_customlang', $lng));
+    }
+    foreach ($log as $message) {
+        if ($message->errorlevel == notification::NOTIFY_ERROR) {
+            cli_problem($message->get_message());
+        } else {
+            cli_writeln($message->get_message());
+        }
+    }
+    // Do the checkin if necessary.
+    if ($checkin) {
+        tool_customlang_utils::checkin($lng);
+        cli_writeln(get_string('savecheckin', 'tool_customlang'));
+    }
+    cli_writeln("");
+}
+
+exit(0);
index 513b2f7..29dd1e2 100644 (file)
@@ -37,6 +37,13 @@ $string['cliexportfilenotfoundforcomponent'] = 'File {$a->filepath} not found fo
 $string['cliexportstartexport'] = 'Exporting language "{$a}"';
 $string['cliexportzipdone'] = 'Zip created: {$a}';
 $string['cliexportzipfail'] = 'Cannot create zip {$a}';
+$string['clifiles'] = 'Files to import into {$a}';
+$string['cliimporting'] = 'Import files string (mode {$a})';
+$string['clinolog'] = 'Nothing to import into {$a}';
+$string['climissinglang'] = 'Missing language';
+$string['climissingfiles'] = 'Missing valid files';
+$string['climissingmode'] = 'Missing or invalid mode (valid is all, new or update)';
+$string['climissingsource'] = 'Missing file or folder';
 $string['confirmcheckin'] = 'You are about to save modifications to your local language pack. This will export the customised strings from the translator into your site data directory and your site will start using the modified strings. Press \'Continue\' to proceed with saving.';
 $string['customlang:edit'] = 'Edit local translation';
 $string['customlang:export'] = 'Export local translation';