models.main: Do not return cached values in everything()
[git-cola.git] / cola / controllers / merge.py
blob1785a51c5fae182435dd1ce25f6fc1efd669e1aa
1 """This controller handles the merge dialog."""
4 from PyQt4 import QtGui
5 from PyQt4.Qt import Qt
7 import cola
8 from cola import utils
9 from cola import qtutils
10 from cola.qobserver import QObserver
11 from cola.views.merge import MergeView
13 def abort_merge():
14 """Prompts before aborting a merge in progress
15 """
16 txt = ('Abort merge?\n'
17 'Aborting the current merge will cause '
18 '*ALL* uncommitted changes to be lost.\n\n'
19 'Continue with aborting the current merge?')
20 parent = QtGui.QApplication.instance().activeWindow()
21 model = cola.model()
22 answer = qtutils.question(parent, 'Abort Merge?', txt, default=False)
23 if answer:
24 model.abort_merge()
26 def local_merge():
27 """Provides a dialog for merging branches"""
28 model = cola.model().clone()
29 parent = QtGui.QApplication.instance().activeWindow()
30 view = MergeView(parent)
31 ctl = MergeController(model, view)
32 view.show()
34 class MergeController(QObserver):
35 """Provide control to the merge dialog"""
36 def __init__(self, model, view):
37 QObserver.__init__(self, model, view)
38 # Set the current branch label
39 self.view.set_branch(self.model.currentbranch)
40 self.add_observables('revision', 'revisions')
41 self.add_callbacks(radio_local = self.radio_callback,
42 radio_remote = self.radio_callback,
43 radio_tag = self.radio_callback,
44 revisions = self.revision_selected,
45 button_viz = self.viz_revision,
46 button_merge = self.merge_revision)
47 self.model.set_revisions(self.model.local_branches)
49 def revisions(self):
50 """Retrieve candidate items to merge"""
51 if self.view.radio_local.isChecked():
52 return self.model.local_branches
53 elif self.view.radio_remote.isChecked():
54 return self.model.remote_branches
55 elif self.view.radio_tag.isChecked():
56 return self.model.tags
57 return []
59 def revision_selected(self, *args):
60 """Update the revision field when a list item is selected"""
61 revlist = self.revisions()
62 widget = self.view.revisions
63 row, selected = qtutils.selected_row(widget)
64 if selected and row < len(revlist):
65 revision = revlist[row]
66 self.model.set_revision(revision)
68 def radio_callback(self):
69 """Update the revision list whenever a radio button is clicked"""
70 self.model.set_revisions(self.revisions())
72 def merge_revision(self):
73 """Merge the selected revision/branch"""
74 revision = self.model.revision
75 if not revision:
76 qtutils.information('No Revision Specified',
77 'You must specify a revision to merge')
78 return
80 no_commit = not(self.view.checkbox_commit.isChecked())
81 squash = self.view.checkbox_squash.isChecked()
82 msg = self.model.merge_message()
83 qtutils.log(*self.model.git.merge('-m'+msg,
84 revision,
85 strategy='recursive',
86 no_commit=no_commit,
87 squash=squash,
88 with_stderr=True,
89 with_status=True))
90 self.view.accept()
92 def viz_revision(self):
93 """Launch a gitk-like viewer on the selection revision"""
94 revision = self.model.revision
95 browser = self.model.history_browser()
96 utils.fork([browser, revision])