Catch and log errors parsing README.md

Don't display a README.md that crashes the CommonMark parser,
log the failure and continue displaying the page. Users who
click on README.md may still get a 500 error.

Change-Id: Id1c1cc73a1732b0d9684f5261a4d103d59e17f03
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/ReadmeHelper.java b/gitiles-servlet/src/main/java/com/google/gitiles/ReadmeHelper.java
index eee4d83..9a05f35 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/ReadmeHelper.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/ReadmeHelper.java
@@ -22,7 +22,6 @@
 import org.commonmark.node.Node;
 import org.eclipse.jgit.errors.CorruptObjectException;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.LargeObjectException;
 import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.Constants;
@@ -104,8 +103,15 @@
       }
 
       return new MarkdownToHtml(view, cfg, readmePath).setImageLoader(img).toSoyHtml(root);
-    } catch (LargeObjectException | IOException e) {
-      log.error(String.format("error rendering %s/%s", view.getRepositoryName(), readmePath), e);
+    } catch (RuntimeException | IOException err) {
+      log.error(
+          String.format(
+              "error rendering %s/%s %s:%s",
+              view.getHostName(),
+              view.getRepositoryName(),
+              view.getRevision(),
+              readmePath),
+          err);
       return null;
     }
   }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
index c45e0e6..f4d9327 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
@@ -24,6 +24,7 @@
 import com.google.common.collect.Maps;
 import com.google.gitiles.DateFormatter.Format;
 import com.google.gson.reflect.TypeToken;
+import com.google.template.soy.data.SanitizedContent;
 
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.http.server.ServletUtils;
@@ -171,7 +172,10 @@
             rootTree);
     readme.scanTree(rootTree);
     if (readme.isPresent()) {
-      return ImmutableMap.<String, Object>of("readmeHtml", readme.render());
+      SanitizedContent html = readme.render();
+      if (html != null) {
+        return ImmutableMap.<String, Object>of("readmeHtml", html);
+      }
     }
     return null;
   }