# HG changeset patch
# User Thomas De Schampheleire <[email protected]>
# 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
[email protected]
https://lists.sfconservancy.org/mailman/listinfo/kallithea-general