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

import os
import subprocess
import yaml


PUBSPECS = [
    'sky/packages/sky/pubspec.yaml',
    'sky/packages/sky_engine/pubspec.yaml',
    'sky/packages/sky_services/pubspec.yaml',
]

def increment_version(version):
    pieces = version.split('.')
    pieces[-1] = str(int(pieces[-1]) + 1)
    return '.'.join(pieces)


def sort_dict(unsorted):
    sorted_dict = collections.OrderedDict()
    for key in sorted(unsorted.keys()):
        sorted_dict[key] = unsorted[key]
    return sorted_dict


def count_commits(start, end):
    return subprocess.check_output([
        'git', 'rev-list', '%s...%s' % (start, end)]).count('\n')


def last_commit_to(file_path):
    return subprocess.check_output(['git', 'log', '-1', '--format=%h', file_path]).strip()


def update_pubspec(pubspec):
    # TODO(eseidel): This does not prserve any manual sort-order of the yaml.
    with open(pubspec, 'r') as stream:
        spec = yaml.load(stream)
        old_version = spec['version']
        spec['version'] = increment_version(old_version)
        print "%20s  %6s => %6s" % (spec['name'], old_version, spec['version'])

    with open(pubspec, 'w') as stream:
        yaml.dump(spec, stream=stream, default_flow_style=False)
    return spec['version']


def update_changelog(changelog, pubspec, version):
    old = last_commit_to(pubspec)
    new = last_commit_to('.')
    url = "https://github.com/domokit/sky_engine/compare/%s...%s" % (old, new)
    count = count_commits(old, new)
    message = """## %s

  - %s changes: %s

""" % (version, count, url)
    prepend_to_file(message, changelog)


def prepend_to_file(to_prepend, filepath):
    with open(filepath, 'r+') as f:
        content = f.read()
        f.seek(0, 0)
        f.write(to_prepend + content)


def main():
    # Should chdir to the root directory.

    print 'Pub packages:'
    for pubspec in PUBSPECS:
        new_version = update_pubspec(pubspec)
        changelog = os.path.join(os.path.dirname(pubspec), 'CHANGELOG.md')
        update_changelog(changelog, pubspec, new_version)


if __name__ == '__main__':
    main()
