[KeepAnno] Archive javadoc as part of the build

Bug: b/248408342
Change-Id: I09f6ed01262fe27425129266de404feaf9ad64a9
diff --git a/tools/archive.py b/tools/archive.py
index fd250dd..8de974f 100755
--- a/tools/archive.py
+++ b/tools/archive.py
@@ -171,7 +171,9 @@
         if (not options.skip_gradle_build):
             gradle.RunGradle([
                 utils.GRADLE_TASK_CONSOLIDATED_LICENSE,
-                utils.GRADLE_TASK_KEEP_ANNO_JAR, utils.GRADLE_TASK_R8,
+                utils.GRADLE_TASK_KEEP_ANNO_JAR,
+                utils.GRADLE_TASK_KEEP_ANNO_DOC,
+                utils.GRADLE_TASK_R8,
                 utils.GRADLE_TASK_R8LIB, utils.GRADLE_TASK_R8LIB_NO_DEPS,
                 utils.GRADLE_TASK_THREADING_MODULE_BLOCKING,
                 utils.GRADLE_TASK_THREADING_MODULE_SINGLE_THREADED,
@@ -229,6 +231,25 @@
             '-PspdxRevision=' + GetGitHash()
         ])
 
+        # Upload directories.
+        dirs_for_archiving = [
+            (utils.KEEPANNO_ANNOTATIONS_DOC, "keepanno/javadoc"),
+        ]
+        for (src_dir, dst_dir) in dirs_for_archiving:
+            destination = GetUploadDestination(version, dst_dir, is_main)
+            print(f'Uploading {src_dir} to {destination}')
+            if options.dry_run:
+                if options.dry_run_output:
+                    dry_run_destination = os.path.join(options.dry_run_output, dst_dir)
+                    print(f'Dry run, not actually uploading. Copying to {dry_run_destination}')
+                    shutil.copytree(src_dir, dry_run_destination)
+                else:
+                    print('Dry run, not actually uploading')
+            else:
+                utils.upload_directory_to_cloud_storage(src_dir, destination)
+                print(f'Directory available at: {GetUrl(version, dst_dir, is_main)}')
+
+        # Upload files.
         for_archiving = [
             utils.R8_JAR, utils.R8LIB_JAR, utils.R8LIB_JAR + '.map',
             utils.R8LIB_JAR + '_map.zip', utils.R8_FULL_EXCLUDE_DEPS_JAR,
diff --git a/tools/utils.py b/tools/utils.py
index 597f8b1..e859748 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -43,6 +43,7 @@
 GRADLE_TASK_CLEAN_TEST = ':test:cleanTest'
 GRADLE_TASK_CONSOLIDATED_LICENSE = ':main:consolidatedLicense'
 GRADLE_TASK_KEEP_ANNO_JAR = ':keepanno:keepAnnoAnnotationsJar'
+GRADLE_TASK_KEEP_ANNO_DOC = ':keepanno:keepAnnoAnnotationsDoc'
 GRADLE_TASK_R8 = ':main:r8WithRelocatedDeps'
 GRADLE_TASK_R8LIB = ':test:assembleR8LibWithRelocatedDeps'
 GRADLE_TASK_R8LIB_NO_DEPS = ':test:assembleR8LibNoDeps'
@@ -77,6 +78,7 @@
 LIBRARY_DESUGAR_CONVERSIONS_ZIP = os.path.join(
     CUSTOM_CONVERSION_DIR, 'library_desugar_conversions.jar')
 KEEPANNO_ANNOTATIONS_JAR = os.path.join(LIBS, 'keepanno-annotations.jar')
+KEEPANNO_ANNOTATIONS_DOC = os.path.join('d8_r8', 'keepanno', 'build', 'docs', 'javadoc')
 
 DESUGAR_CONFIGURATION = os.path.join('src', 'library_desugar',
                                      'desugar_jdk_libs.json')
@@ -391,6 +393,14 @@
     PrintCmd(cmd)
     subprocess.check_call(cmd)
 
+def upload_directory_to_cloud_storage(source, destination, parallel=True):
+    cmd = [get_gsutil()]
+    if parallel:
+        cmd += ['-m']
+    cmd += ['cp', '-R']
+    cmd += [source, destination]
+    PrintCmd(cmd)
+    subprocess.check_call(cmd)
 
 def delete_file_from_cloud_storage(destination):
     cmd = [get_gsutil(), 'rm', destination]