[PATCH 2 of 9 v2] cli: fix 'front-end-build' on Windows (Issue #332)

Thomas De Schampheleire patrickdepinguin at gmail.com
Tue Mar 19 21:10:02 UTC 2019


# HG changeset patch
# User Thomas De Schampheleire <thomas.de_schampheleire at nokia.com>
# Date 1552944330 -3600
#      Mon Mar 18 22:25:30 2019 +0100
# Node ID 06b2154be2cb1242e5af7f7fa95b47059858318e
# Parent  9d972ac5437b418e4fbfa3a382d51f79baabe111
cli: fix 'front-end-build' on Windows (Issue #332)

On Windows, the command 'npm' is actually 'npm.cmd', a script and not a PE
executable. 'subprocess' will not resolve 'npm' into 'npm.cmd', while it
would resolve e.g. 'git' into 'git.exe', as the latter _is_ a PE
executable.

One solution is to change all references to the problematic scripts by
adding the '.cmd' extension explicitly, but this would not be compatible
with UNIX systems and thus require special handling.

By using 'shell=True', we can have one solution supporting both Windows and
UNIX.

Note: on Windows, next to the 'npm.cmd' file (and same for license-checker
etc.) there is also a file 'npm' (without extension). It is a shell script
(interpreter /bin/sh) for use on Windows with mingw/msys/cygwin. This script
will nevertheless never be used by the standard Windows command prompt and
is not used by Kallithea.

diff --git a/kallithea/bin/kallithea_cli_front_end.py b/kallithea/bin/kallithea_cli_front_end.py
--- a/kallithea/bin/kallithea_cli_front_end.py
+++ b/kallithea/bin/kallithea_cli_front_end.py
@@ -42,7 +42,8 @@ def front_end_build(install_deps, genera
 
     if install_deps:
         click.echo("Running 'npm install' to install front-end dependencies from package.json")
-        subprocess.check_call(['npm', 'install'], cwd=front_end_dir)
+        # shell=True to support Windows, as the command is actually a .cmd script
+        subprocess.check_call('npm install', shell=True, cwd=front_end_dir)
 
     if generate:
         tmp_dir = os.path.join(front_end_dir, 'tmp')
@@ -59,9 +60,11 @@ def front_end_build(install_deps, genera
         lesscpath = os.path.join(front_end_dir, 'node_modules', '.bin', 'lessc')
         lesspath = os.path.join(front_end_dir, 'main.less')
         csspath = os.path.join(public_dir, 'css', 'style.css')
-        subprocess.check_call([lesscpath, '--source-map',
-                '--source-map-less-inline', lesspath, csspath],
-                cwd=front_end_dir)
+        # shell=True to support Windows, as the command is actually a .cmd script
+        subprocess.check_call(
+                '"%s" --source-map --source-map-less-inline "%s" "%s"'
+                % (lesscpath, lesspath, csspath),
+                shell=True, cwd=front_end_dir)
 
         click.echo("Preparing Bootstrap JS")
         shutil.copy(os.path.join(front_end_dir, 'node_modules', 'bootstrap', 'dist', 'js', 'bootstrap.js'), os.path.join(public_dir, 'js', 'bootstrap.js'))
@@ -90,13 +93,13 @@ def front_end_build(install_deps, genera
         shutil.copytree(os.path.join(front_end_dir, 'node_modules', 'codemirror'), os.path.join(public_dir, 'codemirror'))
 
         click.echo("Generating LICENSES.txt")
+        license_checker_path = os.path.join(front_end_dir, 'node_modules', '.bin', 'license-checker')
         check_licensing_json_path = os.path.join(tmp_dir, 'licensing.json')
         licensing_txt_path = os.path.join(public_dir, 'LICENSES.txt')
-        subprocess.check_call([
-            os.path.join(front_end_dir, 'node_modules', '.bin', 'license-checker'),
-            '--json',
-            '--out', check_licensing_json_path,
-            ], cwd=front_end_dir)
+        # shell=True to support Windows, as the command is actually a .cmd script
+        subprocess.check_call('"%s" --json --out "%s"'
+                % (license_checker_path, check_licensing_json_path),
+                shell=True, cwd=front_end_dir)
         with open(check_licensing_json_path) as jsonfile:
             rows = json.loads(jsonfile.read())
             with open(licensing_txt_path, 'w') as out:


More information about the kallithea-general mailing list