From 89c6afd4b790a5a466d8badf6283e7d03d9b1dfd Mon Sep 17 00:00:00 2001 From: David Aguilar Date: Mon, 22 Sep 2008 22:02:20 -0700 Subject: [PATCH] compare: add a 'Compare File Across Commits...' menu item With these changes it is now possible to compare commits relative to a specific commit. This is basically an extension of the 'Compare Commits' functionality. Signed-off-by: David Aguilar --- cola/controllers/__init__.py | 3 +++ cola/controllers/compare.py | 51 ++++++++++++++++++++++++++++++----------- cola/controllers/repobrowser.py | 24 +++++++++++++++++-- cola/views/__init__.py | 3 ++- ui/main.ui | 6 +++++ 5 files changed, 71 insertions(+), 16 deletions(-) diff --git a/cola/controllers/__init__.py b/cola/controllers/__init__.py index 6aac7254..c2a00de8 100644 --- a/cola/controllers/__init__.py +++ b/cola/controllers/__init__.py @@ -35,6 +35,7 @@ from bookmark import save_bookmark from bookmark import manage_bookmarks from stash import stash from compare import compare +from compare import compare_file class Controller(QObserver): @@ -168,6 +169,8 @@ class Controller(QObserver): lambda: stash(self.model, self.view), menu_compare = lambda: compare(self.model, self.view), + menu_compare_file = + lambda: compare_file(self.model, self.view), menu_stage_modified = lambda: self.log(self.model.stage_modified()), menu_stage_untracked = diff --git a/cola/controllers/compare.py b/cola/controllers/compare.py index e50be3c9..b9c9b67b 100644 --- a/cola/controllers/compare.py +++ b/cola/controllers/compare.py @@ -3,21 +3,29 @@ import os from cola import utils from cola import qtutils from cola.qobserver import QObserver -from cola.views import CompareView +from cola.views import CompareView +from cola.controllers.repobrowser import select_file_from_repo from cola.controllers.util import choose_from_list -def compare(model, parent): +def compare_file(model, parent): + filename = select_file_from_repo(model, parent) + if not filename: + return + compare(model, parent, filename) + +def compare(model, parent, filename=None): model = model.clone() model.create(descriptions_start=[], descriptions_end=[], revisions_start=[], revisions_end=[], revision_start='', revision_end='', display_text='', num_results=200) view = CompareView(parent) - ctl = CompareController(model, view) + ctl = CompareController(model, view, filename) view.show() class CompareController(QObserver): - def init (self, model, view): + def init (self, model, view, filename=None): + self.filename = filename self.add_observables('descriptions_start', 'descriptions_end', 'revision_start', 'revision_end', 'display_text', 'num_results') @@ -32,10 +40,16 @@ class CompareController(QObserver): self.update_model() def update_model(self, *args): - rev_list = self.model.git.log(max_count=self.model.get_num_results(), - pretty='oneline', all=True) - commit_list = self.model.parse_rev_list(rev_list) + num_results = self.model.get_num_results() + if self.filename: + rev_list = self.model.git.log('--', self.filename, + max_count=num_results, + pretty='oneline') + else: + rev_list = self.model.git.log(max_count=num_results, + pretty='oneline', all=True) + commit_list = self.model.parse_rev_list(rev_list) commits = map(lambda x: x[0], commit_list) descriptions = map(lambda x: x[1], commit_list) @@ -69,7 +83,13 @@ class CompareController(QObserver): revision = self.model.get_param(revisions_param)[row] self.model.set_param(revision_param, revision) - diff = self.model.get_commit_diff(revision) + if self.filename: + revrange = '%s^..%s' % (revision, revision) + log = self.model.git.log(revrange) + '\n\n' + diff = log + self.model.git.diff(revrange, '--', self.filename) + else: + diff = self.model.get_commit_diff(revision) + self.model.set_display_text(diff) qtutils.set_clipboard(self.model.get_param(revision_param)) @@ -85,10 +105,15 @@ class CompareController(QObserver): qtutils.information('Nothing to do', 'git-cola did not find any changes.') return - files = zfiles_str.split('\0') - filename = choose_from_list('Select File', self.view, files) - if not filename: - return + + if self.filename: + filename = self.filename + else: + files = zfiles_str.split('\0') + filename = choose_from_list('Select File', self.view, files) + if not filename: + return + git = self.model.git status, output, err = git.difftool('--', filename, no_prompt=True, @@ -96,5 +121,5 @@ class CompareController(QObserver): start=start, end=end, with_extended_output=True) qtutils.log(output+os.linesep+err) - if status != 0: + if status != 0 and output: qtutils.information('Oops!', output) diff --git a/cola/controllers/repobrowser.py b/cola/controllers/repobrowser.py index 0db53baf..cf0eb304 100644 --- a/cola/controllers/repobrowser.py +++ b/cola/controllers/repobrowser.py @@ -8,6 +8,18 @@ from cola import defaults from cola.views import CommitView from cola.qobserver import QObserver +def select_file_from_repo(model, parent): + model = model.clone() + view = CommitView(parent) + controller = RepoBrowserController(model, view, + title='Select File', + get_file=True) + view.show() + if view.exec_() == QDialog.Accepted: + return controller.filename + else: + return None + def browse_git_branch(model, parent, branch): if not branch: return @@ -21,8 +33,10 @@ def browse_git_branch(model, parent, branch): return view.exec_() == QDialog.Accepted class RepoBrowserController(QObserver): - def init(self, model, view): - view.setWindowTitle('File Browser') + def init(self, model, view, title='File Browser', get_file=False): + self.get_file = get_file + self.filename = None + view.setWindowTitle(title) self.add_signals('itemSelectionChanged()', view.commit_list,) self.add_actions(directory = self.action_directory_changed) self.add_callbacks(commit_list = self.item_changed) @@ -102,6 +116,12 @@ class RepoBrowserController(QObserver): idx = current - len(directories) objtype, sha1, name = self.model.get_subtree_node(idx) + + if self.get_file: + self.filename = name + self.view.accept() + return + nameguess = os.path.join(defaults.DIRECTORY, name) filename = qtutils.save_dialog(self.view, 'Save', nameguess) diff --git a/cola/views/__init__.py b/cola/views/__init__.py index a594702e..df2e3963 100644 --- a/cola/views/__init__.py +++ b/cola/views/__init__.py @@ -255,7 +255,8 @@ class RemoteView(CreateStandardView(Ui_remote, QDialog)): class CompareView(CreateStandardView(Ui_compare, QDialog)): def init(self, parent=None): - self.syntax = DiffSyntaxHighlighter(self.display_text.document()) + self.syntax = DiffSyntaxHighlighter(self.display_text.document(), + whitespace=False) # These are views that do not contain any custom methods CreateBranchView = CreateStandardView(Ui_createbranch, QDialog) diff --git a/ui/main.ui b/ui/main.ui index abfc29e1..a03ffff0 100644 --- a/ui/main.ui +++ b/ui/main.ui @@ -219,6 +219,7 @@ + @@ -1128,6 +1129,11 @@ Browse Other Branch... + + + Compare File Across Commits... + + -- 2.11.4.GIT