Prepare release scripts for new JDK-11 desugared library variants

Bug: b/222647019
Change-Id: I87da0208803346413e09ef31fef228a6121ec486
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java
index c9c9a31..c4ef343 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java
@@ -16,6 +16,7 @@
 import java.nio.file.Files;
 import java.nio.file.OpenOption;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
 import java.util.Map;
 import java.util.zip.ZipEntry;
@@ -38,6 +39,16 @@
           .put("wrapper/adapter/HybridFileTypeDetector", "java/adapter/HybridFileTypeDetector")
           .build();
 
+  public static void main(String[] args) {
+    if (!Files.exists(Paths.get(args[0]))) {
+      throw new RuntimeException("Undesugarer source not found");
+    }
+    if (Files.exists(Paths.get(args[1]))) {
+      throw new RuntimeException("Undesugarer destination already exists");
+    }
+    generateUndesugaredJar(Paths.get(args[0]), Paths.get(args[1]));
+  }
+
   public static Path undesugaredJarJDK11(Path undesugarFolder, Path jdk11Jar) {
     String fileName = jdk11Jar.getFileName().toString();
     String newFileName = fileName.substring(0, fileName.length() - 4) + "_undesugared.jar";
diff --git a/tools/archive.py b/tools/archive.py
index 652fbe9..bfd3a1b 100755
--- a/tools/archive.py
+++ b/tools/archive.py
@@ -169,6 +169,23 @@
         utils.DESUGAR_IMPLEMENTATION_JDK11,
         utils.LIBRARY_DESUGAR_CONVERSIONS_LEGACY_ZIP)
 
+    ### THIS IS MISSING CONVERTING OF THE JSON ###
+    create_maven_release.generate_desugar_configuration_maven_zip(
+        utils.DESUGAR_CONFIGURATION_JDK11_MINIMAL_MAVEN_ZIP,
+        utils.DESUGAR_CONFIGURATION_JDK11_MINIMAL,
+        utils.DESUGAR_IMPLEMENTATION_JDK11,
+        utils.LIBRARY_DESUGAR_CONVERSIONS_ZIP)
+    create_maven_release.generate_desugar_configuration_maven_zip(
+        utils.DESUGAR_CONFIGURATION_JDK11_MAVEN_ZIP,
+        utils.DESUGAR_CONFIGURATION_JDK11,
+        utils.DESUGAR_IMPLEMENTATION_JDK11,
+        utils.LIBRARY_DESUGAR_CONVERSIONS_ZIP)
+    create_maven_release.generate_desugar_configuration_maven_zip(
+        utils.DESUGAR_CONFIGURATION_JDK11_NIO_MAVEN_ZIP,
+        utils.DESUGAR_CONFIGURATION_JDK11_NIO,
+        utils.DESUGAR_IMPLEMENTATION_JDK11,
+        utils.LIBRARY_DESUGAR_CONVERSIONS_ZIP)
+
     version = GetVersion()
     is_main = IsMain(version)
     if is_main:
diff --git a/tools/archive_desugar_jdk_libs.py b/tools/archive_desugar_jdk_libs.py
index 5298435..2aa841c 100755
--- a/tools/archive_desugar_jdk_libs.py
+++ b/tools/archive_desugar_jdk_libs.py
@@ -19,7 +19,10 @@
 # repository to fetch the artifact com.android.tools:desugar_jdk_libs:1.0.0
 
 import archive
+import defines
 import git_utils
+import gradle
+import hashlib
 import jdk
 import optparse
 import os
@@ -28,16 +31,56 @@
 import subprocess
 import sys
 import utils
+import zipfile
 
 VERSION_FILE_JDK8 = 'VERSION.txt'
+VERSION_FILE_JDK11_LEGACY = 'VERSION_JDK11_LEGACY.txt'
+VERSION_FILE_JDK11_MINIMAL = 'VERSION_JDK11_MINIMAL.txt'
 VERSION_FILE_JDK11 = 'VERSION_JDK11.txt'
