 28e7a6d3fe
			
		
	
	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:]))
 |