1 """This controller handles the merge dialog."""
4 from PyQt4
import QtGui
5 from PyQt4
.Qt
import Qt
9 from cola
import qtutils
10 from cola
.qobserver
import QObserver
11 from cola
.views
.merge
import MergeView
14 """Prompts before aborting a merge in progress
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()
22 answer
= qtutils
.question(parent
, 'Abort Merge?', txt
, default
=False)
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
)
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
)
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
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
76 qtutils
.information('No Revision Specified',
77 'You must specify a revision to merge')
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
,
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
])