blob: c66cbcba2fe22cb7750641f4223bd9837d975db1 [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():
24 sys.stderr.write('Usage: packaging_tool.py <list|install|uninstall|pyvenv>\n')
25 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
61
62def do_uninstall(pkgs):
63 try:
64 import pip
65 except ImportError:
66 error_no_pip()
67 return pip.main(['uninstall', '-y'] + pkgs)
68
69
70def do_pyvenv(path, system_site_packages):
71 try:
72 import venv
73 except ImportError:
74 error("Standard Python 'venv' module not found", ERROR_EXCEPTION)
75 venv.create(path, system_site_packages=system_site_packages)
76
77
78def untarDirectory(name):
79 import tempfile
80
81 directory_name = tempfile.mkdtemp("pycharm-management")
82
83 import tarfile
84
85 filename = name + ".tar.gz"
86 tar = tarfile.open(filename)
87 for item in tar:
88 tar.extract(item, directory_name)
89
90 sys.stdout.write(directory_name+chr(10))
91 sys.stdout.flush()
92 return 0
93
94def mkdtemp_ifneeded():
95 try:
96 ind = sys.argv.index('--build-dir')
97 if not os.path.exists(sys.argv[ind + 1]):
98 import tempfile
99
100 sys.argv[ind + 1] = tempfile.mkdtemp('pycharm-packaging')
101 return sys.argv[ind + 1]
102 except:
103 pass
104
105 return None
106
107
108def main():
109 retcode = 0
110 try:
111 if len(sys.argv) < 2:
112 usage()
113 cmd = sys.argv[1]
114 if cmd == 'list':
115 if len(sys.argv) != 2:
116 usage()
117 do_list()
118 elif cmd == 'install':
119 if len(sys.argv) < 2:
120 usage()
121
122 rmdir = mkdtemp_ifneeded()
123
124 pkgs = sys.argv[2:]
125 retcode = do_install(pkgs)
126
127 if rmdir is not None:
128 import shutil
129 shutil.rmtree(rmdir)
130
131
132 elif cmd == 'untar':
133 if len(sys.argv) < 2:
134 usage()
135 name = sys.argv[2]
136 retcode = untarDirectory(name)
137 elif cmd == 'uninstall':
138 if len(sys.argv) < 2:
139 usage()
140 pkgs = sys.argv[2:]
141 retcode = do_uninstall(pkgs)
142 elif cmd == 'pyvenv':
143 opts, args = getopt.getopt(sys.argv[2:], '', ['system-site-packages'])
144 if len(args) != 1:
145 usage()
146 path = args[0]
147 system_site_packages = False
148 for opt, arg in opts:
149 if opt == '--system-site-packages':
150 system_site_packages = True
151 do_pyvenv(path, system_site_packages)
152 else:
153 usage()
154 except Exception:
155 traceback.print_exc()
156 exit(ERROR_EXCEPTION)
157 exit(retcode)
158
159if __name__ == '__main__':
160 main()