version: add --brief flag
[git-cola.git] / bin / git-cola
blob894a9784f6ab47d18f9fb9fd610e1eae87c49d2e
1 #!/usr/bin/env python
2 # -*- python-mode -*-
3 """git-cola: The highly caffeinated Git GUI
4 """
6 __copyright__ = """
7 Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013
8 David Aguilar <davvid@gmail.com> and contributors
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License version 2 as
12 published by the Free Software Foundation.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 """
21 import os
22 import sys
23 import subprocess
24 from argparse import ArgumentParser
25 from os.path import abspath
26 from os.path import dirname
27 from os.path import realpath
30 def setup_environment():
31 """Provides access to the cola modules"""
32 # Try to detect where it is run from and set prefix and the search path.
33 # It is assumed that the user installed Cola using the --prefix= option
34 prefix = dirname(dirname(realpath(abspath(__file__))))
36 # Look for modules in the source or install trees
37 cola_mod = os.path.join(prefix, 'cola', '__init__.py')
38 if os.path.exists(cola_mod):
39 # Source tree
40 sys.path.insert(1, prefix)
41 else:
42 # Install tree
43 install_lib = os.path.join(prefix, 'share', 'git-cola', 'lib')
44 sys.path.insert(1, install_lib)
45 setup_environment()
47 from cola import core
48 from cola.app import add_common_arguments
49 from cola.app import application_init
50 from cola.app import application_start
53 def main():
54 # we're using argparse with subparser, but argparse
55 # does not allow us to assign a default subparser
56 # when none has been specified. We fake it by injecting
57 # 'cola' into the command-line so that parse_args()
58 # routes them to the 'cola' parser by default.
59 if (len(sys.argv) < 2 or
60 sys.argv[1].startswith('-') and
61 sys.argv[1] not in ('-h', '--help')):
62 sys.argv.insert(1, 'cola')
63 args = parse_args()
64 return args.func(args)
67 def parse_args():
68 parser = ArgumentParser()
69 cmds = parser.add_subparsers(title='valid commands')
71 add_cola_command(cmds)
72 add_archive_command(cmds)
73 add_branch_command(cmds)
74 add_browse_command(cmds)
75 add_config_command(cmds)
76 add_dag_command(cmds)
77 add_diff_command(cmds)
78 add_fetch_command(cmds)
79 add_grep_command(cmds)
80 add_merge_command(cmds)
81 add_pull_command(cmds)
82 add_push_command(cmds)
83 add_rebase_command(cmds)
84 add_remote_command(cmds)
85 add_search_command(cmds)
86 add_stash_command(cmds)
87 add_tag_command(cmds)
88 add_version_command(cmds)
90 return parser.parse_args()
93 def add_command(parent, name, description, func):
94 parser = parent.add_parser(name, help=description)
95 parser.set_defaults(func=func)
96 add_common_arguments(parser)
97 return parser
100 def add_cola_command(cmds):
101 add_command(cmds, 'cola', 'start git-cola', cmd_cola)
104 def add_archive_command(parent):
105 parser = add_command(parent, 'archive', 'save an archive', cmd_archive)
106 parser.add_argument('ref', metavar='<ref>', nargs='?', default=None,
107 help='SHA-1 to archive')
110 def add_branch_command(cmds):
111 add_command(cmds, 'branch', 'create a branch', cmd_branch)
114 def add_browse_command(cmds):
115 add_command(cmds, 'browse', 'browse repository', cmd_browse)
116 add_command(cmds, 'classic', 'browse repository', cmd_browse)
119 def add_config_command(cmds):
120 add_command(cmds, 'config', 'edit configuration', cmd_config)
123 def add_dag_command(cmds):
124 parser = add_command(cmds, 'dag', 'start git-dag', cmd_dag)
125 parser.add_argument('-c', '--count', metavar='<count>',
126 type=int, default=1000,
127 help='number of commits to display')
128 parser.add_argument('args', nargs='*', metavar='<args>',
129 help='git log arguments')
131 def add_diff_command(cmds):
132 parser = add_command(cmds, 'diff', 'view diffs', cmd_diff)
133 parser.add_argument('args', nargs='*', metavar='<args>',
134 help='git diff arguments')
137 def add_fetch_command(cmds):
138 add_command(cmds, 'fetch', 'fetch remotes', cmd_fetch)
141 def add_grep_command(cmds):
142 parser = add_command(cmds, 'grep', 'grep source', cmd_grep)
143 parser.add_argument('args', nargs='*', metavar='<args>',
144 help='git grep arguments')
146 def add_merge_command(cmds):
147 add_command(cmds, 'merge', 'merge branches', cmd_merge)
150 def add_pull_command(cmds):
151 parser = add_command(cmds, 'pull', 'pull remote branches', cmd_pull)
152 parser.add_argument('--rebase', default=False, action='store_true',
153 help='rebase local branch when pulling')
156 def add_push_command(cmds):
157 add_command(cmds, 'push', 'push remote branches', cmd_push)
160 def add_rebase_command(cmds):
161 parser = add_command(cmds, 'rebase', 'interactive rebase', cmd_rebase)
162 parser.add_argument('branch', metavar='<branch>',
163 help='New upstream branch')
166 def add_remote_command(cmds):
167 add_command(cmds, 'remote', 'edit remotes', cmd_remote)
170 def add_search_command(cmds):
171 add_command(cmds, 'search', 'search commits', cmd_search)
174 def add_stash_command(cmds):
175 add_command(cmds, 'stash', 'stash and unstash changes', cmd_stash)
178 def add_tag_command(cmds):
179 parser = add_command(cmds, 'tag', 'create tags', cmd_tag)
180 parser.add_argument('name', metavar='<name>', nargs='?', default=None,
181 help='tag name')
182 parser.add_argument('ref', metavar='<ref>', nargs='?', default=None,
183 help='SHA-1 to tag')
184 parser.add_argument('-s', '--sign', default=False, action='store_true',
185 help='annotated and GPG-signed tag')
187 def add_version_command(cmds):
188 parser = add_command(cmds, 'version', 'print the version', cmd_version)
189 parser.add_argument('--brief', action='store_true', default=False,
190 help='print the version number only')
192 # entry points
194 def cmd_cola(args):
195 context = application_init(args)
196 from cola.main.view import MainView
197 view = MainView(context.model)
198 return application_start(context, view)
201 def cmd_archive(args):
202 context = application_init(args, update=True)
203 if args.ref is None:
204 args.ref = context.model.currentbranch
206 from cola.widgets.archive import GitArchiveDialog
207 view = GitArchiveDialog(args.ref)
208 return application_start(context, view)
211 def cmd_branch(args):
212 context = application_init(args, update=True)
213 from cola.widgets.createbranch import create_new_branch
214 view = create_new_branch()
215 return application_start(context, view)
218 def cmd_browse(args):
219 context = application_init(args)
220 from cola.classic import cola_classic
221 view = cola_classic(update=False)
222 return application_start(context, view)
225 def cmd_config(args):
226 context = application_init(args)
227 from cola.widgets.prefs import preferences
228 view = preferences()
229 return application_start(context, view)
232 def cmd_dag(args):
233 context = application_init(args)
234 from cola.widgets.dag import git_dag
235 view = git_dag(context.model, args=args)
236 return application_start(context, view)
239 def cmd_diff(args):
240 context = application_init(args)
241 from cola.difftool import diff_expression
242 expr = subprocess.list2cmdline(map(core.decode, args.args))
243 view = diff_expression(None, expr, create_widget=True)
244 return application_start(context, view)
247 def cmd_fetch(args):
248 # TODO: the calls to update_status() can be done asynchronously
249 # by hooking into the message_updated notification.
250 context = application_init(args)
251 from cola.widgets import remote
252 context.model.update_status()
253 view = remote.fetch()
254 return application_start(context, view)
257 def cmd_grep(args):
258 context = application_init(args)
259 from cola.widgets import grep
260 text = subprocess.list2cmdline(map(core.decode, args.args))
261 view = grep.run_grep(text=text, parent=None)
262 return application_start(context, view)
265 def cmd_merge(args):
266 context = application_init(args, update=True)
267 from cola.widgets.merge import MergeView
268 view = MergeView(context.model, parent=None)
269 return application_start(context, view)
272 def cmd_version(args):
273 from cola import version
274 version.print_version(brief=args.brief)
275 return 0
278 def cmd_pull(args):
279 context = application_init(args, update=True)
280 from cola.widgets import remote
281 view = remote.pull()
282 if args.rebase:
283 view.set_rebase(True)
284 return application_start(context, view)
287 def cmd_push(args):
288 context = application_init(args, update=True)
289 from cola.widgets import remote
290 view = remote.push()
291 return application_start(context, view)
294 def cmd_rebase(args):
295 from cola import cmds
296 status, out, err = cmds.do(cmds.Rebase, args.branch)
297 if out:
298 core.stdout(out)
299 if err:
300 core.stderr(err)
301 return status
304 def cmd_remote(args):
305 context = application_init(args)
306 from cola.widgets import editremotes
307 view = editremotes.edit()
308 return application_start(context, view)
311 def cmd_search(args):
312 context = application_init(args)
313 from cola.widgets.search import search
314 view = search()
315 return application_start(context, view)
318 def cmd_stash(args):
319 context = application_init(args)
320 from cola.widgets.stash import stash
321 view = stash()
322 return application_start(context, view)
325 def cmd_tag(args):
326 context = application_init(args)
327 from cola.widgets.createtag import create_tag
328 view = create_tag(name=args.name, ref=args.ref, sign=args.sign)
329 return application_start(context, view)
332 if __name__ == '__main__':
333 sys.exit(main())