dockerbuild: synthetic packages by mistake did not specify any dependencies.

That lead to no packages getting fetched when the umbrella package is fetched. Fix it with Requires-Dist.

Bug: b/491263752
Change-Id: I62edf2ad69b653544fe2c2ef9050485d6a6a6964
Reviewed-on: https://chromium-review.googlesource.com/c/infra/infra/+/7911682
Reviewed-by: Junji Watanabe <jwata@google.com>
Commit-Queue: Alex Ovsienko <ovsienko@google.com>
Commit-Queue: Junji Watanabe <jwata@google.com>
Auto-Submit: Alex Ovsienko <ovsienko@google.com>
Cr-Commit-Position: refs/heads/main@{#81124}
diff --git a/infra/tools/dockerbuild/ar.py b/infra/tools/dockerbuild/ar.py
index 2b562a2..c77382e0 100644
--- a/infra/tools/dockerbuild/ar.py
+++ b/infra/tools/dockerbuild/ar.py
@@ -56,8 +56,9 @@
           'Failed to query Artifact Registry for duplicate check: %s', e)
       return False
 
-  def upload(self, upload_wheels, wheel, dryrun=False):
+  def upload(self, upload_wheels, wheel, dryrun=False, all_wheels=None):
     """Uploads wheels to the Artifact Registry."""
+    all_wheels = all_wheels if all_wheels is not None else upload_wheels
     with self._system.temp_subdir('ar_upload_%s_%s' % wheel.spec.tuple) as tdir:
       for w in upload_wheels:
         orig_path = w.path(self._system.wheel_dir)
@@ -76,9 +77,17 @@
         else:
           # If the original wheel doesn't exist, we assume it's a metapackage
           # umbrella wheel (e.g. MultiWheel output) and synthesize a dummy one.
-          patch_wheel.create_dummy_wheel(pep427_path,
-                                         w.spec.name.replace('-', '_'),
-                                         w.pep440_version)
+          reqs = [
+              f"{sub_w.spec.name.replace('-', '_')} == {sub_w.pep440_version}"
+              for sub_w in all_wheels
+              if sub_w != w
+          ]
+          patch_wheel.create_dummy_wheel(
+              pep427_path,
+              w.spec.name.replace('-', '_'),
+              w.pep440_version,
+              requirements=reqs,
+          )
 
         if dryrun:
           util.LOGGER.info(
diff --git a/infra/tools/dockerbuild/dockerbuild.py b/infra/tools/dockerbuild/dockerbuild.py
index a1f617d..da88c16 100644
--- a/infra/tools/dockerbuild/dockerbuild.py
+++ b/infra/tools/dockerbuild/dockerbuild.py
@@ -257,7 +257,9 @@
 
   # When we register it, we want to attach all tags.
   system.cipd.register_package(pkg_path, package.tags, dryrun=dryrun)
-  system.ar.upload(upload_wheels, wheel, dryrun=dryrun_ar)
+  system.ar.upload(
+      upload_wheels, wheel, dryrun=dryrun_ar, all_wheels=built_wheels
+  )
 
   # Note packages that we've updated so we can update all the refs.
   # Concurrently updating this set is fine is each operation is independent and
diff --git a/infra/tools/dockerbuild/patch_wheel.py b/infra/tools/dockerbuild/patch_wheel.py
index ee5dba8..0b27d72 100644
--- a/infra/tools/dockerbuild/patch_wheel.py
+++ b/infra/tools/dockerbuild/patch_wheel.py
@@ -18,19 +18,23 @@
 
 
 def create_dummy_wheel(wheel_path: str, escaped_name: str,
-                       version: str) -> None:
+                       version: str, requirements: Optional[list[str]] = None) -> None:
   """Creates a dummy metapackage wheel containing only METADATA and WHEEL files.
 
   Args:
     wheel_path: Path where the new dummy wheel should be written.
     escaped_name: The escaped package name (e.g. pyobjc).
     version: The version string.
+    requirements: Optional list of package requirement strings.
   """
   dist_info_dir = f"{escaped_name}-{version}.dist-info"
   metadata_content = ("Metadata-Version: 2.1\n"
                       f"Name: {escaped_name}\n"
                       f"Version: {version}\n"
                       "Summary: Dummy metapackage wheel\n")
+  if requirements:
+    for req in requirements:
+      metadata_content += f"Requires-Dist: {req}\n"
   wheel_content = ("Wheel-Version: 1.0\n"
                    "Root-Is-Purelib: true\n"
                    "Tag: py2-none-any\n"