Example usage for org.eclipse.jgit.lib Constants OBJ_BLOB

List of usage examples for org.eclipse.jgit.lib Constants OBJ_BLOB

Introduction

In this page you can find the example usage for org.eclipse.jgit.lib Constants OBJ_BLOB.

Prototype

int OBJ_BLOB

To view the source code for org.eclipse.jgit.lib Constants OBJ_BLOB.

Click Source Link

Document

In-pack object type: blob.

Usage

From source file:com.gitblit.utils.JGitUtils.java

License:Apache License

/**
 * Gets the raw byte content of the specified blob object.
 *
 * @param repository/*from   w ww. j  a  v a 2s. c  om*/
 * @param objectId
 * @return byte [] blob content
 */
public static byte[] getByteContent(Repository repository, String objectId) {
    RevWalk rw = new RevWalk(repository);
    byte[] content = null;
    try {
        RevBlob blob = rw.lookupBlob(ObjectId.fromString(objectId));
        ObjectLoader ldr = repository.open(blob.getId(), Constants.OBJ_BLOB);
        content = ldr.getCachedBytes();
    } catch (Throwable t) {
        error(t, repository, "{0} can't find blob {1}", objectId);
    } finally {
        rw.dispose();
    }
    return content;
}

From source file:com.gitblit.utils.JGitUtils.java

License:Apache License

/**
 * Returns the list of files changed in a specified commit. If the
 * repository does not exist or is empty, an empty list is returned.
 *
 * @param repository//from  w ww .  java 2s. c o  m
 * @param commit
 *            if null, HEAD is assumed.
 * @param calculateDiffStat
 *            if true, each PathChangeModel will have insertions/deletions
 * @return list of files changed in a commit
 */
public static List<PathChangeModel> getFilesInCommit(Repository repository, RevCommit commit,
        boolean calculateDiffStat) {
    List<PathChangeModel> list = new ArrayList<PathChangeModel>();
    if (!hasCommits(repository)) {
        return list;
    }
    RevWalk rw = new RevWalk(repository);
    try {
        if (commit == null) {
            ObjectId object = getDefaultBranch(repository);
            commit = rw.parseCommit(object);
        }

        if (commit.getParentCount() == 0) {
            TreeWalk tw = new TreeWalk(repository);
            tw.reset();
            tw.setRecursive(true);
            tw.addTree(commit.getTree());
            while (tw.next()) {
                long size = 0;
                FilestoreModel filestoreItem = null;
                ObjectId objectId = tw.getObjectId(0);

                try {
                    if (!tw.isSubtree() && (tw.getFileMode(0) != FileMode.GITLINK)) {

                        size = tw.getObjectReader().getObjectSize(objectId, Constants.OBJ_BLOB);

                        if (isPossibleFilestoreItem(size)) {
                            filestoreItem = getFilestoreItem(tw.getObjectReader().open(objectId));
                        }
                    }
                } catch (Throwable t) {
                    error(t, null, "failed to retrieve blob size for " + tw.getPathString());
                }

                list.add(new PathChangeModel(tw.getPathString(), tw.getPathString(), filestoreItem, size,
                        tw.getRawMode(0), objectId.getName(), commit.getId().getName(), ChangeType.ADD));
            }
            tw.close();
        } else {
            RevCommit parent = rw.parseCommit(commit.getParent(0).getId());
            DiffStatFormatter df = new DiffStatFormatter(commit.getName(), repository);
            df.setRepository(repository);
            df.setDiffComparator(RawTextComparator.DEFAULT);
            df.setDetectRenames(true);
            List<DiffEntry> diffs = df.scan(parent.getTree(), commit.getTree());
            for (DiffEntry diff : diffs) {
                // create the path change model
                PathChangeModel pcm = PathChangeModel.from(diff, commit.getName(), repository);

                if (calculateDiffStat) {
                    // update file diffstats
                    df.format(diff);
                    PathChangeModel pathStat = df.getDiffStat().getPath(pcm.path);
                    if (pathStat != null) {
                        pcm.insertions = pathStat.insertions;
                        pcm.deletions = pathStat.deletions;
                    }
                }
                list.add(pcm);
            }
        }
    } catch (Throwable t) {
        error(t, repository, "{0} failed to determine files in commit!");
    } finally {
        rw.dispose();
    }
    return list;
}

