Don't use SIGUSR1 under Jython, bug #424259.
[portage.git] / bin / emerge
1 #!/usr/bin/python
2 # Copyright 2006-2012 Gentoo Foundation
3 # Distributed under the terms of the GNU General Public License v2
4
5 from __future__ import print_function
6
7 import platform
8 import signal
9 import sys
10 # This block ensures that ^C interrupts are handled quietly.
11 try:
12
13         def exithandler(signum,frame):
14                 signal.signal(signal.SIGINT, signal.SIG_IGN)
15                 signal.signal(signal.SIGTERM, signal.SIG_IGN)
16                 sys.exit(128 + signum)
17
18         signal.signal(signal.SIGINT, exithandler)
19         signal.signal(signal.SIGTERM, exithandler)
20         # Prevent "[Errno 32] Broken pipe" exceptions when
21         # writing to a pipe.
22         signal.signal(signal.SIGPIPE, signal.SIG_DFL)
23
24 except KeyboardInterrupt:
25         sys.exit(128 + signal.SIGINT)
26
27 def debug_signal(signum, frame):
28         import pdb
29         pdb.set_trace()
30
31 if platform.python_implementation() == 'Jython':
32         debug_signum = signal.SIGUSR2 # bug #424259
33 else:
34         debug_signum = signal.SIGUSR1
35
36 signal.signal(debug_signum, debug_signal)
37
38 try:
39         from _emerge.main import emerge_main
40 except ImportError:
41         from os import path as osp
42         import sys
43         sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
44         from _emerge.main import emerge_main
45
46 if __name__ == "__main__":
47         import sys
48         from portage.exception import ParseError, PermissionDenied
49         try:
50                 retval = emerge_main()
51         except PermissionDenied as e:
52                 sys.stderr.write("Permission denied: '%s'\n" % str(e))
53                 sys.exit(e.errno)
54         except ParseError as e:
55                 sys.stderr.write("%s\n" % str(e))
56                 sys.exit(1)
57         except SystemExit:
58                 raise
59         except Exception:
60                 # If an unexpected exception occurs then we don't want the mod_echo
61                 # output to obscure the traceback, so dump the mod_echo output before
62                 # showing the traceback.
63                 import traceback
64                 tb_str = traceback.format_exc()
65                 try:
66                         from portage.elog import mod_echo
67                 except ImportError:
68                         pass
69                 else:
70                         mod_echo.finalize()
71                 sys.stderr.write(tb_str)
72                 sys.exit(1)
73         sys.exit(retval)