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))
|