Add desugar bot, enable triggering it with tools/trigger.py --desugar

Change-Id: Iaac47454f8c290ec25fa21d2a857f9091ae26e49
diff --git a/infra/config/global/cr-buildbucket.cfg b/infra/config/global/cr-buildbucket.cfg
index 10a7426..8ec67d2 100644
--- a/infra/config/global/cr-buildbucket.cfg
+++ b/infra/config/global/cr-buildbucket.cfg
@@ -127,6 +127,18 @@
       }
 
     }
+    # This builder is only triggered manually to build and archive maven
+    # artifacts for the desugared library.
+    builders {
+      name: "archive_lib_desugar"
+      priority: 25
+      mixins: "linux"
+      execution_timeout_secs: 3600  # 1h
+      recipe {
+        properties: "archive:True"
+        properties: "sdk_desugar:True"
+      }
+    }
     builders {
       name: "linux"
       mixins: "linux"
diff --git a/infra/config/global/luci-milo.cfg b/infra/config/global/luci-milo.cfg
index 42ee7f0..3f0af99 100644
--- a/infra/config/global/luci-milo.cfg
+++ b/infra/config/global/luci-milo.cfg
@@ -81,6 +81,11 @@
     short_name: "win"
   }
   builders {
+    name: "buildbucket/luci.r8.ci/archive_lib_desugar"
+    category: "archive_desugar"
+    short_name: "sdk_desugar"
+  }
+  builders {
     name: "buildbucket/luci.r8.ci/archive_release"
     category: "release archive"
     short_name: "archive"
diff --git a/infra/config/global/luci-scheduler.cfg b/infra/config/global/luci-scheduler.cfg
index 525bb2e..1150d18 100644
--- a/infra/config/global/luci-scheduler.cfg
+++ b/infra/config/global/luci-scheduler.cfg
@@ -43,6 +43,12 @@
 }
 
 trigger {
+  id: "desugar_library_trigger"
+  acl_sets: "default"
+  triggers: "archive_lib_desugar"
+}
+
+trigger {
   id: "branch-gitiles-trigger"
   acl_sets: "default"
   gitiles: {
@@ -94,6 +100,20 @@
 }
 
 job {
+  id: "archive_lib_desugar"
+  acl_sets: "default"
+  triggering_policy: {
+    max_concurrent_invocations: 1
+    max_batch_size: 1
+  }
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.r8.ci"
+    builder: "archive_lib_desugar"
+  }
+}
+
+job {
   id: "linux"
   acl_sets: "default"
   triggering_policy: {
diff --git a/tools/git_utils.py b/tools/git_utils.py
index bd1694e..72485e1 100644
--- a/tools/git_utils.py
+++ b/tools/git_utils.py
@@ -11,8 +11,9 @@
   utils.PrintCmd(cmd)
   return subprocess.check_call(cmd)
 
-def GetHeadRevision(checkout_dir):
-  cmd = ['git', 'rev-parse', 'HEAD']
+def GetHeadRevision(checkout_dir, use_master=False):
+  revision_from = 'origin/master' if use_master else 'HEAD'
+  cmd = ['git', 'rev-parse', revision_from]
   utils.PrintCmd(cmd)
-  with ChangedWorkingDirectory(checkout_dir):
+  with utils.ChangedWorkingDirectory(checkout_dir):
     return subprocess.check_output(cmd).strip()
diff --git a/tools/trigger.py b/tools/trigger.py
index 1a33795..5ce6a42 100755
--- a/tools/trigger.py
+++ b/tools/trigger.py
@@ -6,6 +6,7 @@
 # Convenience script for triggering bots on specific commits.
 
 import json
+import git_utils
 import optparse
 import os
 import re
@@ -21,6 +22,8 @@
 #   triggers: "BUILDER_NAME"
 TRIGGERS_RE = r'^  triggers: "(\w.*)"'
 
+DESUGAR_BOT = 'archive_lib_desugar'
+
 def ParseOptions():
   result = optparse.OptionParser()
   result.add_option('--release',
@@ -30,10 +33,14 @@
                     help='Run the specified cl on the bots. This should be '
                     'the full url, e.g., '
                     'https://r8-review.googlesource.com/c/r8/+/37420/1')
+  result.add_option('--desugar',
+                    help='Run the library desugar and archiving bot.',
+                    default=False, action='store_true')
   result.add_option('--builder', help='Trigger specific builder')
   return result.parse_args()
 
 def get_builders():
+
   is_release = False
   master_builders = []
   release_builders = []
@@ -51,6 +58,9 @@
         else:
           assert 'release' not in builder
           master_builders.append(builder)
+  assert DESUGAR_BOT in master_builders
+  print 'Desugar builder:\n  ' + DESUGAR_BOT
+  master_builders.remove(DESUGAR_BOT)
   print 'Master builders:\n  ' + '\n  '.join(master_builders)
   print 'Release builders:\n  ' + '\n  '.join(release_builders)
   return (master_builders, release_builders)
@@ -74,7 +84,7 @@
 
 def Main():
   (options, args) = ParseOptions()
-  if len(args) != 1 and not options.cl:
+  if len(args) != 1 and not options.cl and not options.desugar:
     print 'Takes exactly one argument, the commit to run'
     return 1
 
@@ -82,13 +92,21 @@
     print 'You can\'t run cls on the release bots'
     return 1
 
-  commit = None if options.cl else args[0]
+  if options.cl and options.desugar:
+    print 'You can\'t run cls on the desugar bot'
+    return 1
+
+  commit = None if (options.cl or options.desugar)  else args[0]
   (master_builders, release_builders) = get_builders()
   builders = release_builders if options.release else master_builders
   if options.builder:
     builder = options.builder
     assert builder in master_builders or builder in release_builders
     builders = [options.builder]
+  if options.desugar:
+    builders = [DESUGAR_BOT]
+    trigger_builders(
+        builders, git_utils.GetHeadRevision(utils.REPO_ROOT, use_master=True))
   if options.cl:
     trigger_cl(builders, options.cl)
   else: