diff options
author | Robin Rosenberg | 2011-01-15 23:21:10 +0000 |
---|---|---|
committer | Matthias Sohn | 2011-01-18 22:56:42 +0000 |
commit | 7d56679922146f2532f46fbf27141a303b14e526 (patch) | |
tree | 7410a6362e0e14b37d579547900eff1e25c294db | |
parent | 0ae335d84ceb351901dfbc28e19d1d005b765968 (diff) | |
download | egit-7d56679922146f2532f46fbf27141a303b14e526.tar.gz egit-7d56679922146f2532f46fbf27141a303b14e526.tar.xz egit-7d56679922146f2532f46fbf27141a303b14e526.zip |
Refactor a utility to get a list of RefNodes from a commit
Change-Id: Id3d6ef20a309051ff084cef088b2c71e2a83ed3d
Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
2 files changed, 39 insertions, 28 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/AbstractHistoryCommanndHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/AbstractHistoryCommanndHandler.java index 950754760b..c94d1516b1 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/AbstractHistoryCommanndHandler.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/AbstractHistoryCommanndHandler.java @@ -13,6 +13,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; import org.eclipse.compare.CompareEditorInput; import org.eclipse.core.commands.AbstractHandler; @@ -26,12 +27,15 @@ import org.eclipse.egit.ui.UIText; import org.eclipse.egit.ui.internal.CompareUtils; import org.eclipse.egit.ui.internal.history.GitHistoryPage; import org.eclipse.egit.ui.internal.history.HistoryPageInput; +import org.eclipse.egit.ui.internal.repository.tree.RefNode; +import org.eclipse.egit.ui.internal.repository.tree.RepositoryNode; import org.eclipse.egit.ui.internal.repository.tree.RepositoryTreeNode; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevTag; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.team.ui.history.IHistoryPage; @@ -128,4 +132,34 @@ abstract class AbstractHistoryCommanndHandler extends AbstractHandler { } else return new StructuredSelection(); } + + /** + * Utility to get a list of Refs from a commit in order to handle ambiguous + * selections when a Ref is preferred over a commit. + * + * @param commit + * @param repo + * @param refPrefix + * e.g. "refs/heads/" or "" + * @return a list of RefNodes + */ + protected List<RefNode> getRefNodes(RevCommit commit, Repository repo, String refPrefix) { + List<Ref> availableBranches = new ArrayList<Ref>(); + List<RefNode> nodes = new ArrayList<RefNode>(); + try { + Map<String, Ref> branches = repo.getRefDatabase().getRefs( + refPrefix); + for (Ref branch : branches.values()) { + if (branch.getLeaf().getObjectId().equals(commit.getId())) + availableBranches.add(branch); + } + RepositoryNode repoNode = new RepositoryNode(null, repo); + for (Ref ref : availableBranches) + nodes.add(new RefNode(repoNode, repo, ref)); + + } catch (IOException e) { + // ignore here + } + return nodes; + } } diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/CheckoutCommitHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/CheckoutCommitHandler.java index 2b0e1dc053..c68bbed2f2 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/CheckoutCommitHandler.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/command/CheckoutCommitHandler.java @@ -8,10 +8,7 @@ *******************************************************************************/ package org.eclipse.egit.ui.internal.history.command; -import java.io.IOException; -import java.util.ArrayList; import java.util.List; -import java.util.Map; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; @@ -19,13 +16,10 @@ import org.eclipse.egit.ui.UIText; import org.eclipse.egit.ui.internal.branch.BranchOperationUI; import org.eclipse.egit.ui.internal.history.GitHistoryPage; import org.eclipse.egit.ui.internal.repository.tree.RefNode; -import org.eclipse.egit.ui.internal.repository.tree.RepositoryNode; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revplot.PlotCommit; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.handlers.HandlerUtil; @@ -42,35 +36,18 @@ public class CheckoutCommitHandler extends AbstractHistoryCommanndHandler { } public Object execute(ExecutionEvent event) throws ExecutionException { - PlotCommit commit = (PlotCommit) getSelection(getPage()) - .getFirstElement(); + RevCommit commit = (RevCommit) getSelection(getPage()).getFirstElement(); Repository repo = getRepository(event); - List<Ref> availableBranches = new ArrayList<Ref>(); final BranchOperationUI op; - try { - Map<String, Ref> localBranches = repo.getRefDatabase().getRefs( - Constants.R_HEADS); - for (Ref branch : localBranches.values()) { - if (branch.getLeaf().getObjectId().equals(commit.getId())) { - availableBranches.add(branch); - } - } - } catch (IOException e) { - // ignore here - } + List<RefNode> nodes = getRefNodes(commit, repo, Constants.R_HEADS); - if (availableBranches.isEmpty()) + if (nodes.isEmpty()) op = new BranchOperationUI(repo, commit.getId()); - else if (availableBranches.size() == 1) - op = new BranchOperationUI(repo, availableBranches.get(0).getName()); + else if (nodes.size() == 1) + op = new BranchOperationUI(repo, nodes.get(0).getObject().getName()); else { - List<RefNode> nodes = new ArrayList<RefNode>(); - RepositoryNode repoNode = new RepositoryNode(null, repo); - for (Ref ref : availableBranches) { - nodes.add(new RefNode(repoNode, repo, ref)); - } BranchMessageDialog dlg = new BranchMessageDialog(HandlerUtil .getActiveShellChecked(event), nodes); if (dlg.open() == Window.OK) { |