models: avoid parsing the output of 'git status'
[git-cola.git] / cola / main.py
blob451dcdb8c948ea04d69adce5014009f12c2ec60f
1 # Copyright(C) 2008, David Aguilar <davvid@gmail.com>
3 import optparse
4 import sys
5 import os
7 from cola import utils
8 from cola import version
9 from cola.models import Model
11 def main():
12 parser = optparse.OptionParser(usage='%prog [options]')
14 parser.add_option('-v', '--version',
15 help='Show cola version',
16 dest='version',
17 default=False,
18 action='store_true')
19 parser.add_option('-s', '--style',
20 help='Applies an alternate stylesheet. '
21 'The allowed values are: "dark" or a file path.',
22 dest='style',
23 metavar='PATH or STYLE',
24 default='')
25 parser.add_option('-r', '--repo',
26 help='Specifies the path to a git repository.',
27 dest='repo',
28 metavar='PATH',
29 default=os.getcwd())
30 opts, args = parser.parse_args()
32 if opts.version or 'version' in args:
33 print "cola version", version.version
34 sys.exit(0)
36 repo = os.path.realpath(opts.repo)
37 if not os.path.isdir(repo):
38 print >> sys.stderr, "fatal: '%s' is not a directory. Consider supplying -r <path>.\n" % repo
39 sys.exit(-1)
41 # load the model right away so that we can bail out when
42 # no git repo exists
43 os.chdir(repo)
44 model = Model()
45 try:
46 # Defer these imports to allow git cola --version without pyqt installed
47 from PyQt4 import QtCore
48 from PyQt4 import QtGui
49 except ImportError:
50 print >> sys.stderr, 'Sorry, you do not seem to have PyQt4 installed.'
51 print >> sys.stderr, 'Please install it before using cola.'
52 print >> sys.stderr, 'e.g.: sudo apt-get install python-qt4'
53 sys.exit(-1)
55 class ColaApplication(QtGui.QApplication):
56 """This makes translation work by throwing out the context."""
57 wrapped = QtGui.QApplication.translate
58 def translate(*args):
59 trtxt = unicode(ColaApplication.wrapped('', *args[2:]))
60 if trtxt[-6:-4] == '@@': # handle @@verb / @@noun
61 trtxt = trtxt[:-6]
62 return trtxt
64 app = ColaApplication(sys.argv)
65 QtGui.QApplication.translate = app.translate
66 app.setWindowIcon(QtGui.QIcon(utils.get_icon('git.png')))
67 locale = str(QtCore.QLocale().system().name())
68 qmfile = utils.get_qm_for_locale(locale)
69 if os.path.exists(qmfile):
70 translator = QtCore.QTranslator(app)
71 translator.load(qmfile)
72 app.installTranslator(translator)
74 if opts.style:
75 # This loads the built-in and user-specified stylesheets.
76 # We allows absolute and relative paths to a stylesheet
77 # by assuming that non-file arguments refer to a built-in style.
78 if os.path.isabs(opts.style) or os.path.isfile(opts.style):
79 filename = opts.style
80 else:
81 filename = utils.get_stylesheet(opts.style)
83 try:
84 # Automatically register each subdirectory in the style dir
85 # as a Qt resource directory.
86 dirname = os.path.dirname(filename)
87 resource_paths = []
88 resource_paths.extend(utils.get_resource_dirs(dirname))
89 for r in resource_paths:
90 basename = os.path.basename(r)
91 QtCore.QDir.setSearchPaths(basename, [r])
92 stylesheet = open(filename, 'r')
93 style = stylesheet.read()
94 stylesheet.close()
95 app.setStyleSheet(style)
96 except:
97 print >> sys.stderr, ("warn: '%s' is not a valid style."
98 % opts.style)
99 # simple mvc
100 from cola.views import View
101 from cola.controllers import Controller
102 view = View(app.activeWindow())
103 ctl = Controller(model, view)
104 view.show()
105 sys.exit(app.exec_())