Use regular emerge for updating Portage itself.
When updating Portage itself, we should use emerge for the upgrade so
that we can rely on the built-in logic for making sure no new modules
are loaded in after the install. This helps avoid the following
traceback when upgrading to Portage 2.1.11.31:
pym/portage/package/ebuild/getmaskingreason.py line 14:
from portage.versions import catpkgsplit, _pkg_str
ImportError: cannot import name _pkg_str
BUG=chromium-os:35982
TEST=Install old version of portage, then use build_packages to install
new version of Portage. Prior to this change, we get a traceback.
After the change, the upgrade works. Also run trybots on all
platforms.
Change-Id: I1af98f89b50b2f23ffc72d7872d795a3e240fc45
Reviewed-on: https://gerrit.chromium.org/gerrit/37295
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Commit-Ready: David James <davidjames@chromium.org>
Tested-by: David James <davidjames@chromium.org>
diff --git a/scripts/parallel_emerge.py b/scripts/parallel_emerge.py
index 4f4d634..6a861c2 100644
--- a/scripts/parallel_emerge.py
+++ b/scripts/parallel_emerge.py
@@ -1630,14 +1630,31 @@
if root == "/":
for db_pkg in final_db.match_pkgs("sys-apps/portage"):
portage_pkg = deps_graph.get(db_pkg.cpv)
- if portage_pkg and len(deps_graph) > 1:
- portage_pkg["needs"].clear()
- portage_pkg["provides"].clear()
- deps_graph = { str(db_pkg.cpv): portage_pkg }
+ if portage_pkg:
portage_upgrade = True
if "--quiet" not in emerge.opts:
print "Upgrading portage first, then restarting..."
+ # Upgrade Portage first, then the rest of the packages.
+ #
+ # In order to grant the child permission to run setsid, we need to run sudo
+ # again. We preserve SUDO_USER here in case an ebuild depends on it.
+ if portage_upgrade:
+ # Calculate what arguments to use when re-invoking.
+ args = ["sudo", "-E", "SUDO_USER=%s" % os.environ.get("SUDO_USER", "")]
+ args += [os.path.abspath(sys.argv[0])] + parallel_emerge_args
+ args += ["--exclude=sys-apps/portage"]
+
+ # First upgrade Portage.
+ passthrough_args = ("--quiet", "--pretend", "--verbose")
+ emerge_args = [k for k in emerge.opts if k in passthrough_args]
+ ret = emerge_main(emerge_args + ["portage"])
+ if ret != 0:
+ return ret
+
+ # Now upgrade the rest.
+ os.execvp(args[0], args)
+
# Run the queued emerges.
scheduler = EmergeQueue(deps_graph, emerge, deps.package_db, deps.show_output)
try:
@@ -1646,17 +1663,6 @@
scheduler._Shutdown()
scheduler = None
- # If we already upgraded portage, we don't need to do so again. But we do
- # need to upgrade the rest of the packages. So we'll go ahead and do that.
- #
- # In order to grant the child permission to run setsid, we need to run sudo
- # again. We preserve SUDO_USER here in case an ebuild depends on it.
- if portage_upgrade:
- args = ["sudo", "-E", "SUDO_USER=%s" % os.environ.get("SUDO_USER", "")]
- args += [os.path.abspath(sys.argv[0])] + parallel_emerge_args
- args += ["--exclude=sys-apps/portage"]
- os.execvp("sudo", args)
-
clean_logs(emerge.settings)
print "Done"