28e7a6d3fe
* npm_binary (download tarball packaged npm apps) * bower_archive (download a zip file, to be put in WORKSPACE) * bower_component (defining a bower library, with dependency ) * bower_component_bundle (zipping up libraries together) * js_component (insert plain js file into bower component bundle) * bower2bazel.py: run bower to find dependencies, generate a .bzl to define archives and define components Tested: python tools/js/bower2bazel.py -w lib/js/bower_archives.bzl -b \ lib/js/bower_components.bzl bazel build polygerrit-ui:components unzip -v bazel-bin/polygerrit-ui/components.zip > /tmp/baz buck build polygerrit-ui:polygerrit_components unzip -v buck-out/gen/polygerrit-ui/polygerrit_components/polygerrit_components.bower_components.zip > /tmp/buck diff /tmp/buck /tmp/baz The diff corresponds to newer file versions pinned through bower2bazel. Change-Id: I4f33914d4853bcf8afe78b4719d0e0e83b139031
92 lines
2.6 KiB
Python
92 lines
2.6 KiB
Python
#!/usr/bin/env python
|
|
# Copyright (C) 2015 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
from __future__ import print_function
|
|
|
|
import atexit
|
|
from distutils import spawn
|
|
import hashlib
|
|
import os
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
import tarfile
|
|
import tempfile
|
|
|
|
|
|
def extract(path, outdir, bin):
|
|
if os.path.exists(os.path.join(outdir, bin)):
|
|
return # Another process finished extracting, ignore.
|
|
|
|
# Use a temp directory adjacent to outdir so shutil.move can use the same
|
|
# device atomically.
|
|
tmpdir = tempfile.mkdtemp(dir=os.path.dirname(outdir))
|
|
def cleanup():
|
|
try:
|
|
shutil.rmtree(tmpdir)
|
|
except OSError:
|
|
pass # Too late now
|
|
atexit.register(cleanup)
|
|
|
|
def extract_one(mem):
|
|
dest = os.path.join(outdir, mem.name)
|
|
tar.extract(mem, path=tmpdir)
|
|
try:
|
|
os.makedirs(os.path.dirname(dest))
|
|
except OSError:
|
|
pass # Either exists, or will fail on the next line.
|
|
shutil.move(os.path.join(tmpdir, mem.name), dest)
|
|
|
|
with tarfile.open(path, 'r:gz') as tar:
|
|
for mem in tar.getmembers():
|
|
if mem.name != bin:
|
|
extract_one(mem)
|
|
# Extract bin last so other processes only short circuit when extraction is
|
|
# finished.
|
|
extract_one(tar.getmember(bin))
|
|
|
|
def main(args):
|
|
path = args[0]
|
|
suffix = '.npm_binary.tgz'
|
|
tgz = os.path.basename(path)
|
|
|
|
parts = tgz[:-len(suffix)].split('@')
|
|
|
|
if not tgz.endswith(suffix) or len(parts) != 2:
|
|
print('usage: %s <path/to/npm_binary>' % sys.argv[0], file=sys.stderr)
|
|
return 1
|
|
|
|
name, _ = parts
|
|
|
|
# Avoid importing from gerrit because we don't want to depend on the right CWD.
|
|
sha1 = hashlib.sha1(open(path, 'rb').read()).hexdigest()
|
|
outdir = '%s-%s' % (path[:-len(suffix)], sha1)
|
|
rel_bin = os.path.join('package', 'bin', name)
|
|
bin = os.path.join(outdir, rel_bin)
|
|
if not os.path.isfile(bin):
|
|
extract(path, outdir, rel_bin)
|
|
|
|
nodejs = spawn.find_executable('nodejs')
|
|
if nodejs:
|
|
# Debian installs Node.js as 'nodejs', due to a conflict with another
|
|
# package.
|
|
subprocess.check_call([nodejs, bin] + args[1:])
|
|
else:
|
|
subprocess.check_call([bin] + args[1:])
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main(sys.argv[1:]))
|