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