# HG changeset patch
# User Thomas De Schampheleire <thomas.de_schamphele...@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:
_______________________________________________
kallithea-general mailing list
kallithea-general@sfconservancy.org
https://lists.sfconservancy.org/mailman/listinfo/kallithea-general

Reply via email to