Revert "get_masters: protect against infinite recursion"
authorZac Medico <zmedico@gentoo.org>
Sun, 9 Oct 2011 18:57:31 +0000 (11:57 -0700)
committerZac Medico <zmedico@gentoo.org>
Sun, 9 Oct 2011 18:57:31 +0000 (11:57 -0700)
This reverts commit 5628dac1538985af640102654bce60a8e526daeb.
Reverting all masters recursion code for now (see bug #386569).

pym/portage/repository/config.py

index c5da4f6cfe74b907a75dbd69b809b5b81f89cabc..1d042ac0e953410414790349eaf5d30b4c5c7328 100644 (file)
@@ -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():