Use Constant.HEAD for "HEAD" references
[egit/imyousuf.git] / org.spearce.egit.ui / src / org / spearce / egit / ui / internal / decorators / GitDocument.java
bloba985a6811f2b316b83ea6326e003a1a8c577c1c3
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);
35 ret.populate();
37 return ret;
40 private GitDocument(IResource resource) {
41 this.resource = resource;
42 GitQuickDiffProvider.doc2repo.put(this, getRepository());
45 void populate() throws IOException {
46 set("");
47 final IProject project = resource.getProject();
48 RepositoryMapping mapping = RepositoryMapping.getMapping(project);
49 if (mapping == null)
50 return;
51 final String gitPath = mapping.getRepoRelativePath(resource);
52 final Repository repository = getRepository();
53 repository.addRepositoryChangedListener(this);
54 String baseline = GitQuickDiffProvider.baseline.get(repository);
55 if (baseline == null)
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());
62 return;
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
70 set(s);
71 Activator.trace("(GitQuickDiffProvider) has reference doc, size=" + s.length() + " bytes");
72 } else {
73 Activator.trace("(GitQuickDiffProvider) no revision.");
77 void dispose() {
78 Repository repository = getRepository();
79 if (repository != null)
80 repository.removeRepositoryChangedListener(this);
83 public void refsChanged(final RefsChangedEvent e) {
84 try {
85 populate();
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);
98 if (mapping != null)
99 return mapping.getRepository();
100 return null;