3 """git-cola: The highly caffeinated Git GUI
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.
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
):
40 sys
.path
.insert(1, prefix
)
43 install_lib
= os
.path
.join(prefix
, 'share', 'git-cola', 'lib')
44 sys
.path
.insert(1, install_lib
)
48 from cola
.app
import add_common_arguments
49 from cola
.app
import application_init
50 from cola
.app
import application_start
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')
64 return args
.func(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
)
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
)
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
)
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,
182 parser
.add_argument('ref', metavar
='<ref>', nargs
='?', default
=None,
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')
195 context
= application_init(args
)
196 from cola
.widgets
.main
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)
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
.widgets
.browse
import worktree_browser
221 view
= worktree_browser(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
229 return application_start(context
, view
)
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
)
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
)
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
)
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
)
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
)
279 context
= application_init(args
, update
=True)
280 from cola
.widgets
import remote
283 view
.set_rebase(True)
284 return application_start(context
, view
)
288 context
= application_init(args
, update
=True)
289 from cola
.widgets
import remote
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
)
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
315 return application_start(context
, view
)
319 context
= application_init(args
)
320 from cola
.widgets
.stash
import stash
322 return application_start(context
, view
)
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__':