#!/usr/bin/env python3
#
# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
#
# Script to push a package to pub.
#
# Usage: publish_pkg.py pkg_dir
#
# "pub" must be in PATH.

import os
import os.path
import shutil
import sys
import subprocess
import tempfile


def Main(argv):
    HOME = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))

    pkgName = os.path.basename(os.path.normpath(argv[1]))

    pubspec = os.path.join(HOME, argv[1], 'pubspec.yaml')
    if not os.path.exists(pubspec):
        print('Error: did not find pubspec.yaml at ' + pubspec)
        return -1

    with open(pubspec) as pubspecFile:
        lines = pubspecFile.readlines()

    version = None
    foundSdkConstraint = False
    inDependencies = False
    for line in lines:
        if line.startswith('dependencies:'):
            inDependencies = True
        elif line.startswith('environment:'):
            foundSdkConstraint = True
        elif line[0].isalpha():
            inDependencies = False
        if line.startswith('version:'):
            version = line[len('version:'):].strip()
        if inDependencies:
            if line.endswith(': any'):
                print(
                    'Error in %s: should not use "any" version constraint: %s' %
                    (pubspec, line))
                return -1

    if not version:
        print('Error in %s: did not find package version.' % pubspec)
        return -1

    if not foundSdkConstraint:
        print('Error in %s: did not find SDK version constraint.' % pubspec)
        return -1

    tmpDir = tempfile.mkdtemp()

    #
    # If pubspec.yaml exists, check that the SDK's version constraint is valid
    #
    shutil.copytree(os.path.join(HOME, argv[1]), os.path.join(tmpDir, pkgName))

    if not os.path.exists(os.path.join(tmpDir, pkgName, 'LICENSE')):
        with open(os.path.join(tmpDir, pkgName, 'LICENSE'), 'w') as licenseFile:
            licenseFile.write(
                '''Copyright 2014, the Dart project authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
      copyright notice, this list of conditions and the following
      disclaimer in the documentation and/or other materials provided
      with the distribution.
    * Neither the name of Google Inc. nor the names of its
      contributors may be used to endorse or promote products derived
      from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
''')

    print('publishing version ' + version + ' of ' + argv[1] + ' to pub.\n')

    # TODO(jmesserly): this code puts things in the pub cache. Useful for testing
    # without actually uploading.
    #cacheDir = os.path.join(
    #    os.path.expanduser('~/.pub-cache/hosted/pub.dartlang.org'),
    #    pkgName + '-' + version)
    #print 'Moving to ' + cacheDir
    #shutil.move(os.path.join(tmpDir, pkgName), cacheDir)

    subprocess.call(['pub', 'publish'], cwd=os.path.join(tmpDir, pkgName))
    shutil.rmtree(tmpDir)


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