Check for unsaved changes before Commit
[egit.git] / org.eclipse.egit.ui / src / org / eclipse / egit / ui / internal / actions / CompareWithHeadAction.java
blobf2c95330b6e6660d1d364ad99f84d4db5422ea4d
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.project.RepositoryMapping;
19 import org.eclipse.egit.ui.internal.CompareUtils;
20 import org.eclipse.egit.ui.internal.GitCompareFileRevisionEditorInput;
21 import org.eclipse.jface.action.IAction;
22 import org.eclipse.jgit.lib.Constants;
23 import org.eclipse.jgit.lib.Ref;
24 import org.eclipse.jgit.lib.Repository;
25 import org.eclipse.jgit.revwalk.RevCommit;
26 import org.eclipse.jgit.revwalk.RevWalk;
27 import org.eclipse.team.ui.synchronize.SaveableCompareEditorInput;
29 /**
30 * Compares the working tree content of a file with the version of the file
31 * in the HEAD commit.
33 public class CompareWithHeadAction extends RepositoryAction {
35 public void execute(IAction action) throws InvocationTargetException {
36 final IResource resource = getSelectedResources()[0];
37 final RepositoryMapping mapping = RepositoryMapping.getMapping(resource.getProject());
38 final Repository repository = mapping.getRepository();
39 final String gitPath = mapping.getRepoRelativePath(resource);
42 final IFile baseFile = (IFile) resource;
43 final ITypedElement base = SaveableCompareEditorInput.createFileElement(baseFile);
45 ITypedElement next;
46 try {
47 Ref head = repository.getRef(Constants.HEAD);
48 RevWalk rw = new RevWalk(repository);
49 RevCommit commit = rw.parseCommit(head.getObjectId());
51 next = CompareUtils.getFileRevisionTypedElement(gitPath, commit,
52 repository);
53 } catch (IOException e) {
54 // this exception is handled by TeamAction.run
55 throw new InvocationTargetException(e);
59 final GitCompareFileRevisionEditorInput in = new GitCompareFileRevisionEditorInput(
60 base, next, null);
61 CompareUI.openCompareEditor(in);
64 @Override
65 public boolean isEnabled() {
66 final IResource[] selectedResources = getSelectedResources();
67 if (selectedResources.length != 1)
68 return false;
70 final IResource resource = selectedResources[0];
71 if (!(resource instanceof IFile)) {
72 return false;
74 final RepositoryMapping mapping = RepositoryMapping.getMapping(resource.getProject());
75 return mapping != null;