#!/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.

"""Updates version number in pubspec.yaml files and edits the CHANGELOG"""

import os
import subprocess
import yaml

PUBSPECS = [
    'dart/mojo_services/pubspec.yaml',
    'public/dart/mojo/pubspec.yaml',
    'public/dart/mojo_apptest/pubspec.yaml',
    'public/dart/mojom/pubspec.yaml',
]

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


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 preserve 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/mojo/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():
    # TODO(johnmccutchan): 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()