-LIBRARY_NAME = 'desugar_jdk_libs'
+VERSION_FILE_JDK11_NIO = 'VERSION_JDK11_NIO.txt'
+
+VERSION_MAP = {
+  'jdk8': VERSION_FILE_JDK8,
+  'jdk11_legacy': VERSION_FILE_JDK11_LEGACY,
+  'jdk11_minimal': VERSION_FILE_JDK11_MINIMAL,
+  'jdk11': VERSION_FILE_JDK11,
+  'jdk11_nio': VERSION_FILE_JDK11_NIO
+}
+
+GITHUB_REPRO = 'desugar_jdk_libs'
+
+BASE_LIBRARY_NAME = 'desugar_jdk_libs'
+
+LIBRARY_NAME_MAP = {
+  'jdk8': BASE_LIBRARY_NAME,
+  'jdk11_legacy': BASE_LIBRARY_NAME,
+  'jdk11_minimal': BASE_LIBRARY_NAME + '_minimal',
+  'jdk11': BASE_LIBRARY_NAME,
+  'jdk11_nio': BASE_LIBRARY_NAME + '_nio'
+}
+
+MAVEN_RELEASE_TARGET_MAP = {
+  'jdk8': 'maven_release',
+  'jdk11_legacy': 'maven_release_jdk11_legacy',
+  'jdk11_minimal': 'maven_release_jdk11_minimal',
+  'jdk11': 'maven_release_jdk11',
+  'jdk11_nio': 'maven_release_jdk11_nio'
+}
+
+MAVEN_RELEASE_ZIP = {
+  'jdk8': BASE_LIBRARY_NAME + '.zip',
+  'jdk11_legacy': BASE_LIBRARY_NAME + '_jdk11_legacy.zip',
+  'jdk11_minimal': BASE_LIBRARY_NAME + '_jdk11_minimal.zip',
+  'jdk11': BASE_LIBRARY_NAME + '_jdk11.zip',
+  'jdk11_nio': BASE_LIBRARY_NAME + '_jdk11_nio.zip'
+}
+
 
 def ParseOptions(argv):
   result = optparse.OptionParser()
   result.add_option('--variant',
-      help='.',
-      choices = ['jdk8', 'jdk11'],
+      help="Variant to build",
+      choices=['jdk8', 'jdk11_legacy', 'jdk11_minimal', 'jdk11', 'jdk11_nio'],
       default='jdk11')
   result.add_option('--dry-run', '--dry_run',
       help='Running on bot, use third_party dependency.',
@@ -89,7 +132,7 @@
 def CloneDesugaredLibrary(github_account, checkout_dir):
   git_utils.GitClone(
     'https://github.com/'
-        + github_account + '/' + LIBRARY_NAME, checkout_dir)
+        + github_account + '/' + GITHUB_REPRO, checkout_dir)
 
 def GetJavaEnv():
   java_env = dict(os.environ, JAVA_HOME = jdk.GetJdk11Home())
@@ -98,9 +141,11 @@
   return java_env
 
 
-def BuildDesugaredLibrary(checkout_dir, variant):
-  if (variant != 'jdk8' and variant != 'jdk11'):
-    raise Exception('Variant ' + variant + 'is not supported')
+def BuildDesugaredLibrary(checkout_dir, variant, version = None):
+  if not variant in MAVEN_RELEASE_TARGET_MAP:
+    raise Exception('Variant ' + variant + ' is not supported')
+  if variant != 'jdk8' and variant != 'jdk11_legacy' and version is None:
+    raise Exception('Variant ' + variant + ' require version for undesugaring')
   with utils.ChangedWorkingDirectory(checkout_dir):
     bazel = os.path.join(utils.BAZEL_TOOL, 'lib', 'bazel', 'bin', 'bazel')
     cmd = [
@@ -109,7 +154,7 @@
         'build',
         '--spawn_strategy=local',
         '--verbose_failures',
-        'maven_release' + ('_jdk11' if variant == 'jdk11' else '')]
+        MAVEN_RELEASE_TARGET_MAP[variant]]
     utils.PrintCmd(cmd)
     subprocess.check_call(cmd, env=GetJavaEnv())
     cmd = [bazel, 'shutdown']
@@ -122,14 +167,81 @@
       library_jar = os.path.join(
           checkout_dir, 'bazel-bin', 'src', 'share', 'classes', 'java', 'libjava.jar')
     else:
+      # All JDK11 variants use the same library code.
       library_jar = os.path.join(
           checkout_dir, 'bazel-bin', 'jdk11', 'src', 'd8_java_base_selected_with_addon.jar')
     maven_zip = os.path.join(
       checkout_dir,
       'bazel-bin',
-      LIBRARY_NAME + ('_jdk11' if variant == 'jdk11' else '') +'.zip')
-    return (library_jar, maven_zip)
+      MAVEN_RELEASE_ZIP[variant])
 
