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
.BufferedReader
;
11 import java
.io
.CharArrayWriter
;
12 import java
.io
.IOException
;
13 import java
.io
.InputStream
;
14 import java
.io
.InputStreamReader
;
16 import org
.eclipse
.core
.resources
.IProject
;
17 import org
.eclipse
.core
.resources
.IResource
;
18 import org
.eclipse
.core
.resources
.IStorage
;
19 import org
.eclipse
.core
.runtime
.CoreException
;
20 import org
.eclipse
.jface
.text
.Document
;
21 import org
.eclipse
.team
.core
.RepositoryProvider
;
22 import org
.eclipse
.team
.core
.history
.IFileHistory
;
23 import org
.eclipse
.team
.core
.history
.IFileHistoryProvider
;
24 import org
.eclipse
.team
.core
.history
.IFileRevision
;
25 import org
.spearce
.egit
.core
.GitProvider
;
26 import org
.spearce
.egit
.core
.project
.RepositoryMapping
;
27 import org
.spearce
.egit
.ui
.Activator
;
28 import org
.spearce
.jgit
.lib
.IndexChangedEvent
;
29 import org
.spearce
.jgit
.lib
.RefsChangedEvent
;
30 import org
.spearce
.jgit
.lib
.Repository
;
31 import org
.spearce
.jgit
.lib
.RepositoryListener
;
33 class GitDocument
extends Document
implements RepositoryListener
{
34 private final IResource resource
;
36 static GitDocument
create(IResource resource
) throws IOException
, CoreException
{
37 GitDocument ret
= null;
38 if (RepositoryProvider
.getProvider(resource
.getProject()) instanceof GitProvider
) {
39 ret
= new GitDocument(resource
);
45 private GitDocument(IResource resource
) {
46 this.resource
= resource
;
49 void populate() throws IOException
, CoreException
{
51 IProject project
= resource
.getProject();
52 RepositoryProvider provider
= RepositoryProvider
.getProvider(project
);
53 getRepository().addRepositoryChangedListener(this);
54 IFileHistoryProvider fileHistoryProvider
= provider
55 .getFileHistoryProvider();
56 IFileHistory fileHistoryFor
= fileHistoryProvider
.getFileHistoryFor(
57 resource
, IFileHistoryProvider
.SINGLE_REVISION
, null);
58 IFileRevision
[] revisions
= fileHistoryFor
.getFileRevisions();
59 if (revisions
!= null && revisions
.length
> 0) {
60 IFileRevision revision
= revisions
[0];
61 Activator
.trace("(GitQuickDiffProvider) compareTo: "
62 + revision
.getContentIdentifier());
63 IStorage storage
= revision
.getStorage(null);
64 InputStream contents
= storage
.getContents();
65 BufferedReader in
= new BufferedReader(new InputStreamReader(
67 final int DEFAULT_FILE_SIZE
= 15 * 1024;
69 CharArrayWriter caw
= new CharArrayWriter(DEFAULT_FILE_SIZE
);
70 char[] readBuffer
= new char[2048];
71 int n
= in
.read(readBuffer
);
73 caw
.write(readBuffer
, 0, n
);
74 n
= in
.read(readBuffer
);
76 String s
= caw
.toString();
78 Activator
.trace("(GitQuickDiffProvider) has reference doc, size=" + s
.length() + " bytes");
80 Activator
.trace("(GitQuickDiffProvider) no revision.");
85 getRepository().removeRepositoryChangedListener(this);
88 public void refsChanged(final RefsChangedEvent e
) {
91 } catch (IOException e1
) {
92 Activator
.logError("Failed to refresh quickdiff", e1
);
93 } catch (CoreException e1
) {
94 Activator
.logError("Failed to refresh quickdiff", e1
);
98 public void indexChanged(final IndexChangedEvent e
) {
99 // Index not relevant at this moment
102 private Repository
getRepository() {
103 IProject project
= resource
.getProject();
104 RepositoryMapping mapping
= RepositoryMapping
.getMapping(project
);
105 return mapping
.getRepository();