Changeset - 5867f45810da
[Not reviewed]
default
0 1 0
Thomas De Schampheleire - 7 years ago 2019-03-18 22:25:30
thomas.de_schampheleire@nokia.com
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.

On Windows, the problem can be solved by passing 'shell=True' to subprocess.
On UNIX, we don't need shell=True and prefer shell=False.
A solution that fits both cases is 'shell=kallithea.is_windows'.

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.
1 file changed with 5 insertions and 7 deletions:
0 comments (0 inline, 0 general)
kallithea/bin/kallithea_cli_front_end.py
Show inline comments
 
@@ -39,13 +39,13 @@ def front_end_build(install_deps, genera
 
    """
 
    front_end_dir = os.path.abspath(os.path.join(kallithea.__file__, '..', 'front-end'))
 
    public_dir = os.path.abspath(os.path.join(kallithea.__file__, '..', 'public'))
 

	
 
    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)
 
        subprocess.check_call(['npm', 'install'], cwd=front_end_dir, shell=kallithea.is_windows)
 

	
 
    if generate:
 
        tmp_dir = os.path.join(front_end_dir, 'tmp')
 
        if not os.path.isdir(tmp_dir):
 
            os.mkdir(tmp_dir)
 

	
 
@@ -58,13 +58,13 @@ def front_end_build(install_deps, genera
 
                    stdout=f)
 
        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)
 
                cwd=front_end_dir, shell=kallithea.is_windows)
 

	
 
        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'))
 

	
 
        click.echo("Preparing jQuery JS with Flot, Caret and Atwho")
 
        shutil.copy(os.path.join(front_end_dir, 'node_modules', 'jquery', 'dist', 'jquery.min.js'), os.path.join(public_dir, 'js', 'jquery.min.js'))
 
@@ -87,19 +87,17 @@ def front_end_build(install_deps, genera
 
        click.echo("Preparing CodeMirror JS")
 
        if os.path.isdir(os.path.join(public_dir, 'codemirror')):
 
            shutil.rmtree(os.path.join(public_dir, 'codemirror'))
 
        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)
 
        subprocess.check_call([license_checker_path, '--json', '--out', check_licensing_json_path],
 
                cwd=front_end_dir, shell=kallithea.is_windows)
 
        with open(check_licensing_json_path) as jsonfile:
 
            rows = json.loads(jsonfile.read())
 
            with open(licensing_txt_path, 'w') as out:
 
                out.write("The Kallithea front-end was built using the following Node modules:\n\n")
 
                for name_version, values in sorted(rows.items()):
 
                    name, version = name_version.rsplit('@', 1)
0 comments (0 inline, 0 general)