+    if variant != 'jdk8' and variant != 'jdk11_legacy':
+      # The undesugaring is temporary...
+      undesugared_maven_zip = os.path.join(checkout_dir, 'undesugared_maven')
+      Undesugar(variant, maven_zip, version, undesugared_maven_zip)
+      undesugared_maven_zip = os.path.join(checkout_dir, 'undesugared_maven.zip')
+      return (library_jar, undesugared_maven_zip)
+    else:
+      return (library_jar, maven_zip)
+
+def hash_for(file, hash):
+  with open(file, 'rb') as f:
+    while True:
+      # Read chunks of 1MB
+      chunk = f.read(2 ** 20)
+      if not chunk:
+        break
+      hash.update(chunk)
+  return hash.hexdigest()
+
+def write_md5_for(file):
+  hexdigest = hash_for(file, hashlib.md5())
+  with (open(file + '.md5', 'w')) as file:
+    file.write(hexdigest)
+
+def write_sha1_for(file):
+  hexdigest = hash_for(file, hashlib.sha1())
+  with (open(file + '.sha1', 'w')) as file:
+    file.write(hexdigest)
+
+def Undesugar(variant, maven_zip, version, undesugared_maven_zip):
+  gradle.RunGradle(['testJar', 'repackageTestDeps'])
+  with utils.TempDir() as tmp:
+    with zipfile.ZipFile(maven_zip, 'r') as zip_ref:
+      zip_ref.extractall(tmp)
+    desugar_jdk_libs_jar = os.path.join(
+          tmp,
+          'com',
+          'android',
+          'tools',
+          LIBRARY_NAME_MAP[variant],
+          version,
+          '%s-%s.jar' % (LIBRARY_NAME_MAP[variant], version))
+    print(desugar_jdk_libs_jar)
+    undesugared_jar = os.path.join(tmp, 'undesugared.jar')
+    buildLibs = os.path.join(defines.REPO_ROOT, 'build', 'libs')
+    cmd = [jdk.GetJavaExecutable(),
+      '-cp',
+      '%s:%s:%s' % (os.path.join(buildLibs, 'r8_with_deps.jar'), os.path.join(buildLibs, 'r8tests.jar'), os.path.join(buildLibs, 'test_deps_all.jar')),
+      'com.android.tools.r8.desugar.desugaredlibrary.jdk11.DesugaredLibraryJDK11Undesugarer',
+      desugar_jdk_libs_jar,
+      undesugared_jar]
+    print(cmd)
+    try:
+      output = subprocess.check_output(cmd, stderr = subprocess.STDOUT).decode('utf-8')
+    except subprocess.CalledProcessError as e:
+      print(e)
+      print(e.output)
+      raise e
+    print(output)
+    # Copy the undesugared jar into place and update the checksums.
+    shutil.copyfile(undesugared_jar, desugar_jdk_libs_jar)
+    write_md5_for(desugar_jdk_libs_jar)
+    write_sha1_for(desugar_jdk_libs_jar)
+    shutil.make_archive(undesugared_maven_zip, 'zip', tmp)
+    print(undesugared_maven_zip)
+    output = subprocess.check_output(['ls', '-l', os.path.dirname(undesugared_maven_zip)], stderr = subprocess.STDOUT).decode('utf-8')
+    print(output)
 
 def MustBeExistingDirectory(path):
   if (not os.path.exists(path) or not os.path.isdir(path)):
@@ -171,28 +283,25 @@
 
   with utils.TempDir() as checkout_dir:
     CloneDesugaredLibrary(options.github_account, checkout_dir)
-    version = GetVersion(
-      os.path.join(
-        checkout_dir,
-        VERSION_FILE_JDK11 if options.variant == 'jdk11' else VERSION_FILE_JDK8))
+    version = GetVersion(os.path.join(checkout_dir, VERSION_MAP[options.variant]))
 
     destination = archive.GetVersionDestination(
-        'gs://', LIBRARY_NAME + '/' + version, is_main)
+        'gs://', LIBRARY_NAME_MAP[options.variant] + '/' + version, is_main)
     if utils.cloud_storage_exists(destination) and not options.dry_run:
       raise Exception(
           'Target archive directory %s already exists' % destination)
 
-    (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, options.variant)
+    (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, options.variant, version)
 
