OLD | NEW |
1 # Copyright 2015 The LUCI Authors. All rights reserved. | 1 # Copyright 2015 The LUCI Authors. All rights reserved. |
2 # Use of this source code is governed under the Apache License, Version 2.0 | 2 # Use of this source code is governed under the Apache License, Version 2.0 |
3 # that can be found in the LICENSE file. | 3 # that can be found in the LICENSE file. |
4 | 4 |
5 import ast | 5 import ast |
6 import collections | 6 import collections |
7 import contextlib | 7 import contextlib |
8 import copy | 8 import copy |
9 import difflib | 9 import difflib |
10 import functools | 10 import functools |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 return False | 343 return False |
344 return self._proto_file == other._proto_file | 344 return self._proto_file == other._proto_file |
345 | 345 |
346 | 346 |
347 class Package(object): | 347 class Package(object): |
348 """Package represents a loaded package, and contains path and dependency | 348 """Package represents a loaded package, and contains path and dependency |
349 information. | 349 information. |
350 | 350 |
351 This is accessed by loader.py through RecipeDeps.get_package. | 351 This is accessed by loader.py through RecipeDeps.get_package. |
352 """ | 352 """ |
353 def __init__(self, name, repo_spec, deps, repo_root, recipes_dir): | 353 def __init__(self, name, repo_spec, deps, repo_root, relative_recipes_dir): |
354 self.name = name | 354 self.name = name |
355 self.repo_spec = repo_spec | 355 self.repo_spec = repo_spec |
356 self.deps = deps | 356 self.deps = deps |
357 self.repo_root = repo_root | 357 self.repo_root = repo_root |
358 self.recipes_dir = recipes_dir | 358 self.relative_recipes_dir = relative_recipes_dir |
359 | 359 |
360 def __repr__(self): | 360 def __repr__(self): |
361 return '<Package(name=%r,repo_spec=%r,deps=%r,recipes_dir=%r)>' % ( | 361 return '<Package(name=%r,repo_spec=%r,deps=%r,recipes_dir=%r)>' % ( |
362 self.name, self.repo_spec, self.deps, self.recipes_dir) | 362 self.name, self.repo_spec, self.deps, self.recipes_dir) |
363 | 363 |
364 @property | 364 @property |
| 365 def recipes_dir(self): |
| 366 return os.path.join(self.repo_root, self.relative_recipes_dir) |
| 367 |
| 368 @property |
365 def recipe_dirs(self): | 369 def recipe_dirs(self): |
366 return [os.path.join(self.recipes_dir, 'recipes')] | 370 return [os.path.join(self.recipes_dir, 'recipes')] |
367 | 371 |
368 @property | 372 @property |
369 def module_dirs(self): | 373 def module_dirs(self): |
370 return [os.path.join(self.recipes_dir, 'recipe_modules')] | 374 return [os.path.join(self.recipes_dir, 'recipe_modules')] |
371 | 375 |
372 def find_dep(self, dep_name): | 376 def find_dep(self, dep_name): |
373 if dep_name == self.name: | 377 if dep_name == self.name: |
374 return self | 378 return self |
375 | 379 |
376 assert dep_name in self.deps, ( | 380 assert dep_name in self.deps, ( |
377 '%s does not exist or is not declared as a dependency of %s' % ( | 381 '%s does not exist or is not declared as a dependency of %s' % ( |
378 dep_name, self.name)) | 382 dep_name, self.name)) |
379 return self.deps[dep_name] | 383 return self.deps[dep_name] |
380 | 384 |
381 def module_path(self, module_name): | 385 def module_path(self, module_name): |
382 return os.path.join(self.recipes_dir, 'recipe_modules', module_name) | 386 return os.path.join(self.recipes_dir, 'recipe_modules', module_name) |
383 | 387 |
384 def loop_over_recipe_modules(): | |
385 for path in self.module_dirs: | |
386 if os.path.isdir(path): | |
387 for item in os.listdir(path): | |
388 subpath = os.path.join(path, item) | |
389 if _is_recipe_module_dir(subpath): | |
390 yield subpath | |
391 | |
392 def __repr__(self): | 388 def __repr__(self): |
393 return 'Package(%r, %r, %r, %r)' % ( | 389 return 'Package(%r, %r, %r, %r)' % ( |
394 self.name, self.repo_spec, self.deps, self.recipe_dirs) | 390 self.name, self.repo_spec, self.deps, self.recipe_dirs) |
395 | 391 |
396 def __str__(self): | 392 def __str__(self): |
397 return 'Package %s, with dependencies %s' % (self.name, self.deps.keys()) | 393 return 'Package %s, with dependencies %s' % (self.name, self.deps.keys()) |
398 | 394 |
399 | 395 |
400 class RollCandidate(object): | 396 class RollCandidate(object): |
401 """RollCandidate represents a recipe roll candidate, i.e. updates | 397 """RollCandidate represents a recipe roll candidate, i.e. updates |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
644 self._packages[project_id] = None | 640 self._packages[project_id] = None |
645 | 641 |
646 deps = {} | 642 deps = {} |
647 for dep, dep_repo in sorted(package_spec.deps.items()): | 643 for dep, dep_repo in sorted(package_spec.deps.items()): |
648 dep_repo = self._overrides.get(dep, dep_repo) | 644 dep_repo = self._overrides.get(dep, dep_repo) |
649 deps[dep] = self._create_package(dep_repo) | 645 deps[dep] = self._create_package(dep_repo) |
650 | 646 |
651 package = Package( | 647 package = Package( |
652 project_id, repo_spec, deps, | 648 project_id, repo_spec, deps, |
653 repo_spec.repo_root(self._context), | 649 repo_spec.repo_root(self._context), |
654 os.path.join(repo_spec.repo_root(self._context), | 650 package_spec.recipes_path) |
655 package_spec.recipes_path)) | |
656 | 651 |
657 self._packages[project_id] = package | 652 self._packages[project_id] = package |
658 return package | 653 return package |
659 | 654 |
660 # TODO(luqui): Remove this, so all accesses to packages are done | 655 # TODO(luqui): Remove this, so all accesses to packages are done |
661 # via other packages with properly scoped deps. | 656 # via other packages with properly scoped deps. |
662 def get_package(self, package_id): | 657 def get_package(self, package_id): |
663 return self._packages[package_id] | 658 return self._packages[package_id] |
664 | 659 |
665 @property | 660 @property |
(...skipping 12 matching lines...) Expand all Loading... |
678 >>> d = { 'x': 1, 'y': 2 } | 673 >>> d = { 'x': 1, 'y': 2 } |
679 >>> sorted(_updated(d, { 'y': 3, 'z': 4 }).items()) | 674 >>> sorted(_updated(d, { 'y': 3, 'z': 4 }).items()) |
680 [('x', 1), ('y', 3), ('z', 4)] | 675 [('x', 1), ('y', 3), ('z', 4)] |
681 >>> sorted(d.items()) | 676 >>> sorted(d.items()) |
682 [('x', 1), ('y', 2)] | 677 [('x', 1), ('y', 2)] |
683 """ | 678 """ |
684 | 679 |
685 d = copy.copy(d) | 680 d = copy.copy(d) |
686 d.update(updates) | 681 d.update(updates) |
687 return d | 682 return d |
OLD | NEW |