Git Repositories View: Allow to "remove" multiple Repositories
[egit.git] / org.eclipse.egit.ui / src / org / eclipse / egit / ui / internal / actions / CompareWithHeadAction.java
blob6a7c7f42b792c92b8f03c44effb244ca1ce01b51
1 /*******************************************************************************
2 * Copyright (C) 2009, Stefan Lay <stefan.lay@sap.com>
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *******************************************************************************/
9 package org.eclipse.egit.ui.internal.actions;
11 import java.io.IOException;
12 import java.lang.reflect.InvocationTargetException;
14 import org.eclipse.compare.CompareUI;
15 import org.eclipse.compare.ITypedElement;
16 import org.eclipse.core.resources.IFile;
17 import org.eclipse.core.resources.IResource;
18 import org.eclipse.egit.core.internal.storage.GitFileRevision;
19 import org.eclipse.egit.core.project.RepositoryMapping;
20 import org.eclipse.egit.ui.UIText;
21 import org.eclipse.egit.ui.internal.GitCompareFileRevisionEditorInput;
22 import org.eclipse.jface.action.IAction;
23 import org.eclipse.jgit.lib.Constants;
24 import org.eclipse.jgit.lib.Ref;
25 import org.eclipse.jgit.lib.Repository;
26 import org.eclipse.jgit.revwalk.RevCommit;
27 import org.eclipse.jgit.revwalk.RevWalk;
28 import org.eclipse.jgit.treewalk.TreeWalk;
29 import org.eclipse.osgi.util.NLS;
30 import org.eclipse.team.core.history.IFileRevision;
31 import org.eclipse.team.internal.ui.history.FileRevisionTypedElement;
32 import org.eclipse.team.ui.synchronize.SaveableCompareEditorInput;
34 /**
35 * Compares the working tree content of a file with the version of the file
36 * in the HEAD commit.
38 public class CompareWithHeadAction extends RepositoryAction {
40 public void execute(IAction action) throws InvocationTargetException {
41 final IResource resource = getSelectedResources()[0];
42 final RepositoryMapping mapping = RepositoryMapping.getMapping(resource.getProject());
43 final Repository repository = mapping.getRepository();
44 final String gitPath = mapping.getRepoRelativePath(resource);
47 final IFile baseFile = (IFile) resource;
48 final ITypedElement base = SaveableCompareEditorInput.createFileElement(baseFile);
50 ITypedElement next;
51 try {
52 Ref head = repository.getRef(Constants.HEAD);
53 RevWalk rw = new RevWalk(repository);
54 RevCommit commit = rw.parseCommit(head.getObjectId());
56 next = new GitCompareFileRevisionEditorInput.EmptyTypedElement(NLS.bind(UIText.GitHistoryPage_FileNotInCommit,
57 resource.getName(), commit));
58 TreeWalk w = TreeWalk.forPath(repository, gitPath, commit.getTree());
59 // check if file is contained in commit
60 if (w != null) {
61 final IFileRevision nextFile = GitFileRevision.inCommit(repository, commit, gitPath, null);
62 next = new FileRevisionTypedElement(nextFile);
64 } catch (IOException e) {
65 // this exception is handled by TeamAction.run
66 throw new InvocationTargetException(e);
70 final GitCompareFileRevisionEditorInput in = new GitCompareFileRevisionEditorInput(
71 base, next, null);
72 CompareUI.openCompareEditor(in);
75 @Override
76 public boolean isEnabled() {
77 final IResource[] selectedResources = getSelectedResources();
78 if (selectedResources.length != 1)
79 return false;
81 final IResource resource = selectedResources[0];
82 if (!(resource instanceof IFile)) {
83 return false;
85 final RepositoryMapping mapping = RepositoryMapping.getMapping(resource.getProject());
86 return mapping != null;