-    storage_path = LIBRARY_NAME + '/' + version
+    storage_path = LIBRARY_NAME_MAP[options.variant] + '/' + version
     # Upload the jar file with the library.
     destination = archive.GetUploadDestination(
-        storage_path, LIBRARY_NAME + '.jar', is_main)
+        storage_path, LIBRARY_NAME_MAP[options.variant] + '.jar', is_main)
     Upload(options, library_jar, storage_path, destination, is_main)
 
     # Upload the maven zip file with the library.
     destination = archive.GetUploadDestination(
-        storage_path, LIBRARY_NAME + '.zip', is_main)
+        storage_path, MAVEN_RELEASE_ZIP[options.variant], is_main)
     Upload(options, maven_zip, storage_path, destination, is_main)
 
     # Upload the jar file for accessing GCS as a maven repro.
diff --git a/tools/test.py b/tools/test.py
index 27c8b6a..5586802 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -260,7 +260,7 @@
       utils.DownloadFromGoogleCloudStorage(utils.BAZEL_SHA_FILE)
       utils.DownloadFromGoogleCloudStorage(utils.JAVA8_SHA_FILE)
       utils.DownloadFromGoogleCloudStorage(utils.JAVA11_SHA_FILE)
-      (library_jar, maven_zip) = archive_desugar_jdk_libs.BuildDesugaredLibrary(checkout_dir, 'jdk11' if options.desugared_library_configuration == 'jdk11' else 'jdk8')
+      (library_jar, maven_zip) = archive_desugar_jdk_libs.BuildDesugaredLibrary(checkout_dir, 'jdk11_legacy' if options.desugared_library_configuration == 'jdk11' else 'jdk8')
       desugar_jdk_libs = os.path.join(desugar_jdk_libs_dir, os.path.basename(library_jar))
       shutil.copyfile(library_jar, desugar_jdk_libs)
       print('Desugared library for test in ' + desugar_jdk_libs)
diff --git a/tools/utils.py b/tools/utils.py
index 9bd518f..07cfb3c 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -77,12 +77,24 @@
       'third_party', 'openjdk', 'desugar_jdk_libs', 'desugar_jdk_libs.jar')
 DESUGAR_CONFIGURATION_JDK11_LEGACY = os.path.join(
       'src', 'library_desugar', 'jdk11', 'desugar_jdk_libs_legacy.json')
+DESUGAR_CONFIGURATION_JDK11_MINIMAL = os.path.join(
+      'src', 'library_desugar', 'jdk11', 'desugar_jdk_libs_minimal.json')
+DESUGAR_CONFIGURATION_JDK11 = os.path.join(
+      'src', 'library_desugar', 'jdk11', 'desugar_jdk_libs.json')
+DESUGAR_CONFIGURATION_JDK11_NIO = os.path.join(
+      'src', 'library_desugar', 'jdk11', 'desugar_jdk_libs_nio.json')
 DESUGAR_IMPLEMENTATION_JDK11 = os.path.join(
       'third_party', 'openjdk', 'desugar_jdk_libs_11', 'desugar_jdk_libs.jar')
 DESUGAR_CONFIGURATION_MAVEN_ZIP = os.path.join(
   LIBS, 'desugar_jdk_libs_configuration.zip')
 DESUGAR_CONFIGURATION_JDK11_LEGACY_MAVEN_ZIP = os.path.join(
   LIBS, 'desugar_jdk_libs_configuration_jdk11_legacy.zip')
+DESUGAR_CONFIGURATION_JDK11_MINIMAL_MAVEN_ZIP = os.path.join(
+  LIBS, 'desugar_jdk_libs_configuration_jdk11_minimal.zip')
+DESUGAR_CONFIGURATION_JDK11_MAVEN_ZIP = os.path.join(
+  LIBS, 'desugar_jdk_libs_configuration_jdk11.zip')
+DESUGAR_CONFIGURATION_JDK11_NIO_MAVEN_ZIP = os.path.join(
+  LIBS, 'desugar_jdk_libs_configuration_jdk11_nio.zip')
 GENERATED_LICENSE = os.path.join(GENERATED_LICENSE_DIR, 'LICENSE')
 RT_JAR = os.path.join(REPO_ROOT, 'third_party/openjdk/openjdk-rt-1.8/rt.jar')
 R8LIB_KEEP_RULES = os.path.join(REPO_ROOT, 'src/main/keep.txt')