From source file:com.gitblit.utils.JGitUtils.java

License:Apache License

/**
 * Returns a path model of the current file in the treewalk.
 *
 * @param tw//from w  w  w.  j  a  v a2  s. c  om
 * @param basePath
 * @param commit
 * @return a path model of the current file in the treewalk
 */
private static PathModel getPathModel(TreeWalk tw, String basePath, RevCommit commit) {
    String name;
    long size = 0;

    if (StringUtils.isEmpty(basePath)) {
        name = tw.getPathString();
    } else {
        name = tw.getPathString().substring(basePath.length() + 1);
    }
    ObjectId objectId = tw.getObjectId(0);
    FilestoreModel filestoreItem = null;

    try {
        if (!tw.isSubtree() && (tw.getFileMode(0) != FileMode.GITLINK)) {

            size = tw.getObjectReader().getObjectSize(objectId, Constants.OBJ_BLOB);

            if (isPossibleFilestoreItem(size)) {
                filestoreItem = getFilestoreItem(tw.getObjectReader().open(objectId));
            }
        }
    } catch (Throwable t) {
        error(t, null, "failed to retrieve blob size for " + tw.getPathString());
    }
    return new PathModel(name, tw.getPathString(), filestoreItem, size, tw.getFileMode(0).getBits(),
            objectId.getName(), commit.getName());
}

From source file:com.gitblit.utils.JGitUtils.java

License:Apache License

/**
 * Returns a path model by path string//from  w  w w . j  av a  2  s  . co  m
 *
 * @param repo
 * @param path
 * @param filter
 * @param commit
 * @return a path model of the specified object
 */
private static PathModel getPathModel(Repository repo, String path, String filter, RevCommit commit)
        throws IOException {

    long size = 0;
    FilestoreModel filestoreItem = null;
    TreeWalk tw = TreeWalk.forPath(repo, path, commit.getTree());
    String pathString = path;

    if (!tw.isSubtree() && (tw.getFileMode(0) != FileMode.GITLINK)) {

        pathString = PathUtils.getLastPathComponent(pathString);

        size = tw.getObjectReader().getObjectSize(tw.getObjectId(0), Constants.OBJ_BLOB);

        if (isPossibleFilestoreItem(size)) {
            filestoreItem = getFilestoreItem(tw.getObjectReader().open(tw.getObjectId(0)));
        }
    } else if (tw.isSubtree()) {

        // do not display dirs that are behind in the path
        if (!Strings.isNullOrEmpty(filter)) {
            pathString = path.replaceFirst(filter + "/", "");
        }

        // remove the last slash from path in displayed link
        if (pathString != null && pathString.charAt(pathString.length() - 1) == '/') {
            pathString = pathString.substring(0, pathString.length() - 1);
        }
    }

    return new PathModel(pathString, tw.getPathString(), filestoreItem, size, tw.getFileMode(0).getBits(),
            tw.getObjectId(0).getName(), commit.getName());

}

From source file:com.gitblit.utils.JGitUtils.java

License:Apache License

/**
 * Create an orphaned branch in a repository.
 *
 * @param repository/* www  .jav a  2 s. c  o m*/
 * @param branchName
 * @param author
 *            if unspecified, Gitblit will be the author of this new branch
 * @return true if successful
 */
