Left: | ||
Right: |
OLD | NEW |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 | 2 |
3 # This Source Code Form is subject to the terms of the Mozilla Public | 3 # This Source Code Form is subject to the terms of the Mozilla Public |
4 # License, v. 2.0. If a copy of the MPL was not distributed with this | 4 # License, v. 2.0. If a copy of the MPL was not distributed with this |
5 # file, You can obtain one at http://mozilla.org/MPL/2.0/. | 5 # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
6 | 6 |
7 import sys | 7 import sys |
8 import os | 8 import os |
9 import posixpath | 9 import posixpath |
10 import re | 10 import re |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
239 raise Exception('Dependency path %s cannot be absolute' % subpath) | 239 raise Exception('Dependency path %s cannot be absolute' % subpath) |
240 if normpath == posixpath.pardir or normpath.startswith(posixpath.pardir + po sixpath.sep): | 240 if normpath == posixpath.pardir or normpath.startswith(posixpath.pardir + po sixpath.sep): |
241 raise Exception('Dependency path %s has to be inside the repository' % s ubpath) | 241 raise Exception('Dependency path %s has to be inside the repository' % s ubpath) |
242 return os.path.join(path, *normpath.split(posixpath.sep)) | 242 return os.path.join(path, *normpath.split(posixpath.sep)) |
243 | 243 |
244 | 244 |
245 def get_repo_type(repo): | 245 def get_repo_type(repo): |
246 for name, repotype in repo_types.iteritems(): | 246 for name, repotype in repo_types.iteritems(): |
247 if repotype.istype(repo): | 247 if repotype.istype(repo): |
248 return name | 248 return name |
249 return 'hg' | 249 return None |
250 | 250 |
251 | 251 |
252 def resolve_npm_dependencies(target, vcs): | 252 def resolve_npm_dependencies(target, vcs): |
253 """Install Node.js production-only dependencies if necessary and desired. | 253 """Install Node.js production-only dependencies if necessary and desired. |
254 | 254 |
255 When the target dependency has additional Node.js dependencies declared | 255 When the target dependency has additional Node.js dependencies declared |
256 run "npm install --only=production --loglevel=warn" to resolve the declared | 256 run "npm install --only=production --loglevel=warn" to resolve the declared |
257 dependencies. | 257 dependencies. |
258 | 258 |
259 Additionally, make sure that any VCS will ignore the installed files. | 259 Additionally, make sure that any VCS will ignore the installed files. |
(...skipping 24 matching lines...) Expand all Loading... | |
284 # Node.js only provides a npm.cmd, which is executable but won't | 284 # Node.js only provides a npm.cmd, which is executable but won't |
285 # be recognized as such by CreateProcess(). | 285 # be recognized as such by CreateProcess(). |
286 npm_exec = 'npm.cmd' | 286 npm_exec = 'npm.cmd' |
287 else: | 287 else: |
288 npm_exec = 'npm' | 288 npm_exec = 'npm' |
289 | 289 |
290 cmd = [npm_exec, 'install', '--only=production', '--loglevel=warn', | 290 cmd = [npm_exec, 'install', '--only=production', '--loglevel=warn', |
291 '--no-package-lock', '--no-optional'] | 291 '--no-package-lock', '--no-optional'] |
292 subprocess.check_output(cmd, cwd=target) | 292 subprocess.check_output(cmd, cwd=target) |
293 | 293 |
294 repo_types[vcs].ignore(os.path.join(target, NPM_LOCKFILE), target) | 294 if vcs: |
295 repo_types[vcs].ignore(os.path.join(target, 'node_modules'), target) | 295 repo_types[vcs].ignore(os.path.join(target, NPM_LOCKFILE), target) |
296 repo_types[vcs].ignore(os.path.join(target, 'node_modules'), target) | |
296 | 297 |
297 os.remove(lockfile_path) | 298 os.remove(lockfile_path) |
298 except OSError as e: | 299 except OSError as e: |
299 import errno | 300 import errno |
300 if e.errno == errno.ENOENT: | 301 if e.errno == errno.ENOENT: |
301 logging.error('Failed to install Node.js dependencies for %s,' | 302 logging.error('Failed to install Node.js dependencies for %s,' |
302 ' please ensure Node.js is installed.', target) | 303 ' please ensure Node.js is installed.', target) |
303 else: | 304 else: |
304 raise | 305 raise |
305 | 306 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
344 resolved_revision = repo_types[type].get_revision_id(target, revisio n) | 345 resolved_revision = repo_types[type].get_revision_id(target, revisio n) |
345 if not resolved_revision: | 346 if not resolved_revision: |
346 raise Exception('Failed to resolve revision %s' % revision) | 347 raise Exception('Failed to resolve revision %s' % revision) |
347 | 348 |
348 logging.info('Updating repository %s to revision %s' % (target, resolved _revision)) | 349 logging.info('Updating repository %s to revision %s' % (target, resolved _revision)) |
349 repo_types[type].update(target, resolved_revision, revision) | 350 repo_types[type].update(target, resolved_revision, revision) |
350 return True | 351 return True |
351 return False | 352 return False |
352 | 353 |
353 | 354 |
354 def resolve_deps(repodir, level=0, self_update=True, overrideroots=None, skipdep endencies=set()): | 355 def resolve_deps(repodir, repotype, level=0, self_update=True, overrideroots=Non e, skipdependencies=set()): |
tlucas
2018/08/29 21:19:14
Nit: please break after 79, when touching this any
Sebastian Noack
2018/08/30 00:42:33
Done.
| |
355 config = read_deps(repodir) | 356 config = read_deps(repodir) |
356 if config is None: | 357 if config is None: |
357 if level == 0: | 358 if level == 0: |
358 logging.warning('No dependencies file in directory %s, nothing to do ...\n%s' % (repodir, USAGE)) | 359 logging.warning('No dependencies file in directory %s, nothing to do ...\n%s' % (repodir, USAGE)) |
359 return | 360 return |
360 if level >= 10: | 361 if level >= 10: |
361 logging.warning('Too much subrepository nesting, ignoring %s' % repo) | 362 logging.warning('Too much subrepository nesting, ignoring %s' % repo) |
362 return | 363 return |
363 | 364 |
364 if overrideroots is not None: | 365 if overrideroots is not None: |
365 config['_root'] = overrideroots | 366 config['_root'] = overrideroots |
366 | 367 |
367 for dir, sources in sorted(config.iteritems()): | 368 for dir, sources in sorted(config.iteritems()): |
368 if (dir.startswith('_') or | 369 if (dir.startswith('_') or |
369 skipdependencies.intersection([s[0] for s in sources if s[0]])): | 370 skipdependencies.intersection([s[0] for s in sources if s[0]])): |
370 continue | 371 continue |
371 | 372 |
372 target = safe_join(repodir, dir) | 373 target = safe_join(repodir, dir) |
373 parenttype = get_repo_type(repodir) | 374 parenttype = repotype or 'hg' |
374 _root = config.get('_root', {}) | 375 _root = config.get('_root', {}) |
375 | 376 |
376 for key in sources.keys() + _root.keys(): | 377 for key in sources.keys() + _root.keys(): |
377 if key == parenttype or key is None and vcs != '*': | 378 if key == parenttype or key is None and vcs != '*': |
378 vcs = key | 379 vcs = key |
379 source, rev = merge_seqs(sources.get('*'), sources.get(vcs)) | 380 source, rev = merge_seqs(sources.get('*'), sources.get(vcs)) |
380 | 381 |
381 if not (vcs and source and rev): | 382 if not (vcs and source and rev): |
382 logging.warning('No valid source / revision found to create %s' % ta rget) | 383 logging.warning('No valid source / revision found to create %s' % ta rget) |
383 continue | 384 continue |
384 | 385 |
385 repo_cloned = ensure_repo(repodir, parenttype, target, vcs, | 386 repo_cloned = ensure_repo(repodir, parenttype, target, vcs, |
386 _root.get(vcs, ''), source) | 387 _root.get(vcs, ''), source) |
387 repo_updated = update_repo(target, vcs, rev) | 388 if repo_types[vcs].istype(target): |
389 repo_updated = update_repo(target, vcs, rev) | |
390 npm_outdated = repo_cloned or repo_updated | |
391 else: | |
392 vcs = None | |
393 npm_outdated = not os.path.exists(os.path.join(target, 'node_modules ')) | |
tlucas
2018/08/29 21:19:14
Nit: Please break after 79 characters.
Sebastian Noack
2018/08/30 00:42:33
Done.
| |
394 | |
388 recent_npm_failed = os.path.exists(os.path.join(target, NPM_LOCKFILE)) | 395 recent_npm_failed = os.path.exists(os.path.join(target, NPM_LOCKFILE)) |
389 if repo_cloned or repo_updated or recent_npm_failed: | 396 if npm_outdated or recent_npm_failed: |
390 resolve_npm_dependencies(target, vcs) | 397 resolve_npm_dependencies(target, vcs) |
391 resolve_deps(target, level + 1, self_update=False, | 398 |
399 resolve_deps(target, vcs, level + 1, self_update=False, | |
392 overrideroots=overrideroots, skipdependencies=skipdependenc ies) | 400 overrideroots=overrideroots, skipdependencies=skipdependenc ies) |
393 | 401 |
394 if self_update and '_self' in config and '*' in config['_self']: | 402 if self_update and '_self' in config and '*' in config['_self']: |
395 source = safe_join(repodir, config['_self']['*']) | 403 source = safe_join(repodir, config['_self']['*']) |
396 try: | 404 try: |
397 with io.open(source, 'rb') as handle: | 405 with io.open(source, 'rb') as handle: |
398 sourcedata = handle.read() | 406 sourcedata = handle.read() |
399 except IOError as e: | 407 except IOError as e: |
400 if e.errno != errno.ENOENT: | 408 if e.errno != errno.ENOENT: |
401 raise | 409 raise |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
437 parser.add_argument('-q', '--quiet', action='store_true', help='Suppress inf ormational output') | 445 parser.add_argument('-q', '--quiet', action='store_true', help='Suppress inf ormational output') |
438 args = parser.parse_args() | 446 args = parser.parse_args() |
439 | 447 |
440 if args.quiet: | 448 if args.quiet: |
441 logging.disable(logging.INFO) | 449 logging.disable(logging.INFO) |
442 | 450 |
443 repos = args.repos | 451 repos = args.repos |
444 if not len(repos): | 452 if not len(repos): |
445 repos = [os.path.dirname(__file__)] | 453 repos = [os.path.dirname(__file__)] |
446 for repo in repos: | 454 for repo in repos: |
447 resolve_deps(repo) | 455 resolve_deps(repo, get_repo_type(repo)) |
OLD | NEW |