Add path regex handling to luci sched generation, use for infra/config.

Add the ability for chromeos_config.py to specify path_regexps for
triggers and use them for luci-scheduler-updater triggering on the
infra/config repo.

BUG=None
TEST=cros_sdk -- /mnt/host/source/chromite/config/refresh_generated_files
TEST=./run_tests

Change-Id: I0a5009e878636e25ef8b209ba18512cadf3aba92
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/2265200
Commit-Queue: David Burger <dburger@chromium.org>
Tested-by: David Burger <dburger@chromium.org>
Reviewed-by: Sean Abraham <seanabraham@chromium.org>
Reviewed-by: Dhanya Ganesh <dhanyaganesh@chromium.org>
diff --git a/scripts/gen_luci_scheduler.py b/scripts/gen_luci_scheduler.py
index 9a9f75b..2c06481 100644
--- a/scripts/gen_luci_scheduler.py
+++ b/scripts/gen_luci_scheduler.py
@@ -125,13 +125,15 @@
   }
 
 
-def genSchedulerTrigger(trigger_name, repo, refs, builds):
+def genSchedulerTrigger(trigger_name, repo, refs, path_regexps, builds):
   """Generate the luci scheduler job for a given build config.
 
   Args:
     trigger_name: Name of the trigger as a string.
     repo: Gitiles URL git git repository.
     refs: Iterable of git refs to check. May use regular expressions.
+    path_regexps: Iterable of path regular expressions of files to trigger on
+        or falsy to trigger on everything.
     builds: Iterable of build config names to trigger.
 
   Returns:
@@ -144,16 +146,21 @@
   schedule: "with 5m interval"
   gitiles: {
     repo: "%(repo)s"
-%(refs)s
+%(refs)s%(path_regexps)s
   }
 %(triggers)s
 }
 """
-
+  if path_regexps:
+    path_regexps = '\n' + '\n'.join('    path_regexps: "%s"' %
+                                    r for r in path_regexps)
+  else:
+    path_regexps = ''
   return template % {
       'trigger_name': trigger_name,
       'repo': repo,
       'refs': '\n'.join('    refs: "%s"' % r for r in refs),
+      'path_regexps': path_regexps,
       'triggers': '\n'.join('  triggers: "%s"' % b for b in builds),
   }
 
@@ -186,8 +193,13 @@
 
     # Populate trigger_collection.
     if config.triggered_gitiles:
-      for gitiles_url, ref_list in config.triggered_gitiles:
-        gitiles_key = (gitiles_url, tuple(ref_list))
+      for trigger in config.triggered_gitiles:
+        try:
+          gitiles_url, ref_list, path_regexps = trigger
+        except ValueError:
+          gitiles_url, ref_list = trigger
+          path_regexps = []
+        gitiles_key = (gitiles_url, tuple(ref_list), tuple(path_regexps))
         trigger_collection.setdefault(gitiles_key, set())
         trigger_collection[gitiles_key].add(buildJobName(config))
 
@@ -198,9 +210,9 @@
     builds = sorted(trigger_collection[gitiles_key])
 
     trigger_name = 'trigger_%s' % trigger_counter
-    gitiles_url, refs = gitiles_key
+    gitiles_url, refs, path_regexps = gitiles_key
     triggers.append(genSchedulerTrigger(
-        trigger_name, gitiles_url, refs, builds))
+        trigger_name, gitiles_url, refs, path_regexps, builds))
     trigger_counter += 1
 
   return ''.join([_CONFIG_HEADER] + triggers + jobs)