public static boolean createOrphanBranch(Repository repository, String branchName, PersonIdent author) {
    boolean success = false;
    String message = "Created branch " + branchName;
    if (author == null) {
        author = new PersonIdent("Gitblit", "gitblit@localhost");
    }
    try {
        ObjectInserter odi = repository.newObjectInserter();
        try {
            // Create a blob object to insert into a tree
            ObjectId blobId = odi.insert(Constants.OBJ_BLOB, message.getBytes(Constants.CHARACTER_ENCODING));

            // Create a tree object to reference from a commit
            TreeFormatter tree = new TreeFormatter();
            tree.append(".branch", FileMode.REGULAR_FILE, blobId);
            ObjectId treeId = odi.insert(tree);

            // Create a commit object
            CommitBuilder commit = new CommitBuilder();
            commit.setAuthor(author);
            commit.setCommitter(author);
            commit.setEncoding(Constants.CHARACTER_ENCODING);
            commit.setMessage(message);
            commit.setTreeId(treeId);

            // Insert the commit into the repository
            ObjectId commitId = odi.insert(commit);
            odi.flush();

            RevWalk revWalk = new RevWalk(repository);
            try {
                RevCommit revCommit = revWalk.parseCommit(commitId);
                if (!branchName.startsWith("refs/")) {
                    branchName = "refs/heads/" + branchName;
                }
                RefUpdate ru = repository.updateRef(branchName);
                ru.setNewObjectId(commitId);
                ru.setRefLogMessage("commit: " + revCommit.getShortMessage(), false);
                Result rc = ru.forceUpdate();
                switch (rc) {
                case NEW:
                case FORCED:
                case FAST_FORWARD:
                    success = true;
                    break;
                default:
                    success = false;
                }
            } finally {
                revWalk.close();
            }
        } finally {
            odi.close();
        }
    } catch (Throwable t) {
        error(t, repository, "Failed to create orphan branch {1} in repository {0}", branchName);
    }
    return success;
}

From source file:com.gitblit.utils.PushLogUtils.java

License:Apache License

/**
 * Creates an in-memory index of the push log entry.
 * /* www . j  a  v a2 s . co  m*/
 * @param repo
 * @param headId
 * @param commands
 * @return an in-memory index
 * @throws IOException
 */
private static DirCache createIndex(Repository repo, ObjectId headId, Collection<ReceiveCommand> commands)
        throws IOException {

    DirCache inCoreIndex = DirCache.newInCore();
    DirCacheBuilder dcBuilder = inCoreIndex.builder();
    ObjectInserter inserter = repo.newObjectInserter();

    long now = System.currentTimeMillis();
    Set<String> ignorePaths = new TreeSet<String>();
    try {
        // add receive commands to the temporary index
        for (ReceiveCommand command : commands) {
            // use the ref names as the path names
            String path = command.getRefName();
            ignorePaths.add(path);

            StringBuilder change = new StringBuilder();
            change.append(command.getType().name()).append(' ');
            switch (command.getType()) {
            case CREATE:
                change.append(ObjectId.zeroId().getName());
                change.append(' ');
                change.append(command.getNewId().getName());
                break;
            case UPDATE:
            case UPDATE_NONFASTFORWARD:
                change.append(command.getOldId().getName());
                change.append(' ');
                change.append(command.getNewId().getName());
                break;
            case DELETE:
                change = null;
                break;
            }
            if (change == null) {
                // ref deleted
                continue;
            }
            String content = change.toString();

            // create an index entry for this attachment
            final DirCacheEntry dcEntry = new DirCacheEntry(path);
            dcEntry.setLength(content.length());
            dcEntry.setLastModified(now);
            dcEntry.setFileMode(FileMode.REGULAR_FILE);

            // insert object
            dcEntry.setObjectId(inserter.insert(Constants.OBJ_BLOB, content.getBytes("UTF-8")));

            // add to temporary in-core index
            dcBuilder.add(dcEntry);
        }

        // Traverse HEAD to add all other paths
        TreeWalk treeWalk = new TreeWalk(repo);
        int hIdx = -1;
        if (headId != null)
            hIdx = treeWalk.addTree(new RevWalk(repo).parseTree(headId));
        treeWalk.setRecursive(true);

        while (treeWalk.next()) {
            String path = treeWalk.getPathString();
            CanonicalTreeParser hTree = null;
            if (hIdx != -1)
                hTree = treeWalk.getTree(hIdx, CanonicalTreeParser.class);
            if (!ignorePaths.contains(path)) {
                // add entries from HEAD for all other paths
                if (hTree != null) {
                    // create a new DirCacheEntry with data retrieved from
                    // HEAD
                    final DirCacheEntry dcEntry = new DirCacheEntry(path);
                    dcEntry.setObjectId(hTree.getEntryObjectId());
                    dcEntry.setFileMode(hTree.getEntryFileMode());

                    // add to temporary in-core index
                    dcBuilder.add(dcEntry);
                }
            }
        }

        // release the treewalk
        treeWalk.release();

        // finish temporary in-core index used for this commit
        dcBuilder.finish();
    } finally {
        inserter.release();
    }
    return inCoreIndex;
}

From source file:com.gitblit.wicket.pages.TagPage.java

License:Apache License

