cargo2ebuild.py: Generate ebuilds for all crates in a workspace

BUG=none
TEST=verify that scripts generates build for all crates in a
  workspace (for example, parking_lot).

Change-Id: I680e9e25fb6b62ea57d2fbda6a70e71d03fff92c
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/dev-util/+/3322714
Reviewed-by: Allen Webb <allenwebb@google.com>
Commit-Queue: Kristian Kristensen <hoegsberg@chromium.org>
Tested-by: Kristian Kristensen <hoegsberg@chromium.org>
diff --git a/contrib/cargo2ebuild.py b/contrib/cargo2ebuild.py
index 1964bdd..69245e5 100755
--- a/contrib/cargo2ebuild.py
+++ b/contrib/cargo2ebuild.py
@@ -316,7 +316,7 @@
 
         # The crate that will be initially checked when flattening the depgraph into a list of required and optional
         # crates.
-        self.root = None
+        self.roots = []
 
     def add_package(self, package):
         """Add a crate to the dependency graph from a parsed metadata.json generated by cargo.
@@ -425,9 +425,9 @@
                     logging.debug("Found ebuild: '%s'.", efile_path[len(target_dir):])
                     available[version] = features
 
-    def set_root(self, package):
-        """Set the root of the dependency graph used when flattening the graph into a list of dependencies."""
-        self.root = package
+    def add_root(self, package):
+        """Add a root of the dependency graph used when flattening the graph into a list of dependencies."""
+        self.roots.append(package)
 
     def resolve_version_range(self, name, version_range):
         """Find a dependency graph entry that fits the constraints.
@@ -561,7 +561,7 @@
         # (name, version) -> set(features)
         required = defaultdict(set)
         optional = defaultdict(set)
-        remaining = [(self.root, {'default'})]
+        remaining = [(root, {'default'}) for root in self.roots]
         while remaining:
             to_check, features = remaining.pop(0)
             name = to_check['name']
@@ -908,7 +908,7 @@
 
     # Add the user submitted package to the set of required packages.
     if package.get('source', None) is None:
-        dep_graph.set_root(package)
+        dep_graph.add_root(package)
     filter_target, crate_dependencies = dep_graph.add_package(package)
 
     download_package(package, staging_dir)