#!/usr/bin/env python3
# Copyright 2020 The ChromiumOS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Gets info about completed chromiumos-sdk runs.

Moreover, this script exists to get versions of published sdk tarballs in
gs://chromiumos-sdk/. The hope is that it'll help answer the question "when did
the toolchain ebuild ${x} go live?"
"""

import argparse
import json
import logging
import os
import shutil
import subprocess
import sys
import tempfile
from typing import Dict, List
from pathlib import Path


def fetch_all_sdk_manifest_paths() -> List[str]:
  """Fetches all paths of SDK manifests; newer = later in the return value."""
  results = subprocess.run(
      ['gsutil', 'ls', 'gs://chromiumos-sdk/cros-sdk-20??.*.Manifest'],
      check=True,
      stdout=subprocess.PIPE,
      encoding='utf-8',
  ).stdout
  # These are named so that sorted order == newest last.
  return sorted(x.strip() for x in results.splitlines())


def fetch_manifests_into(into_dir: Path, manifests: List[str]):
  # Wrap this in a `try` block because gsutil likes to print to stdout *and*
  # stderr even on success, so we silence them & only print on failure.
  try:
    subprocess.run(
        [
            'gsutil',
            '-m',
            'cp',
            '-I',
            str(into_dir),
        ],
        check=True,
        input='\n'.join(manifests),
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT,
        encoding='utf-8',
    )
  except subprocess.CalledProcessError as e:
    logging.exception('gsutil failed; output:\n%s', e.stdout)


def load_manifest_versions(manifest: Path) -> Dict[str, str]:
  with manifest.open(encoding='utf-8') as f:
    raw_versions = json.load(f)

  # We get a dict of list of lists of versions and some other metadata, e.g.
  # {"foo/bar": [["1.2.3", {}]]}
  # Trim out the metadata.
  return {k: v[0][0] for k, v in raw_versions['packages'].items()}


def main():
  parser = argparse.ArgumentParser(
      description=__doc__,
      formatter_class=argparse.RawDescriptionHelpFormatter)
  parser.add_argument('-d',
                      '--debug',
                      action='store_true',
                      help='Emit debugging output')
  parser.add_argument(
      '-n',
      '--number',
      type=int,
      default=20,
      help='Number of recent manifests to fetch info about. 0 means unlimited.'
  )
  args = parser.parse_args()

  is_debug = args.debug
  logging.basicConfig(level=logging.DEBUG if is_debug else logging.INFO)

  logging.debug('Fetching SDK manifests')
  manifest_paths = fetch_all_sdk_manifest_paths()
  logging.debug('%d SDK manifests fetched', len(manifest_paths))

  number = args.number
  if number:
    manifest_paths = manifest_paths[-number:]

  tempdir = Path(tempfile.mkdtemp(prefix='cros-sdk-rolls'))
  try:
    logging.debug('Working in tempdir %r', tempdir)
    fetch_manifests_into(tempdir, manifest_paths)

    for path in manifest_paths:
      basename = os.path.basename(path)
      versions = load_manifest_versions(tempdir.joinpath(basename))
      print(f'{basename}: {versions["sys-devel/llvm"]}')
  finally:
    if is_debug:
      logging.debug('Keeping around tempdir %r to aid debugging', tempdir)
    else:
      shutil.rmtree(tempdir)


if __name__ == '__main__':
  sys.exit(main())
