'''Get external dependencies for building PyPy
they will end up in the platform.host().basepath, something like repo-root/external
'''

from __future__ import print_function

import argparse
import os
import zipfile
from subprocess import Popen, PIPE
from rpython.translator.platform import host

def runcmd(cmd, verbose):
    stdout = stderr = ''
    report = False
    try:
        p = Popen(cmd, stdout=PIPE, stderr=PIPE)
        stdout, stderr = p.communicate()
        if p.wait() != 0 or verbose:
            report = True
    except Exception as e:
        stderr = str(e) + '\n' + stderr
        report = True
    if report:
        print('running "%s" returned\n%s\n%s' % (' '.join(cmd), stdout, stderr))
    if stderr:
        raise RuntimeError(stderr)

def checkout_repo(dest='externals', org='pypy', branch='default', verbose=False):
    url = 'https://bitbucket.org/{}/externals'.format(org)
    if not os.path.exists(dest):
        cmd = ['hg','clone',url,dest]
        runcmd(cmd, verbose)
    cmd = ['hg','-R', dest, 'update',branch]
    runcmd(cmd, verbose)

def extract_zip(externals_dir, zip_path):
    with zipfile.ZipFile(os.fspath(zip_path)) as zf:
        zf.extractall(os.fspath(externals_dir))
        return externals_dir / zf.namelist()[0].split('/')[0]

def parse_args():
    p = argparse.ArgumentParser()
    p.add_argument('-v', '--verbose', action='store_true')
    p.add_argument('-O', '--organization',
                   help='Organization owning the deps repos', default='pypy')
    p.add_argument('-e', '--externals', default=host.externals,
                   help='directory in which to store dependencies',
                   )
    p.add_argument('-b', '--branch', default=host.externals_branch,
                   help='branch to check out',
                   )
    p.add_argument('-p', '--platform', default=None,
                   help='someday support cross-compilation, ignore for now',
                   )
    return p.parse_args()


def main():
    args = parse_args()
    checkout_repo(
        dest=args.externals,
        org=args.organization,
        branch=args.branch,
        verbose=args.verbose,
    )

if __name__ == '__main__':
    main()