public TagPage(PageParameters params) {
    super(params);

    Repository r = getRepository();//  ww  w. ja  v a 2  s  . com

    // Find tag in repository
    List<RefModel> tags = JGitUtils.getTags(r, true, -1);
    RefModel tagRef = null;
    for (RefModel tag : tags) {
        if (tag.getName().equals(objectId) || tag.getObjectId().getName().equals(objectId)) {
            tagRef = tag;
            break;
        }
    }

    // Failed to find tag!
    if (tagRef == null) {
        error(MessageFormat.format(getString("gb.couldNotFindTag"), objectId), true);
    }

    // Display tag.
    Class<? extends WebPage> linkClass;
    PageParameters linkParameters = newCommitParameter(tagRef.getReferencedObjectId().getName());
    String typeKey;
    switch (tagRef.getReferencedObjectType()) {
    case Constants.OBJ_BLOB:
        typeKey = "gb.blob";
        linkClass = BlobPage.class;
        break;
    case Constants.OBJ_TREE:
        typeKey = "gb.tree";
        linkClass = TreePage.class;
        break;
    case Constants.OBJ_COMMIT:
    default:
        typeKey = "gb.commit";
        linkClass = CommitPage.class;
        break;
    }
    add(new AvatarImage("taggerAvatar", tagRef.getAuthorIdent()));

    add(new RefsPanel("tagName", repositoryName, Arrays.asList(tagRef)));
    add(new Label("tagId", tagRef.getObjectId().getName()));
    add(new LinkPanel("taggedObject", "list", tagRef.getReferencedObjectId().getName(), linkClass,
            linkParameters));
    add(new Label("taggedObjectType", getString(typeKey)));

    add(createPersonPanel("tagger", tagRef.getAuthorIdent(), com.gitblit.Constants.SearchType.AUTHOR));
    Date when = new Date(0);
    if (tagRef.getAuthorIdent() != null) {
        when = tagRef.getAuthorIdent().getWhen();
    }
    add(WicketUtils.createTimestampLabel("tagDate", when, getTimeZone(), getTimeUtils()));

    addFullText("fullMessage", tagRef.getFullMessage());
}

From source file:com.gitblit.wicket.panels.TagsPanel.java

License:Apache License

