From b651cfc9ebd2a1a25c20167aff3d3db2c7a80834 Mon Sep 17 00:00:00 2001 From: David Aguilar Date: Mon, 14 Apr 2008 04:38:21 -0700 Subject: [PATCH] controllers: added a merge controller Signed-off-by: David Aguilar --- ugit/controllers/__init__.py | 16 ++-- ugit/controllers/merge.py | 89 +++++++++++++++++++++++ ugit/controllers/repobrowser.py | 2 +- ugit/git.py | 6 ++ ugit/models.py | 8 +- ugit/qobserver.py | 2 + ugit/views/__init__.py | 8 ++ ui/branch.ui | 2 +- ui/merge.ui | 157 ++++++++++++++++++++++++++++++++++++++++ 9 files changed, 278 insertions(+), 12 deletions(-) create mode 100644 ugit/controllers/merge.py create mode 100644 ui/merge.ui diff --git a/ugit/controllers/__init__.py b/ugit/controllers/__init__.py index 5cd6a1e..4b337d7 100644 --- a/ugit/controllers/__init__.py +++ b/ugit/controllers/__init__.py @@ -24,7 +24,8 @@ from util import update_options from repobrowser import browse_git_branch from createbranch import create_new_branch from search import search_commits -from merge import merge_local +from merge import local_merge +from merge import abort_merge class Controller(QObserver): """Manages the interaction between models and views.""" @@ -107,8 +108,10 @@ class Controller(QObserver): self.gen_search( search.COMMITTER ), # Merge Menu + menu_merge_local = + lambda: local_merge( self.model, self.view ), menu_merge_abort = - lambda: self.log( self.model.abort_merge() ), + lambda: abort_merge( self.model, self.view ), # Repository Menu menu_visualize_current = self.viz_current, @@ -268,7 +271,7 @@ class Controller(QObserver): self.log(self.model.delete_branch(branch)) def browse_current(self): - branch = self.model.get_branch() + branch = self.model.get_currentbranch() browse_git_branch(self.model, self.view, branch) def browse_other(self): @@ -462,7 +465,7 @@ class Controller(QObserver): self.view.setWindowTitle('%s [%s]' % ( self.model.get_project(), - self.model.get_branch())) + self.model.get_currentbranch())) if self.model.has_squash_msg(): if self.model.get_commitmsg(): @@ -587,7 +590,7 @@ class Controller(QObserver): def viz_current(self): """Visualizes the current branch's history using gitk.""" browser = self.model.get_global_ugit_historybrowser() - utils.fork(browser, self.model.get_branch()) + utils.fork(browser, self.model.get_currentbranch()) def move_event(self, event): defaults.X = event.pos().x() @@ -725,7 +728,8 @@ class Controller(QObserver): QtGui.qApp.setFont(qfont) def init_log_window(self): - branch, version = self.model.get_branch(), defaults.VERSION + branch = self.model.get_currentbranch() + version = defaults.VERSION qtutils.log(self.model.get_git_version() + '\nugit version '+ version + '\nCurrent Branch: '+ branch) diff --git a/ugit/controllers/merge.py b/ugit/controllers/merge.py new file mode 100644 index 0000000..f190a68 --- /dev/null +++ b/ugit/controllers/merge.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python +from ugit import utils +from ugit import qtutils +from ugit.qobserver import QObserver +from ugit.views import MergeView + +def abort_merge(model, parent): + txt = parent.tr("Abort merge?\n" + "Aborting the current merge will cause " + "*ALL* uncommitted changes to be lost.\n\n" + "Continue with aborting the current merge?") + answer = qtutils.question(parent, parent.tr('Abort Merge?'), txt) + if answer: + model.abort_merge() + +def local_merge(model, parent): + model = model.clone() + model.create(revision='', revision_list=[]) + view = MergeView(parent) + ctl = MergeController(model, view) + view.show() + +class MergeController(QObserver): + def init(self, model, view): + # Set the current branch label + branch = self.model.get_currentbranch() + title = unicode(self.tr('Merge Into %s')) % branch + self.view.label.setText(title) + self.add_observables('revision', 'revision_list') + self.add_callbacks( + radio_local = self.radio_callback, + radio_remote = self.radio_callback, + radio_tag = self.radio_callback, + revision_list = self.revision_selected, + button_viz = self.viz_revision, + button_merge = self.merge_revision, + ) + self.model.set_revision_list( + self.model.get_local_branches()) + self.view.radio_local.setChecked(True) + + def get_revision_list(self): + if self.view.radio_local.isChecked(): + return self.model.get_local_branches() + elif self.view.radio_remote.isChecked(): + return self.model.get_remote_branches() + elif self.view.radio_tag.isChecked(): + return self.model.get_tags() + return [] + + def revision_selected(self, *args): + revlist = self.get_revision_list() + widget = self.view.revision_list + row, selected = qtutils.get_selected_row(widget) + if selected and row < len(revlist): + revision = revlist[row] + self.model.set_revision(revision) + + def radio_callback(self): + revlist = self.get_revision_list() + self.model.set_revision_list(revlist) + + def merge_revision(self): + revision = self.model.get_revision() + if not revision: + qtutils.information( + self.view, + "No Revision Specified", + "You must specify a revision to merge") + return + + squash = self.view.checkbox_squash.isChecked() + msg = self.model.get_merge_message() + qtutils.log( + self.model.merge( + '-m'+msg, + revision, + strategy='recursive', + no_commit=squash, + squash=squash + ), + quiet=False, + doraise=True) + self.view.accept() + + def viz_revision(self): + revision = self.model.get_revision() + browser = self.model.get_global_ugit_historybrowser() + utils.fork(browser, revision) diff --git a/ugit/controllers/repobrowser.py b/ugit/controllers/repobrowser.py index 3bd4025..896cf5f 100644 --- a/ugit/controllers/repobrowser.py +++ b/ugit/controllers/repobrowser.py @@ -13,7 +13,7 @@ def browse_git_branch(model, parent, branch): # Clone the model to allow opening multiple browsers # with different sets of data model = model.clone() - model.set_branch(branch) + model.set_currentbranch(branch) view = CommitView(parent) controller = RepoBrowserController(model, view) view.show() diff --git a/ugit/git.py b/ugit/git.py index 4f47bdc..5583d73 100644 --- a/ugit/git.py +++ b/ugit/git.py @@ -257,6 +257,12 @@ def format_patch_helper(*revs): num_patches += output[-1].count('\n') return '\n'.join(output) +def gitpath(name): + return os.path.join('.git', name) + +def get_merge_message(): + return gitcmd.fmt_merge_msg('--file', gitpath('FETCH_HEAD')) + def config_dict(local=True): if local: argv = [ '--list' ] diff --git a/ugit/models.py b/ugit/models.py index 3e00dc5..cc7b6af 100644 --- a/ugit/models.py +++ b/ugit/models.py @@ -32,7 +32,7 @@ class Model(model.Model): self.create( ##################################################### # Used in various places - branch = '', + currentbranch = '', remotes = [], remote = '', local_branch = '', @@ -168,7 +168,7 @@ class Model(model.Model): directories, directory_entries, and subtree_*''' # Collect data for the model - if not self.get_branch(): return + if not self.get_currentbranch(): return self.subtree_types = [] self.subtree_sha1s = [] @@ -177,7 +177,7 @@ class Model(model.Model): self.directory_entries = {} # Lookup the tree info - tree_info = git.parse_ls_tree(self.get_branch()) + tree_info = git.parse_ls_tree(self.get_currentbranch()) self.set_types(map( lambda(x): x[1], tree_info )) self.set_sha1s(map( lambda(x): x[2], tree_info )) @@ -326,7 +326,7 @@ class Model(model.Model): if untracked not in self.get_untracked(): self.add_untracked(untracked) - self.set_branch(git.current_branch()) + self.set_currentbranch(git.current_branch()) self.set_unstaged(self.get_modified() + self.get_untracked()) self.set_remotes(git.remote().splitlines()) self.set_remote_branches(git.branch_list(remote=True)) diff --git a/ugit/qobserver.py b/ugit/qobserver.py index ebd2a4b..cd6d889 100644 --- a/ugit/qobserver.py +++ b/ugit/qobserver.py @@ -67,6 +67,8 @@ class QObserver(Observer, QObject): fmt = Qt.ISODate value = str(widget.date().toString(fmt)) model.set_param(model_param, value) + elif isinstance(widget, QListWidget): + pass else: print("SLOT(): Unknown widget:", sender, widget) diff --git a/ugit/views/__init__.py b/ugit/views/__init__.py index ee8b8f0..d784695 100644 --- a/ugit/views/__init__.py +++ b/ugit/views/__init__.py @@ -18,6 +18,7 @@ from logger import Ui_logger from search import Ui_search from options import Ui_options from createbranch import Ui_createbranch +from merge import Ui_merge class View(Ui_main, QMainWindow): '''The main ugit interface.''' @@ -176,3 +177,10 @@ class SearchView(Ui_search, QDialog): self.input.setFocus() DiffSyntaxHighlighter(self.commit_text.document(), whitespace=False) + +class MergeView(Ui_merge, QDialog): + def __init__(self, parent=None): + QDialog.__init__(self, parent) + Ui_search.__init__(self) + self.setupUi(self) + self.revision.setFocus() diff --git a/ui/branch.ui b/ui/branch.ui index 58c302d..4aa2df0 100644 --- a/ui/branch.ui +++ b/ui/branch.ui @@ -1,6 +1,6 @@ branch - + 0 diff --git a/ui/merge.ui b/ui/merge.ui new file mode 100644 index 0000000..246f384 --- /dev/null +++ b/ui/merge.ui @@ -0,0 +1,157 @@ + + merge + + + + 0 + 0 + 673 + 339 + + + + Merge + + + + + + Merge into %s + + + Qt::AlignCenter + + + + + + + Revision To Merge + + + + 5 + + + 0 + + + 5 + + + 5 + + + 0 + + + 0 + + + + + Revision Expression: + + + + + + + + + + Local Branch + + + + + + + Tracking Branch + + + + + + + Tag + + + + + + + true + + + + + + + + + + + + Visualize + + + + + + + Qt::Horizontal + + + + 211 + 20 + + + + + + + + Cancel + + + + + + + Merge + + + + + + + Squash + + + + + + + + + + + button_cancel + clicked() + merge + reject() + + + 540 + 316 + + + 336 + 169 + + + + + -- 2.11.4.GIT