Add Google Maven release to release script

Change-Id: Ieb1b18f6e55fb954b9ed5b87cfc5b617e7982b7d
diff --git a/tools/r8_release.py b/tools/r8_release.py
index 357b659..6716d9e 100755
--- a/tools/r8_release.py
+++ b/tools/r8_release.py
@@ -22,6 +22,7 @@
     'src', 'main', 'java', 'com', 'android', 'tools', 'r8', 'Version.java')
 THIS_FILE_RELATIVE = os.path.join('tools', 'r8_release.py')
 ADMRT = '/google/data/ro/teams/android-devtools-infra/tools/admrt'
+GMAVEN_PUBLISHER = '/google/bin/releases/android-devtools/gmaven/publisher/gmaven-publisher'
 
 DESUGAR_JDK_LIBS = 'desugar_jdk_libs'
 DESUGAR_JDK_LIBS_CONFIGURATION = DESUGAR_JDK_LIBS + '_configuration'
@@ -223,6 +224,34 @@
   return release_aosp
 
 
+def prepare_maven(args):
+  assert args.version
+
+  def release_maven(options):
+    release_id = gmaven_publisher_stage(args)
+
+    print ("Staged Release ID " + release_id + ". To test the staged content "
+           " with 'redir' run:")
+    print ("/google/data/ro/teams/android-devtools-infra/tools/redir "
+           + "--alsologtostderr "
+           + "--gcs_bucket_path=/studio_staging/maven2/${USER}/"
+           + release_id + " "
+           + "--port=1480")
+
+    print
+    input = raw_input("Continue with publishing [y/N]:")
+
+    if input != 'y':
+      print 'Aborting release to Google maven'
+      sys.exit(1)
+
+    gmaven_publisher_publish(args, release_id)
+
+    print
+    print "Published. Use the email workflow for approval."
+
+  return release_maven
+
 def git_message_dev(version):
   return """Update D8 R8 master to %s
 
@@ -436,6 +465,49 @@
     tree.parse(pom_file)
     return tree.getroot().find("{%s}version" % ns).text
 
+def gmaven_publisher_gfile(args):
+  return '/bigstore/r8-releases/raw/%s/r8lib.zip' % args.version
+
+GMAVEN_PUBLISH_STAGE_RELEASE_ID_PATTERN = re.compile('Release ID = ([0-9a-f\-]+)')
+
+def gmaven_publisher_stage(args):
+  gfile = gmaven_publisher_gfile(args)
+  if args.dry_run:
+    print 'Dry-run, would have staged %s' % gfile
+    return 'dry-run-release-id'
+
+  print "Staging '%s'" % gfile
+  print
+
+  cmd = [GMAVEN_PUBLISHER, 'stage', '--gfile', gfile]
+  output = subprocess.check_output(cmd)
+
+  # Expect output to contain:
+  # [INFO] 06/19/2020 09:35:12 CEST: >>>>>>>>>> Staged
+  # [INFO] 06/19/2020 09:35:12 CEST: Release ID = 9171d015-18f6-4a90-9984-1c362589dc1b
+  # [INFO] 06/19/2020 09:35:12 CEST: Stage Path = /bigstore/studio_staging/maven2/sgjesse/9171d015-18f6-4a90-9984-1c362589dc1b
+
+  matches = GMAVEN_PUBLISH_STAGE_RELEASE_ID_PATTERN.findall(output)
+  if matches == None or len(matches) > 1:
+    print ("Could not determine the release ID from the gmaven_publisher " +
+           "output. Expected a line with 'Release ID = <release id>'.")
+    print "Output was:"
+    print output
+    sys.exit(1)
+
+  print output
+
+  release_id = matches[0]
+  return release_id
+
+def gmaven_publisher_publish(args, release_id):
+  gfile = gmaven_publisher_gfile(args)
+  if args.dry_run:
+    print 'Dry-run, would have published %s' % release_id
+    return
+
+  cmd = [GMAVEN_PUBLISHER, 'publish', release_id]
+  output = subprocess.check_output(cmd)
 
 def admrt_stage(archives, artifact_ids, args):
   if args.dry_run:
@@ -658,6 +730,10 @@
                       metavar=('<path>'),
                       help='Release for aosp by setting the path to the '
                            'checkout')
+  result.add_argument('--maven',
+                      default=False,
+                      action='store_true',
+                      help='Release to Google Maven')
   result.add_argument('--google3',
                       default=False,
                       action='store_true',
@@ -683,8 +759,12 @@
                       metavar=('<path>'),
                       help='Location for dry run output.')
   args = result.parse_args()
-  if args.version and not 'dev' in args.version and args.bug == []:
-    print "When releasing a release version add the list of bugs by using '--bug'"
+  if (args.studio
+      and args.version
+      and not 'dev' in args.version
+      and args.bug == []):
+    print ("When releasing a release version to Android Studio add the "
+           + "list of bugs by using '--bug'")
     sys.exit(1)
 
   if args.version and not 'dev' in args.version and args.google3:
@@ -711,6 +791,7 @@
     targets_to_run.append(prepare_release(args))
 
   if (args.google3
+      or args.maven
       or (args.studio and not args.no_sync)
       or (args.desugar_library and not args.dry_run)):
     utils.check_prodacces()
@@ -721,6 +802,8 @@
     targets_to_run.append(prepare_studio(args))
   if args.aosp:
     targets_to_run.append(prepare_aosp(args))
+  if args.maven:
+    targets_to_run.append(prepare_maven(args))
 
   if args.desugar_library:
     targets_to_run.append(prepare_desugar_library(args))