public TagsPanel(String wicketId, final String repositoryName, Repository r, final int maxCount) {
    super(wicketId);

    // header/* w  w  w. ja  va  2 s .c  om*/
    List<RefModel> tags = JGitUtils.getTags(r, false, maxCount);
    if (maxCount > 0) {
        // summary page
        // show tags page link
        add(new LinkPanel("header", "title", new StringResourceModel("gb.tags", this, null), TagsPage.class,
                WicketUtils.newRepositoryParameter(repositoryName)));
    } else {
        // tags page
        add(new Label("header", new StringResourceModel("gb.tags", this, null)));
    }

    ListDataProvider<RefModel> tagsDp = new ListDataProvider<RefModel>(tags);
    DataView<RefModel> tagView = new DataView<RefModel>("tag", tagsDp) {
        private static final long serialVersionUID = 1L;
        int counter;

        @Override
        public void populateItem(final Item<RefModel> item) {
            RefModel entry = item.getModelObject();

            item.add(WicketUtils.createDateLabel("tagDate", entry.getDate(), getTimeZone(), getTimeUtils()));

            Class<? extends WebPage> linkClass;
            switch (entry.getReferencedObjectType()) {
            case Constants.OBJ_BLOB:
                linkClass = BlobPage.class;
                break;
            case Constants.OBJ_TREE:
                linkClass = TreePage.class;
                break;
            case Constants.OBJ_COMMIT:
            default:
                linkClass = CommitPage.class;
                break;
            }
            item.add(new LinkPanel("tagName", "list name", entry.displayName, linkClass,
                    WicketUtils.newObjectParameter(repositoryName, entry.getReferencedObjectId().getName())));

            // workaround for RevTag returning a lengthy shortlog. :(
            String message = StringUtils.trimString(entry.getShortMessage(),
                    com.gitblit.Constants.LEN_SHORTLOG);

            if (linkClass.equals(BlobPage.class)) {
                // Blob Tag Object
                item.add(WicketUtils.newImage("tagIcon", "file_16x16.png"));
                LinkPanel messageLink = new LinkPanel("tagDescription", "list", message, TagPage.class,
                        WicketUtils.newObjectParameter(repositoryName, entry.getObjectId().getName()));
                if (!entry.getShortMessage().equals(message)) {
                    messageLink.setTooltip(entry.getShortMessage());
                }
                item.add(messageLink);

                Fragment fragment = new Fragment("tagLinks", "blobLinks", TagsPanel.this);
                fragment.add(new BookmarkablePageLink<Void>("tag", TagPage.class,
                        WicketUtils.newObjectParameter(repositoryName, entry.getObjectId().getName()))
                                .setEnabled(entry.isAnnotatedTag()));

                fragment.add(new BookmarkablePageLink<Void>("blob", linkClass, WicketUtils
                        .newObjectParameter(repositoryName, entry.getReferencedObjectId().getName())));

                String contextUrl = GitBlitRequestUtils.getRelativePathPrefixToContextRoot();
                String rawUrl = RawServlet.asLink(contextUrl, repositoryName, entry.displayName,
                        entry.getReferencedObjectId().getName());
                fragment.add(new ExternalLink("raw", rawUrl));
                item.add(fragment);
            } else {
                // TODO Tree Tag Object
                // Standard Tag Object
                if (entry.isAnnotatedTag()) {
                    item.add(WicketUtils.newImage("tagIcon", "tag_16x16.png"));
                    LinkPanel messageLink = new LinkPanel("tagDescription", "list", message, TagPage.class,
                            WicketUtils.newObjectParameter(repositoryName, entry.getObjectId().getName()));
                    if (!message.equals(entry.getShortMessage())) {
                        messageLink.setTooltip(entry.getShortMessage());
                    }
                    item.add(messageLink);

                    Fragment fragment = new Fragment("tagLinks", "annotatedLinks", TagsPanel.this);
                    fragment.add(new BookmarkablePageLink<Void>("tag", TagPage.class,
                            WicketUtils.newObjectParameter(repositoryName, entry.getObjectId().getName()))
                                    .setEnabled(entry.isAnnotatedTag()));

                    fragment.add(new BookmarkablePageLink<Void>("commit", linkClass, WicketUtils
                            .newObjectParameter(repositoryName, entry.getReferencedObjectId().getName())));

                    fragment.add(new BookmarkablePageLink<Void>("log", LogPage.class,
                            WicketUtils.newObjectParameter(repositoryName, entry.getName())));
                    item.add(fragment);
                } else {
                    item.add(WicketUtils.newBlankImage("tagIcon"));
                    item.add(new LinkPanel("tagDescription", "list", message, CommitPage.class,
                            WicketUtils.newObjectParameter(repositoryName, entry.getObjectId().getName())));
                    Fragment fragment = new Fragment("tagLinks", "lightweightLinks", TagsPanel.this);
                    fragment.add(new BookmarkablePageLink<Void>("commit", CommitPage.class, WicketUtils
                            .newObjectParameter(repositoryName, entry.getReferencedObjectId().getName())));
                    fragment.add(new BookmarkablePageLink<Void>("log", LogPage.class,
                            WicketUtils.newObjectParameter(repositoryName, entry.getName())));
                    item.add(fragment);
                }
            }

            WicketUtils.setAlternatingBackground(item, counter);
            counter++;
        }
    };
    add(tagView);
    if (tags.size() < maxCount || maxCount <= 0) {
        add(new Label("allTags", "").setVisible(false));
    } else {
        add(new LinkPanel("allTags", "link", new StringResourceModel("gb.allTags", this, null), TagsPage.class,
                WicketUtils.newRepositoryParameter(repositoryName)));
    }

    hasTags = tags.size() > 0;
}

From source file:com.google.appraise.eclipse.core.client.git.GitNoteWriter.java

License:Open Source License

private ObjectId createNoteContent(T noteRecord) throws RuntimeException {
    try {//from w w w .ja  va 2  s .  c om
        return inserter.insert(Constants.OBJ_BLOB, (new Gson().toJson(noteRecord) + '\n').getBytes("UTF-8"));
    } catch (Exception e) {
        logger.log(Level.SEVERE, "Failed create note content for commit " + this.reviewCommit.getId(), e);
        throw new RuntimeException(e);
    }
}

