From 9babeecea6fe32d2738d58a7311b49ee13bd027b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 16 Aug 2018 10:24:47 +0200 Subject: [PATCH] Create and handle RevisionNotFoundException --- .../java/sonia/scm/repository/spi/GitCatCommand.java | 9 ++++++++- .../sonia/scm/repository/spi/GitCatCommandTest.java | 10 ++++++++++ .../sonia/scm/repository/spi/HgCatCommandTest.java | 9 +++++++++ .../sonia/scm/api/v2/resources/ContentResource.java | 10 +++++++++- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitCatCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitCatCommand.java index 0748a42803..c451dd8614 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitCatCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitCatCommand.java @@ -32,6 +32,7 @@ package sonia.scm.repository.spi; +import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectLoader; @@ -46,6 +47,7 @@ import org.slf4j.LoggerFactory; import sonia.scm.repository.GitUtil; import sonia.scm.repository.PathNotFoundException; import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.util.Util; import java.io.Closeable; @@ -97,7 +99,12 @@ public class GitCatCommand extends AbstractGitCommand implements CatCommand { RevWalk revWalk = new RevWalk(repo); - RevCommit entry = revWalk.parseCommit(revId); + RevCommit entry = null; + try { + entry = revWalk.parseCommit(revId); + } catch (MissingObjectException e) { + throw new RevisionNotFoundException(revId.getName()); + } RevTree revTree = entry.getTree(); if (revTree != null) { diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitCatCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitCatCommandTest.java index 875d47c15b..c23db0873b 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitCatCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitCatCommandTest.java @@ -36,6 +36,7 @@ import org.junit.Test; import sonia.scm.repository.GitConstants; import sonia.scm.repository.PathNotFoundException; import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.RevisionNotFoundException; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -90,6 +91,15 @@ public class GitCatCommandTest extends AbstractGitCommandTestBase { execute(request); } + @Test(expected = RevisionNotFoundException.class) + public void testUnknownRevision() throws IOException, RepositoryException { + CatCommandRequest request = new CatCommandRequest(); + + request.setRevision("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); + request.setPath("a.txt"); + execute(request); + } + @Test public void testSimpleStream() throws IOException, RepositoryException { CatCommandRequest request = new CatCommandRequest(); diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgCatCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgCatCommandTest.java index c297182b82..00dd747bdf 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgCatCommandTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgCatCommandTest.java @@ -71,6 +71,15 @@ public class HgCatCommandTest extends AbstractHgCommandTestBase { execute(request); } + @Test(expected = RepositoryException.class) + public void testUnknownRevision() throws IOException, RepositoryException { + CatCommandRequest request = new CatCommandRequest(); + + request.setRevision("abc"); + request.setPath("a.txt"); + execute(request); + } + @Test public void testSimpleStream() throws IOException, RepositoryException { CatCommandRequest request = new CatCommandRequest(); diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ContentResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ContentResource.java index 62486df287..ae209b4238 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ContentResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ContentResource.java @@ -10,12 +10,17 @@ import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.PathNotFoundException; import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryNotFoundException; +import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; import sonia.scm.util.IOUtil; import javax.inject.Inject; -import javax.ws.rs.*; +import javax.ws.rs.GET; +import javax.ws.rs.HEAD; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.StreamingOutput; @@ -116,6 +121,9 @@ public class ContentResource { } catch (PathNotFoundException e) { LOG.debug("path '{}' not found in repository {}/{}", path, namespace, name, e); return Response.status(Status.NOT_FOUND).build(); + } catch (RevisionNotFoundException e) { + LOG.debug("revision '{}' not found in repository {}/{}", revision, namespace, name, e); + return Response.status(Status.NOT_FOUND).build(); } catch (IOException e) { LOG.info("error reading repository resource {} from {}/{}", path, namespace, name, e); return Response.status(Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();