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"