Merge "Support CSS themes"
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocCache.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocCache.java
index f84efd7..8c03eb9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocCache.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocCache.java
@@ -17,47 +17,33 @@
 import com.google.common.cache.LoadingCache;
 import com.google.gerrit.httpd.resources.Resource;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.google.inject.name.Named;
 
-import com.googlesource.gerrit.plugins.xdocs.XDocLoader;
 import com.googlesource.gerrit.plugins.xdocs.formatter.Formatters.FormatterProvider;
 
 import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-
-import java.io.IOException;
 
 @Singleton
 public class XDocCache {
   private final LoadingCache<String, Resource> cache;
-  private final GitRepositoryManager repoManager;
+  private final ProjectCache projectCache;
 
   @Inject
   XDocCache(
       @Named(XDocLoader.Module.X_DOC_RESOURCES) LoadingCache<String, Resource> cache,
-      GitRepositoryManager repoManager) {
+      ProjectCache projectCache) {
     this.cache = cache;
-    this.repoManager = repoManager;
+    this.projectCache = projectCache;
   }
 
   public Resource get(FormatterProvider formatter, Project.NameKey project,
       String file, ObjectId revId) {
-    ObjectId metaConfigRevId;
-    try {
-      Repository repo = repoManager.openRepository(project);
-      try {
-        metaConfigRevId = repo.resolve(RefNames.REFS_CONFIG);
-      } finally {
-        repo.close();
-      }
-    } catch (IOException e) {
-      return null;
-    }
-
+    ProjectState p = projectCache.get(project);
+    ObjectId metaConfigRevId = p != null ? p.getConfig().getRevision() : null;
     return cache.getUnchecked((new XDocResourceKey(formatter.getName(),
         project, file, revId, metaConfigRevId)).asString());
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocLoader.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocLoader.java
index e6dd9f7..cf0971c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocLoader.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocLoader.java
@@ -108,18 +108,20 @@
           ObjectId objectId = tw.getObjectId(0);
           ObjectLoader loader = repo.open(objectId);
           byte[] bytes = loader.getBytes(Integer.MAX_VALUE);
-          if (formatter.getName().equals(Formatters.RAW_FORMATTER)
-              && RawText.isBinary(bytes)) {
+          boolean isBinary = RawText.isBinary(bytes);
+          if (formatter.getName().equals(Formatters.RAW_FORMATTER) && isBinary) {
             return Resources.METHOD_NOT_ALLOWED;
           }
           ObjectReader reader = repo.newObjectReader();
           try {
             String abbrRevId = reader.abbreviate(revId).name();
+            String raw = new String(bytes, UTF_8);
+            if (!isBinary) {
+              raw = replaceMacros(repo, key.getProject(), revId, abbrRevId, raw);
+            }
             String html =
                 formatter.get().format(key.getProject().get(),
-                    abbrRevId, formatterCfg,
-                    replaceMacros(repo, key.getProject(), revId,
-                        abbrRevId, bytes));
+                    abbrRevId, formatterCfg, raw);
             return getAsHtmlResource(html, commit.getCommitTime());
           } finally {
             reader.release();
@@ -136,7 +138,7 @@
   }
 
   private String replaceMacros(Repository repo, Project.NameKey project,
-      ObjectId revId, String abbrRevId, byte[] raw) throws GitAPIException,
+      ObjectId revId, String abbrRevId, String raw) throws GitAPIException,
       IOException {
     Map<String, String> macros = Maps.newHashMap();
 
@@ -153,8 +155,7 @@
         (new Git(repo)).describe().setTarget(revId).call(), abbrRevId));
 
 
-    Matcher m = Pattern.compile("(\\\\)?@([A-Z_]+)@")
-        .matcher(new String(raw, UTF_8));
+    Matcher m = Pattern.compile("(\\\\)?@([A-Z_]+)@").matcher(raw);
     StringBuffer sb = new StringBuffer();
     while (m.find()) {
       String key = m.group(2);