blob: 9101a16be1b3770fe812e2e8955a56c52550a976 [file] [log] [blame]
Tor Norbye3a2425a2013-11-04 10:16:08 -08001import sys
2import traceback
3import getopt
4import os
5
6ERROR_WRONG_USAGE = 1
7ERROR_NO_PIP = 2
8ERROR_NO_SETUPTOOLS = 3
9ERROR_EXCEPTION = 4
10
Tor Norbyee2d60892014-01-17 14:04:48 -080011os.putenv("PIP_REQUIRE_VIRTUALENV", "false")
12
Tor Norbye3a2425a2013-11-04 10:16:08 -080013def exit(retcode):
14 major, minor, micro, release, serial = sys.version_info
15 version = major * 10 + minor
16 if version < 25:
17 import os
18 os._exit(retcode)
19 else:
20 sys.exit(retcode)
21
22
23def usage():
Tor Norbye65f60eb2014-07-16 18:07:37 -070024 sys.stderr.write('Usage: packaging_tool.py <list|search|install|uninstall|pyvenv>\n')
Tor Norbye3a2425a2013-11-04 10:16:08 -080025 sys.stderr.flush()
26 exit(ERROR_WRONG_USAGE)
27
28
29def error(message, retcode):
30 sys.stderr.write('Error: %s\n' % message)
31 sys.stderr.flush()
32 exit(retcode)
33
34
35def error_no_pip():
36 tb = sys.exc_traceback
37 if tb is not None and tb.tb_next is None:
38 error("Python package management tool 'pip' not found", ERROR_NO_PIP)
39 else:
40 error(traceback.format_exc(), ERROR_EXCEPTION)
41
42
43def do_list():
44 try:
45 import pkg_resources
46 except ImportError:
47 error("Python package management tool 'setuptools' or 'distribute' not found", ERROR_NO_SETUPTOOLS)
48 for pkg in pkg_resources.working_set:
49 requires = ':'.join([str(x) for x in pkg.requires()])
50 sys.stdout.write('\t'.join([pkg.project_name, pkg.version, pkg.location, requires])+chr(10))
51 sys.stdout.flush()
52
53
54def do_install(pkgs):
55 try:
56 import pip
57 except ImportError:
58 error_no_pip()
59 return pip.main(['install'] + pkgs)
60
Tor Norbye65f60eb2014-07-16 18:07:37 -070061def do_search(pkgs):
62 try:
63 import pip
64 except ImportError:
65 error_no_pip()
66 return pip.main(['search'] + pkgs)
67
Tor Norbye3a2425a2013-11-04 10:16:08 -080068
69def do_uninstall(pkgs):
70 try:
71 import pip
72 except ImportError:
73 error_no_pip()
74 return pip.main(['uninstall', '-y'] + pkgs)
75
76
77def do_pyvenv(path, system_site_packages):
78 try:
79 import venv
80 except ImportError:
81 error("Standard Python 'venv' module not found", ERROR_EXCEPTION)
82 venv.create(path, system_site_packages=system_site_packages)
83
84
85def untarDirectory(name):
86 import tempfile
87
88 directory_name = tempfile.mkdtemp("pycharm-management")
89
90 import tarfile
91
92 filename = name + ".tar.gz"
93 tar = tarfile.open(filename)
94 for item in tar:
95 tar.extract(item, directory_name)
96
97 sys.stdout.write(directory_name+chr(10))
98 sys.stdout.flush()
99 return 0
100
101def mkdtemp_ifneeded():
102 try:
103 ind = sys.argv.index('--build-dir')
104 if not os.path.exists(sys.argv[ind + 1]):
105 import tempfile
106
107 sys.argv[ind + 1] = tempfile.mkdtemp('pycharm-packaging')
108 return sys.argv[ind + 1]
109 except:
110 pass
111
112 return None
113
114
115def main():
116 retcode = 0
117 try:
118 if len(sys.argv) < 2:
119 usage()
120 cmd = sys.argv[1]
121 if cmd == 'list':
122 if len(sys.argv) != 2:
123 usage()
124 do_list()
Tor Norbye65f60eb2014-07-16 18:07:37 -0700125 elif cmd == 'search':
126 if len(sys.argv) < 2:
127 usage()
128 pkgs = sys.argv[2:]
129 do_search(pkgs)
Tor Norbye3a2425a2013-11-04 10:16:08 -0800130 elif cmd == 'install':
131 if len(sys.argv) < 2:
132 usage()
133
134 rmdir = mkdtemp_ifneeded()
135
136 pkgs = sys.argv[2:]
137 retcode = do_install(pkgs)
138
139 if rmdir is not None:
140 import shutil
141 shutil.rmtree(rmdir)
142
143
144 elif cmd == 'untar':
145 if len(sys.argv) < 2:
146 usage()
147 name = sys.argv[2]
148 retcode = untarDirectory(name)
149 elif cmd == 'uninstall':
150 if len(sys.argv) < 2:
151 usage()
152 pkgs = sys.argv[2:]
153 retcode = do_uninstall(pkgs)
154 elif cmd == 'pyvenv':
155 opts, args = getopt.getopt(sys.argv[2:], '', ['system-site-packages'])
156 if len(args) != 1:
157 usage()
158 path = args[0]
159 system_site_packages = False
160 for opt, arg in opts:
161 if opt == '--system-site-packages':
162 system_site_packages = True
163 do_pyvenv(path, system_site_packages)
164 else:
165 usage()
166 except Exception:
167 traceback.print_exc()
168 exit(ERROR_EXCEPTION)
169 exit(retcode)
170
171if __name__ == '__main__':
172 main()