Make quick diff aware of changes in the repository.
[egit/zawir.git] / org.spearce.egit.ui / src / org / spearce / egit / ui / internal / decorators / GitDocument.java
blob23e06d931702a89a2c3ca141d70f5075c4fe5c44
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);
40 ret.populate();
42 return ret;
45 private GitDocument(IResource resource) {
46 this.resource = resource;
49 void populate() throws IOException, CoreException {
50 set("");
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(
66 contents));
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);
72 while (n > 0) {
73 caw.write(readBuffer, 0, n);
74 n = in.read(readBuffer);
76 String s = caw.toString();
77 set(s);
78 Activator.trace("(GitQuickDiffProvider) has reference doc, size=" + s.length() + " bytes");
79 } else {
80 Activator.trace("(GitQuickDiffProvider) no revision.");
84 void dispose() {
85 getRepository().removeRepositoryChangedListener(this);
88 public void refsChanged(final RefsChangedEvent e) {
89 try {
90 populate();
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();