diff options
-rw-r--r-- | pym/portage/repository/config.py | 53 |
1 files changed, 23 insertions, 30 deletions
diff --git a/pym/portage/repository/config.py b/pym/portage/repository/config.py index c5da4f6cf..1d042ac0e 100644 --- a/pym/portage/repository/config.py +++ b/pym/portage/repository/config.py @@ -484,45 +484,38 @@ class RepoConfigLoader(object): self._prepos_changed = True self._repo_location_list = [] - def get_masters(start_repo): + def get_masters(repo_name, repo, recurse=True): master_repos = [] - stack = [start_repo] - traversed = set() - while stack: - repo = stack.pop() - if repo.name in traversed: - continue - traversed.add(repo.name) - if repo is not start_repo: - master_repos.append(repo) - if repo.masters is None: - main_repo = self.mainRepo() - if main_repo is not None and \ - main_repo is not start_repo: - stack.append(main_repo) + if repo.masters is None: + if self.mainRepo() and repo_name != self.mainRepo().name: + master_repos = [self.mainRepo()] else: - for master in repo.masters: - if isinstance(master, RepoConfig): - stack.append(master) + master_repos = [] + else: + for master in repo.masters: + if isinstance(master, RepoConfig): + master_repos.append(master) + else: + if master not in prepos: + layout_filename = os.path.join(repo.user_location, + "metadata", "layout.conf") + writemsg_level(_("Unavailable repository '%s' " \ + "referenced by masters entry in '%s'\n") % \ + (master_name, layout_filename), + level=logging.ERROR, noiselevel=-1) else: - if master not in prepos: - layout_filename = os.path.join(repo.user_location, - "metadata", "layout.conf") - writemsg_level(_("Unavailable repository '%s' " \ - "referenced by masters entry in '%s'\n") % \ - (master, layout_filename), - level=logging.ERROR, noiselevel=-1) + master = prepos[master] + if recurse: + master_repos.extend(get_masters(master.name, master) + [master]) else: - stack.append(prepos[master]) - - master_repos.reverse() - return tuple(master_repos) + master_repos.append(master) + return master_repos #The 'masters' key currently contains repo names. Replace them with the matching RepoConfig. for repo_name, repo in prepos.items(): if repo_name == "DEFAULT": continue - repo.masters = get_masters(repo) + repo.masters = tuple(get_masters(repo_name, repo)) #The 'eclass_overrides' key currently contains repo names. Replace them with the matching repo paths. for repo_name, repo in prepos.items(): |