1 /*******************************************************************************
2 * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.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 * See LICENSE for the full license text, also available.
7 *******************************************************************************/
8 package org
.spearce
.egit
.ui
.internal
.decorators
;
10 import java
.io
.IOException
;
12 import org
.eclipse
.core
.resources
.IProject
;
13 import org
.eclipse
.core
.resources
.IResource
;
14 import org
.eclipse
.jface
.text
.Document
;
15 import org
.eclipse
.team
.core
.RepositoryProvider
;
16 import org
.spearce
.egit
.core
.GitProvider
;
17 import org
.spearce
.egit
.core
.project
.RepositoryMapping
;
18 import org
.spearce
.egit
.ui
.Activator
;
19 import org
.spearce
.jgit
.lib
.Constants
;
20 import org
.spearce
.jgit
.lib
.IndexChangedEvent
;
21 import org
.spearce
.jgit
.lib
.ObjectLoader
;
22 import org
.spearce
.jgit
.lib
.RefsChangedEvent
;
23 import org
.spearce
.jgit
.lib
.Repository
;
24 import org
.spearce
.jgit
.lib
.RepositoryListener
;
25 import org
.spearce
.jgit
.lib
.Tree
;
26 import org
.spearce
.jgit
.lib
.TreeEntry
;
28 class GitDocument
extends Document
implements RepositoryListener
{
29 private final IResource resource
;
31 static GitDocument
create(final IResource resource
) throws IOException
{
32 GitDocument ret
= null;
33 if (RepositoryProvider
.getProvider(resource
.getProject()) instanceof GitProvider
) {
34 ret
= new GitDocument(resource
);
40 private GitDocument(IResource resource
) {
41 this.resource
= resource
;
42 GitQuickDiffProvider
.doc2repo
.put(this, getRepository());
45 void populate() throws IOException
{
47 final IProject project
= resource
.getProject();
48 RepositoryMapping mapping
= RepositoryMapping
.getMapping(project
);
51 final String gitPath
= mapping
.getRepoRelativePath(resource
);
52 final Repository repository
= getRepository();
53 repository
.addRepositoryChangedListener(this);
54 String baseline
= GitQuickDiffProvider
.baseline
.get(repository
);
56 baseline
= Constants
.HEAD
;
57 Tree baselineTree
= repository
.mapTree(baseline
);
58 if (baselineTree
== null) {
59 Activator
.logError("Could not resolve quickdiff baseline "
60 + baseline
+ " corresponding to " + resource
+ " in "
61 + repository
, new Throwable());
64 TreeEntry blobEnry
= baselineTree
.findBlobMember(gitPath
);
65 if (blobEnry
!= null) {
66 Activator
.trace("(GitQuickDiffProvider) compareTo: " + baseline
);
67 ObjectLoader loader
= repository
.openBlob(blobEnry
.getId());
68 byte[] bytes
= loader
.getBytes();
69 String s
= new String(bytes
); // FIXME Platform default charset. should be Eclipse default
71 Activator
.trace("(GitQuickDiffProvider) has reference doc, size=" + s
.length() + " bytes");
73 Activator
.trace("(GitQuickDiffProvider) no revision.");
78 Repository repository
= getRepository();
79 if (repository
!= null)
80 repository
.removeRepositoryChangedListener(this);
83 public void refsChanged(final RefsChangedEvent e
) {
86 } catch (IOException e1
) {
87 Activator
.logError("Failed to refresh quickdiff", e1
);
91 public void indexChanged(final IndexChangedEvent e
) {
92 // Index not relevant at this moment
95 private Repository
getRepository() {
96 IProject project
= resource
.getProject();
97 RepositoryMapping mapping
= RepositoryMapping
.getMapping(project
);
99 return mapping
.getRepository();