forked from pypa/pip
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_all_pip.py
141 lines (120 loc) · 3.69 KB
/
test_all_pip.py
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import os
import re
import sys
import subprocess
from os.path import dirname, abspath
from pip._vendor.six.moves.urllib import request as urllib_request
from pip.utils import rmtree
src_folder = dirname(dirname(abspath(__file__)))
if sys.platform == 'win32':
bin_dir = 'Scripts'
else:
bin_dir = 'bin'
def all_projects():
data = urllib_request.urlopen('http://pypi.python.org/simple/').read()
projects = [m.group(1) for m in re.finditer(r'<a.*?>(.+)</a>', data)]
return projects
def main(args=None):
if args is None:
args = sys.argv[1:]
if not args:
print('Usage: test_all_pip.py <output-dir>')
sys.exit(1)
output = os.path.abspath(args[0])
if not os.path.exists(output):
print('Creating %s' % output)
os.makedirs(output)
pending_fn = os.path.join(output, 'pending.txt')
if not os.path.exists(pending_fn):
print('Downloading pending list')
projects = all_projects()
print('Found %s projects' % len(projects))
f = open(pending_fn, 'w')
for name in projects:
f.write(name + '\n')
f.close()
print('Starting testing...')
while os.stat(pending_fn).st_size:
_test_packages(output, pending_fn)
print('Finished all pending!')
def _test_packages(output, pending_fn):
package = get_last_item(pending_fn)
print('Testing package %s' % package)
dest_dir = os.path.join(output, package)
print('Creating virtualenv in %s' % dest_dir)
create_venv(dest_dir)
print('Uninstalling actual pip')
code = subprocess.check_call([
os.path.join(dest_dir, bin_dir, 'pip'),
'uninstall',
'-y',
'pip',
])
assert not code, 'pip uninstallation failed'
print('Installing development pip')
code = subprocess.check_call(
[
os.path.join(dest_dir, bin_dir, 'python'),
'setup.py',
'install'
],
cwd=src_folder,
)
assert not code, 'pip installation failed'
print('Trying installation of %s' % dest_dir)
code = subprocess.check_call([
os.path.join(dest_dir, bin_dir, 'pip'),
'install',
package,
])
if code:
print('Installation of %s failed' % package)
print('Now checking easy_install...')
create_venv(dest_dir)
code = subprocess.check_call([
os.path.join(dest_dir, bin_dir, 'easy_install'),
package,
])
if code:
print('easy_install also failed')
add_package(os.path.join(output, 'easy-failure.txt'), package)
else:
print('easy_install succeeded')
add_package(os.path.join(output, 'failure.txt'), package)
pop_last_item(pending_fn, package)
else:
print('Installation of %s succeeded' % package)
add_package(os.path.join(output, 'success.txt'), package)
pop_last_item(pending_fn, package)
rmtree(dest_dir)
def create_venv(dest_dir):
if os.path.exists(dest_dir):
rmtree(dest_dir)
print('Creating virtualenv in %s' % dest_dir)
code = subprocess.check_call([
'virtualenv',
'--no-site-packages',
dest_dir,
])
assert not code, "virtualenv failed"
def get_last_item(fn):
f = open(fn, 'r')
lines = f.readlines()
f.close()
return lines[-1].strip()
def pop_last_item(fn, line=None):
f = open(fn, 'r')
lines = f.readlines()
f.close()
if line:
assert lines[-1].strip() == line.strip()
lines.pop()
f = open(fn, 'w')
f.writelines(lines)
f.close()
def add_package(filename, package):
f = open(filename, 'a')
f.write(package + '\n')
f.close()
if __name__ == '__main__':
main()