#!/usr/bin/python
#
# Copyright 2013 Google Inc. All Rights Reserved.

"""Script to find list of common images (first beta releases) in Chromeos.

Display information about stable ChromeOS/Chrome versions to be used
by the team developers. The purpose is to increase team productivity
by using stable (known and tested) ChromeOS/Chrome versions instead of
using randomly selected versions. Currently we define as a "stable"
version the first Beta release in a particular release cycle.
"""

__author__ = "llozano@google.com (Luis Lozano)"

import optparse
import pickle
import re
import sys
import urllib

VERSIONS_HISTORY_URL = "http://cros-omahaproxy.appspot.com/history"


def DisplayBetas(betas):
  print "List of betas from", VERSIONS_HISTORY_URL
  for beta in betas:
    print "  Release", beta["chrome_major_version"], beta
  return


def FindAllBetas(all_versions):
  """Get ChromeOS first betas from History URL."""

  all_betas = []
  prev_beta = {}
  for line in all_versions:
    match_obj = re.match(
        r"(?P<date>.*),(?P<chromeos_version>.*),"
        r"(?P<chrome_major_version>\d*).(?P<chrome_minor_version>.*),"
        r"(?P<chrome_appid>.*),beta-channel,,Samsung Chromebook Series 5 550",
        line)
    if match_obj:
      if prev_beta:
        if (prev_beta["chrome_major_version"] !=
            match_obj.group("chrome_major_version")):
          all_betas.append(prev_beta)
      prev_beta = match_obj.groupdict()
  if prev_beta:
    all_betas.append(prev_beta)
  return all_betas


def SerializeBetas(all_betas, serialize_file):
  with open(serialize_file, "wb") as f:
    pickle.dump(all_betas, f)
    print "Serialized list of betas into", serialize_file
  return


def Main(argv):
  """Get ChromeOS first betas list from history URL."""

  parser = optparse.OptionParser()
  parser.add_option("--serialize", dest="serialize", default=None,
                    help="Save list of common images into the specified file.")
  options = parser.parse_args(argv)[0]

  try:
    opener = urllib.URLopener()
    all_versions = opener.open(VERSIONS_HISTORY_URL)
  except IOError as ioe:
    print "Cannot open", VERSIONS_HISTORY_URL
    print ioe
    return 1

  all_betas = FindAllBetas(all_versions)
  DisplayBetas(all_betas)
  if options.serialize:
    SerializeBetas(all_betas, options.serialize)
  all_versions.close()

  return 0

if __name__ == "__main__":
  retval = Main(sys.argv)
  sys.exit(retval)
