File: util.py

package info (click to toggle)
command-not-found 0.2.38-1
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd, squeeze, wheezy
  • size: 1,248 kB
  • ctags: 199
  • sloc: python: 824; makefile: 42; sh: 18
file content (67 lines) | stat: -rw-r--r-- 2,449 bytes parent folder | download | duplicates (2)
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
# (c) Zygmunt Krynicki 2008
# Licensed under GPL, see COPYING for the whole text

import sys
import gettext

def no_gettext_for_you(message):
    """This function is used instead of gettext when there are some locale problems"""
    return message

def gettext_not_crashy(s):
    """ The getext handling is confusing:
        - gettext.gettext caused LP: #161159
        - getext.lgettext causes LP: #282446
        Here we just try both :(
    """
    try:
        return gettext.lgettext(s)
    except UnicodeEncodeError, e:
        return gettext.gettext(s)

def setup_locale():
    import locale
    try:
        locale.getpreferredencoding()
        gettext.bindtextdomain("command-not-found", "/usr/share/locale")
        gettext.textdomain("command-not-found")
        gettext.install("command-not-found", unicode=True)
        return gettext_not_crashy
    except locale.Error:
        #print "Warning: python was unable to setup locale!"
        #print "Internationalizatio features will not be enabled."
        return no_gettext_for_you

_ = gettext_wrapper = setup_locale()

def crash_guard(callback, bug_report_url, version):
    """ Calls callback and catches all exceptions.
    When something bad happens prints a long error message
    with bug report information and exits the program"""
    try:
        try:
            callback()
        except Exception, ex:
            print >>sys.stderr, _("Sorry, command-not-found has crashed! Please file a bug report for \n"
                                  "the command-not-found package, see %s\nfor further information") % bug_report_url
            print >>sys.stderr, _("Please include the following information with the report:")
            print >>sys.stderr
            print >>sys.stderr, _("command-not-found version: %s") % version
            print >>sys.stderr, _("Python version: %d.%d.%d %s %d") % sys.version_info
            try:
                import subprocess
                subprocess.call(["lsb_release", "-i", "-d", "-r", "-c"], stdout=sys.stderr)
            except (ImportError, OSError):
                pass
            print >>sys.stderr, _("Exception information:")
            print >>sys.stderr
            print >>sys.stderr, ex
            try:
                import traceback
                traceback.print_exc()
            except ImportError:
                pass
    finally:
        sys.exit(127)

__all__ = ["gettext_wrapper", "crash_guard"]