[sdk] Use rsync instead of cp to upload dartdoc (main branch)

gsutil cp behaves differently if the directory already exists causing
the latest folder to have a gen-dartdocs subfolder instead of being
replaced.

gsutil rsync doesn't have this problem and also removes extra files.

Similar to https://dart-review.googlesource.com/c/recipes/+/373700 but for the main branch.

Bug: b/320447980
Change-Id: Ie75576dda469352c962075de95e822fbfc62e275
Reviewed-on: https://dart-review.googlesource.com/c/recipes/+/373702
Commit-Queue: Alexander Thomas <athom@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Auto-Submit: Alexander Thomas <athom@google.com>
diff --git a/recipes/release/sdk.expected/dart-sdk-win-main.json b/recipes/release/sdk.expected/dart-sdk-win-main.json
index 5f5d9a2..a8bb7ed 100644
--- a/recipes/release/sdk.expected/dart-sdk-win-main.json
+++ b/recipes/release/sdk.expected/dart-sdk-win-main.json
@@ -1896,7 +1896,8 @@
       "RECIPE_REPO[depot_tools]\\gsutil.py",
       "----",
       "-m",
-      "cp",
+      "rsync",
+      "-d",
       "-r",
       "[START_DIR]\\sdk\\out\\ReleaseX64\\gen-dartdocs",
       "gs://dartlang-api-docs/gen-dartdocs/main/18df0aae67183931b1b6d5d12cc04d89f7137919"
@@ -1926,7 +1927,8 @@
       "RECIPE_REPO[depot_tools]\\gsutil.py",
       "----",
       "-m",
-      "cp",
+      "rsync",
+      "-d",
       "-r",
       "[START_DIR]\\sdk\\out\\ReleaseX64\\gen-dartdocs",
       "gs://dart-api-documentation/main/18df0aae67183931b1b6d5d12cc04d89f7137919"
@@ -1956,7 +1958,8 @@
       "RECIPE_REPO[depot_tools]\\gsutil.py",
       "----",
       "-m",
-      "cp",
+      "rsync",
+      "-d",
       "-r",
       "[START_DIR]\\sdk\\out\\ReleaseX64\\gen-dartdocs",
       "gs://dart-api-documentation/main/latest"
diff --git a/recipes/release/sdk.py b/recipes/release/sdk.py
index fac37b5..f7a5cd0 100644
--- a/recipes/release/sdk.py
+++ b/recipes/release/sdk.py
@@ -199,9 +199,10 @@
       name=f'upload VERSION ({subdir})')
 
 
-def _publish_dartdoc(api, commit, channel, dartdocs_path, base):
-  dartdocs_gs_dir = f'{base}/{channel}/{commit}'
-  api.gsutil(['-m', 'cp', '-r', dartdocs_path, dartdocs_gs_dir],
+def _publish_main_dartdoc(api, commit, dartdocs_path, base):
+  assert (commit)
+  dartdocs_gs_dir = f'{base}/main/{commit}'
+  api.gsutil(['-m', 'rsync', '-d', '-r', dartdocs_path, dartdocs_gs_dir],
              name='publish dartdoc')
 
 
@@ -246,10 +247,9 @@
   out_path = sdk_dir.join(_build_root(api)).join(_build_conf(api, arch))
   dartdocs_path = out_path.join('gen-dartdocs')
   if properties.dartdoc_arch and version.channel == 'main':
-    _publish_dartdoc(api, commit, channel, dartdocs_path,
-                     DARTDOC_LEGACY_BASE_URL)
-    _publish_dartdoc(api, commit, channel, dartdocs_path, DARTDOC_BASE_URL)
-    _publish_dartdoc(api, 'latest', channel, dartdocs_path, DARTDOC_BASE_URL)
+    _publish_main_dartdoc(api, commit, dartdocs_path, DARTDOC_LEGACY_BASE_URL)
+    _publish_main_dartdoc(api, commit, dartdocs_path, DARTDOC_BASE_URL)
+    _publish_main_dartdoc(api, 'latest', dartdocs_path, DARTDOC_BASE_URL)
     latest_path = sdk_dir.join('latest.txt')
     api.file.write_text('write dartdoc latest.txt', latest_path, commit)
     api.gsutil.upload(