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
;
35 * Compares the working tree content of a file with the version of the file
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
);
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
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(
72 CompareUI
.openCompareEditor(in
);
76 public boolean isEnabled() {
77 final IResource
[] selectedResources
= getSelectedResources();
78 if (selectedResources
.length
!= 1)
81 final IResource resource
= selectedResources
[0];
82 if (!(resource
instanceof IFile
)) {
85 final RepositoryMapping mapping
= RepositoryMapping
.getMapping(resource
.getProject());
86 return mapping
!= null;