#!/usr/bin/env python2
# Copyright 2017 Google Inc.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import json
import re
import subprocess
import sys
import urllib

# TODO(halcanary): document functions and script usage.

def retrieve_changeid(commit_or_branch):
  try:
    cmd = ['git', 'log', '-1', '--format=%B', commit_or_branch, '--']
    body = subprocess.check_output(cmd)
  except OSError:
    raise Exception('git not found')
  except subprocess.CalledProcessError:
    raise Exception('`%s` failed' % ' '.join(cmd))
  match = re.search(r'^Change-Id: *(.*) *$', body, re.MULTILINE)
  if match is None:
    raise Exception('Change-Id field missing from commit %s' % commit_or_branch)
  return match.group(1)


def gerrit_change_id_to_number(site, cid):
  url = 'https://%s/changes/?q=change:%s' % (site, cid)
  try:
    content = urllib.urlopen(url).read()
  except IOError:
    raise Exception('error reading "%s"' % url)
  try:
    parsed = json.loads(content[content.find('['):])
  except ValueError:
    raise Exception('unable to parse content\n"""\n%s\n"""' % content)
  try:
    return parsed[0]['_number']
  except (IndexError, KeyError):
    raise Exception('Content missing\n"""\n%s\n"""' %
                    json.dumps(parsed, indent=2))


def args_to_changeid(argv):
  if len(argv) == 2 and len(argv[1]) == 41 and argv[1][0] == 'I':
    return argv[1]
  else:
    return retrieve_changeid(argv[1] if len(argv) == 2 else 'HEAD')


if __name__ == '__main__':
  try:
    sys.stdout.write('%d\n' %
        gerrit_change_id_to_number('skia-review.googlesource.com',
                                   args_to_changeid(sys.argv)))
  except Exception as e:
    sys.stderr.write('%s\n' % e)
    sys.exit(1)


