summaryrefslogtreecommitdiff
path: root/import/pip.to_lorry
blob: 54a48710b39863638e7c1586350ceacf981cc27f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env python
#
# Create a Baserock .lorry file for a given Python package
#
# Copyright (C) 2014  Codethink Limited
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

from __future__ import print_function

import subprocess
import requests
import json
import sys

import xmlrpclib

PYPI_URL = 'http://pypi.python.org/pypi'

def fetch_package_metadata(package_name):
    return requests.get('%s/%s/json'
                        % (PYPI_URL, package_name)).json()

def is_repo(url):
    vcss = [('git', 'clone'), ('hg', 'clone'),
            ('svn', 'checkout'), ('bzr', 'branch')]

    for (vcs, vcs_command) in vcss:
        p = subprocess.Popen([vcs, vcs_command, url], stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE)

        if p.returncode == 0:
            return True

    return False

def make_lorry(name, url):
    return '''{
    "%s-tarball": {
        "type": "tarball",
        "url": "%s"
    }
}''' % (name, url)

def ask_user(client, xs, fn):
    for n, x in enumerate(xs):
        print('%s: %s' % (n, fn(x)))

    s = raw_input('--> ')
    choice = int(s) if s.isdigit() else xsNone
    choice = choice - 1 if choice <= len(xs) else None

    if choice == None:
        print("Invalid choice, exiting", file=sys.stderr)
        sys.exit(1)

    return choice

def generate_lorry_from_tarball(package_name):
    client = xmlrpclib.ServerProxy(PYPI_URL)
    releases = client.package_releases(package_name)
    print('releases: ', releases)

    def f(release):
        return client.release_data(package_name, release)['name'] + ' ' + release

    release_version = releases[ask_user(client, releases, f)
                                if len(releases) > 1 else 0]

    print("Convert release with version", release_version)

    urls = client.release_urls(package_name, release_version)

    def g(url):
        return url['url']

    url = urls[ask_user(client, urls, g) if len(urls) > 1 else 0]['url']

    return make_lorry(package_name, url)

if len(sys.argv) != 2:
    print('usage: %s python_package' % sys.argv[0], file=sys.stderr)
    sys.exit(1)

package_name = sys.argv[1]
metadata = fetch_package_metadata(package_name)
info = metadata['info']

if 'home_page' in info:
    # TODO: detect if git repo, if so then great lorry from here
    if is_repo(info['home_page']):
        # lorry this thing
        print('not implemented yet: lorry from ', info['home_page'])
    else:
        print(generate_lorry_from_tarball(package_name))