pylint fixes
[pysize.git] / pysize / main.py
blobe4b590236cbbd85baa2be879f9ef4d9ecac19253
1 # This program is free software; you can redistribute it and/or modify
2 # it under the terms of the GNU General Public License as published by
3 # the Free Software Foundation; either version 2 of the License, or
4 # (at your option) any later version.
6 # This program is distributed in the hope that it will be useful,
7 # but WITHOUT ANY WARRANTY; without even the implied warranty of
8 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 # GNU Library General Public License for more details.
11 # You should have received a copy of the GNU General Public License
12 # along with this program; if not, write to the Free Software
13 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
15 # See the COPYING file for license information.
17 # Copyright (c) 2006, 2007, 2008 Guillaume Chazarain <guichaz@gmail.com>
19 import sys
20 import os
21 import optparse
22 import locale
24 if sys.hexversion < 0x02040000:
25 print >> sys.stderr, 'Your python version is too old (%s)' % \
26 (sys.version.split()[0])
27 print >> sys.stderr, 'You need at least Python 2.4'
28 sys.exit(1)
30 from pysize.ui.ascii import ui_ascii
31 from pysize.ui.curses import ui_curses
32 from pysize.ui.gtk import ui_gtk
33 from pysize.ui.utils import UINotAvailableException
34 from pysize.version import VERSION
35 from pysize.core.exception_propagation import unexpect
37 def _ui_auto(options, args):
38 """Automatically choose the best available UI."""
39 for ui_run in ui_gtk.run, ui_curses.run, ui_ascii.run:
40 try:
41 ui_run(options, args)
42 return
43 except UINotAvailableException:
44 pass
46 raise UINotAvailableException
48 UI = {'ascii': ui_ascii.run, 'curses': ui_curses.run,
49 'gtk': ui_gtk.run, 'auto': _ui_auto}
51 def _profile(continuation):
52 prof_file = 'pysize.prof'
53 try:
54 import cProfile
55 import pstats
56 print 'Profiling using cProfile'
57 cProfile.runctx('continuation()', globals(), locals(), prof_file)
58 stats = pstats.Stats(prof_file)
59 except ImportError:
60 import hotshot
61 import hotshot.stats
62 prof = hotshot.Profile(prof_file)
63 print 'Profiling using hotshot'
64 prof.runcall(continuation)
65 prof.close()
66 stats = hotshot.stats.load(prof_file)
67 stats.strip_dirs()
68 stats.sort_stats('time', 'calls')
69 stats.print_stats(40)
70 os.remove(prof_file)
72 def _try_psyco():
73 try:
74 # Try to use psyco if available
75 import psyco
76 psyco.full()
77 except ImportError:
78 pass
80 def setprocname(name):
81 # From comments on http://davyd.livejournal.com/166352.html
82 try:
83 # For Python-2.5
84 import ctypes
85 libc = ctypes.CDLL(None)
86 # Linux 2.6 PR_SET_NAME
87 if libc.prctl(15, name, 0, 0, 0):
88 # BSD
89 libc.setproctitle(name)
90 except:
91 try:
92 # For 32 bit
93 import dl
94 libc = dl.open(None)
95 name += '\0'
96 # Linux 2.6 PR_SET_NAME
97 if libc.call('prctl', 15, name, 0, 0, 0):
98 # BSD
99 libc.call('setproctitle', name)
100 except:
101 pass
103 @unexpect(Exception)
104 def main():
105 _try_psyco()
106 locale.setlocale(locale.LC_ALL, '')
107 setprocname('pysize')
108 usage = '%s [OPTIONS] [DIRECTORIES...]' % (sys.argv[0])
109 parser = optparse.OptionParser(usage=usage, version='pysize ' + VERSION)
110 parser.add_option('--ui', type='choice', choices=UI.keys(), default='auto',
111 help='choose the ui between: [auto], gtk, curses, ascii')
112 parser.add_option('--xdev', action='store_false', dest='cross_device',
113 default=True,
114 help='ignore directories on other filesystems')
115 parser.add_option('--max-depth', type='int', dest='max_depth', default=6,
116 metavar='DEPTH',
117 help='maximum depth of the displayed tree [6]')
118 parser.add_option('--profile', action='store_true', dest='profile',
119 default=False, help=optparse.SUPPRESS_HELP)
120 options, args = parser.parse_args()
122 if options.max_depth < 2:
123 parser.error('maximum depth must be at least 2')
125 args = map(os.path.realpath, args)
126 def continuation():
127 try:
128 UI[options.ui](options, args)
129 except UINotAvailableException:
130 print 'The interface "%s" is not available' % (options.ui)
132 if options.profile:
133 _profile(continuation)
134 else:
135 continuation()