16fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#!/usr/bin/python
26fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
36fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgimport getopt
46fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgimport subprocess
56fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgimport sys
66fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
76fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgLONG_OPTIONS = ["shard=", "shards="]
86fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgBASE_COMMAND = "./configure --enable-internal-stats --enable-experimental"
96fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgdef RunCommand(command):
116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  run = subprocess.Popen(command, shell=True)
126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  output = run.communicate()
136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  if run.returncode:
146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    print "Non-zero return code: " + str(run.returncode) + " => exiting!"
156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    sys.exit(1)
166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgdef list_of_experiments():
186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  experiments = []
196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  configure_file = open("configure")
206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  list_start = False
216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  for line in configure_file.read().split("\n"):
226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    if line == 'EXPERIMENT_LIST="':
236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org      list_start = True
246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    elif line == '"':
256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org      list_start = False
266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    elif list_start:
276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org      currently_broken = ["csm"]
286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org      experiment = line[4:]
296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org      if experiment not in currently_broken:
306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        experiments.append(experiment)
316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  return experiments
326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgdef main(argv):
346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  # Parse arguments
356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  options = {"--shard": 0, "--shards": 1}
366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  if "--" in argv:
376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    opt_end_index = argv.index("--")
386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  else:
396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    opt_end_index = len(argv)
406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  try:
416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    o, _ = getopt.getopt(argv[1:opt_end_index], None, LONG_OPTIONS)
426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  except getopt.GetoptError, err:
436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    print str(err)
446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    print "Usage: %s [--shard=<n> --shards=<n>] -- [configure flag ...]"%argv[0]
456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    sys.exit(2)
466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  options.update(o)
486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  extra_args = argv[opt_end_index + 1:]
496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  # Shard experiment list
516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  shard = int(options["--shard"])
526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  shards = int(options["--shards"])
536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  experiments = list_of_experiments()
546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  base_command = " ".join([BASE_COMMAND] + extra_args)
556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  configs = [base_command]
566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  configs += ["%s --enable-%s" % (base_command, e) for e in experiments]
576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  my_configs = zip(configs, range(len(configs)))
586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  my_configs = filter(lambda x: x[1] % shards == shard, my_configs)
596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  my_configs = [e[0] for e in my_configs]
606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  # Run configs for this shard
626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  for config in my_configs:
636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    test_build(config)
646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgdef test_build(configure_command):
666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  print "\033[34m\033[47mTesting %s\033[0m" % (configure_command)
676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  RunCommand(configure_command)
686fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  RunCommand("make clean")
696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  RunCommand("make")
706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgif __name__ == "__main__":
726fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  main(sys.argv)
73