@Nullable private static MarkdownFile findFile(RevWalk rw, RevTree root, String path) throws IOException { if (Strings.isNullOrEmpty(path)) { path = INDEX_MD; } ObjectReader reader = rw.getObjectReader(); try (TreeWalk tw = TreeWalk.forPath(reader, path, root)) { if (tw == null) { return null; } if ((tw.getRawMode(0) & TYPE_MASK) == TYPE_TREE) { if (findIndexFile(tw)) { path = tw.getPathString(); } else { return null; } } if ((tw.getRawMode(0) & TYPE_MASK) == TYPE_FILE) { if (!path.endsWith(".md")) { return null; } return new MarkdownFile(path, tw.getObjectId(0)); } return null; } }
private DhtRef doPeel(final Ref leaf) throws MissingObjectException, IOException { RevWalk rw = new RevWalk(getRepository()); try { DhtReader ctx = (DhtReader) rw.getObjectReader(); RevObject obj = rw.parseAny(leaf.getObjectId()); RefData.Builder d = RefData.newBuilder(((DhtRef) leaf).getRefData()); ChunkKey oKey = ctx.findChunk(leaf.getObjectId()); if (oKey != null) d.getTargetBuilder().setChunkKey(oKey.asString()); else d.getTargetBuilder().clearChunkKey(); if (obj instanceof RevTag) { ObjectId pId = rw.peel(obj); d.getPeeledBuilder().setObjectName(pId.name()); ChunkKey pKey = ctx.findChunk(pId); if (pKey != null) d.getPeeledBuilder().setChunkKey(pKey.asString()); else d.getPeeledBuilder().clearChunkKey(); } else { d.clearPeeled(); } d.setIsPeeled(true); d.setSequence(d.getSequence() + 1); return new DhtObjectIdRef(leaf.getName(), d.build()); } finally { rw.release(); } }
@Override protected void doGetHtml(HttpServletRequest req, HttpServletResponse res) throws IOException { MarkdownConfig cfg = MarkdownConfig.get(getAccess(req).getConfig()); if (!cfg.render) { res.setStatus(SC_NOT_FOUND); return; } GitilesView view = ViewFilter.getView(req); Repository repo = ServletUtils.getRepository(req); try (RevWalk rw = new RevWalk(repo)) { ObjectReader reader = rw.getObjectReader(); String path = view.getPathPart(); RevTree root; try { root = rw.parseTree(view.getRevision().getId()); } catch (IncorrectObjectTypeException e) { res.setStatus(SC_NOT_FOUND); return; } MarkdownFile srcmd = findFile(rw, root, path); if (srcmd == null) { res.setStatus(SC_NOT_FOUND); return; } MarkdownFile navmd = findFile(rw, root, NAVBAR_MD); String curEtag = etag(srcmd, navmd); if (etagMatch(req, curEtag)) { res.setStatus(SC_NOT_MODIFIED); return; } view = view.toBuilder().setPathPart(srcmd.path).build(); try { srcmd.read(reader, cfg); if (navmd != null) { navmd.read(reader, cfg); } } catch (LargeObjectException.ExceedsLimit errBig) { fileTooBig(res, view, errBig); return; } catch (IOException err) { readError(res, view, err); return; } MarkdownToHtml.Builder fmt = MarkdownToHtml.builder() .setConfig(cfg) .setGitilesView(view) .setRequestUri(req.getRequestURI()) .setReader(reader) .setRootTree(root); res.setHeader(HttpHeaders.ETAG, curEtag); showDoc(req, res, view, cfg, fmt, navmd, srcmd); } }
private void initRevPool(boolean reverse) { if (queue != null) throw new IllegalStateException(); if (revPool != null) revPool.release(); if (reverse) revPool = new ReverseWalk(getRepository()); else revPool = new RevWalk(getRepository()); revPool.setRetainBody(true); SEEN = revPool.newFlag("SEEN"); // $NON-NLS-1$ reader = revPool.getObjectReader(); treeWalk = new TreeWalk(reader); treeWalk.setRecursive(true); }
/** * Lookup an entry stored in a tree, failing if not present. * * @param tree the tree to search. * @param path the path to find the entry of. * @return the parsed object entry at this path, never null. * @throws Exception */ public RevObject get(final RevTree tree, final String path) throws Exception { final TreeWalk tw = new TreeWalk(pool.getObjectReader()); tw.setFilter(PathFilterGroup.createFromStrings(Collections.singleton(path))); tw.reset(tree); while (tw.next()) { if (tw.isSubtree() && !path.equals(tw.getPathString())) { tw.enterSubtree(); continue; } final ObjectId entid = tw.getObjectId(0); final FileMode entmode = tw.getFileMode(0); return pool.lookupAny(entid, entmode.getObjectType()); } fail("Can't find " + path + " in tree " + tree.name()); return null; // never reached. }