From source file:com.google.gerrit.httpd.raw.CatServlet.java

License:Apache License

@Override
protected void doGet(final HttpServletRequest req, final HttpServletResponse rsp) throws IOException {
    String keyStr = req.getPathInfo();

    // We shouldn't have to do this extra decode pass, but somehow we
    // are now receiving our "^1" suffix as "%5E1", which confuses us
    // downstream. Other times we get our embedded "," as "%2C", which
    // is equally bad. And yet when these happen a "%2F" is left as-is,
    // rather than escaped as "%252F", which makes me feel really really
    // uncomfortable with a blind decode right here.
    ///*ww w  .  ja va2 s.c  o m*/
    keyStr = Url.decode(keyStr);

    if (!keyStr.startsWith("/")) {
        rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
        return;
    }
    keyStr = keyStr.substring(1);

    final Patch.Key patchKey;
    final int side;
    {
        final int c = keyStr.lastIndexOf('^');
        if (c == 0) {
            rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        if (c < 0) {
            side = 0;

        } else {
            try {
                side = Integer.parseInt(keyStr.substring(c + 1));
                keyStr = keyStr.substring(0, c);
            } catch (NumberFormatException e) {
                rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
                return;
            }
        }

        try {
            patchKey = Patch.Key.parse(keyStr);
        } catch (NumberFormatException e) {
            rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
    }

    final Change.Id changeId = patchKey.getParentKey().getParentKey();
    final Project project;
    final String revision;
    try {
        final ReviewDb db = requestDb.get();
        final ChangeControl control = changeControl.validateFor(changeId, userProvider.get());

        project = control.getProject();

        if (patchKey.getParentKey().get() == 0) {
            // change edit
            try {
                Optional<ChangeEdit> edit = changeEditUtil.byChange(control.getChange());
                if (edit.isPresent()) {
                    revision = edit.get().getRevision().get();
                } else {
                    rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
                    return;
                }
            } catch (AuthException e) {
                rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
                return;
            }
        } else {
            PatchSet patchSet = db.patchSets().get(patchKey.getParentKey());
            if (patchSet == null) {
                rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
                return;
            }
            revision = patchSet.getRevision().get();
        }
    } catch (NoSuchChangeException e) {
        rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
        return;
    } catch (OrmException e) {
        getServletContext().log("Cannot query database", e);
        rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        return;
    }

    ObjectLoader blobLoader;
    RevCommit fromCommit;
    String suffix;
    String path = patchKey.getFileName();
    try (Repository repo = repoManager.openRepository(project.getNameKey())) {
        try (ObjectReader reader = repo.newObjectReader(); RevWalk rw = new RevWalk(reader)) {
            RevCommit c;

            c = rw.parseCommit(ObjectId.fromString(revision));
            if (side == 0) {
                fromCommit = c;
                suffix = "new";

            } else if (1 <= side && side - 1 < c.getParentCount()) {
                fromCommit = rw.parseCommit(c.getParent(side - 1));
                if (c.getParentCount() == 1) {
                    suffix = "old";
                } else {
                    suffix = "old" + side;
                }

            } else {
                rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
                return;
            }

            try (TreeWalk tw = TreeWalk.forPath(reader, path, fromCommit.getTree())) {
                if (tw == null) {
                    rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
                    return;
                }

                if (tw.getFileMode(0).getObjectType() == Constants.OBJ_BLOB) {
                    blobLoader = reader.open(tw.getObjectId(0), Constants.OBJ_BLOB);

                } else {
                    rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                    return;
                }
            }
        }
    } catch (RepositoryNotFoundException e) {
        getServletContext().log("Cannot open repository", e);
        rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        return;
    } catch (IOException | RuntimeException e) {
        getServletContext().log("Cannot read repository", e);
        rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        return;
    }

    final byte[] raw = blobLoader.isLarge() ? null : blobLoader.getCachedBytes();
    final long when = fromCommit.getCommitTime() * 1000L;

    rsp.setDateHeader("Last-Modified", when);
    CacheHeaders.setNotCacheable(rsp);

    try (OutputStream out = openOutputStream(req, rsp, blobLoader, fromCommit, when, path, suffix, raw)) {
        if (raw != null) {
            out.write(raw);
        } else {
            blobLoader.copyTo(out);
        }
    }
}