mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-07 22:15:45 +01:00
Iterate into correct subdirectory for git browse command
This commit is contained in:
@@ -38,6 +38,7 @@ package sonia.scm.repository.api;
|
|||||||
import com.google.common.base.Objects;
|
import com.google.common.base.Objects;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import sonia.scm.NotFoundException;
|
||||||
import sonia.scm.cache.Cache;
|
import sonia.scm.cache.Cache;
|
||||||
import sonia.scm.cache.CacheManager;
|
import sonia.scm.cache.CacheManager;
|
||||||
import sonia.scm.repository.BrowserResult;
|
import sonia.scm.repository.BrowserResult;
|
||||||
@@ -135,7 +136,7 @@ public final class BrowseCommandBuilder
|
|||||||
*
|
*
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public BrowserResult getBrowserResult() throws IOException, RevisionNotFoundException {
|
public BrowserResult getBrowserResult() throws IOException, NotFoundException {
|
||||||
BrowserResult result = null;
|
BrowserResult result = null;
|
||||||
|
|
||||||
if (disableCache)
|
if (disableCache)
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ package sonia.scm.repository.spi;
|
|||||||
|
|
||||||
//~--- non-JDK imports --------------------------------------------------------
|
//~--- non-JDK imports --------------------------------------------------------
|
||||||
|
|
||||||
|
import sonia.scm.NotFoundException;
|
||||||
import sonia.scm.repository.BrowserResult;
|
import sonia.scm.repository.BrowserResult;
|
||||||
import sonia.scm.repository.RevisionNotFoundException;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@@ -60,4 +60,4 @@ public interface BrowseCommand
|
|||||||
*
|
*
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
BrowserResult getBrowserResult(BrowseCommandRequest request) throws IOException, RevisionNotFoundException;}
|
BrowserResult getBrowserResult(BrowseCommandRequest request) throws IOException, NotFoundException;}
|
||||||
|
|||||||
@@ -35,9 +35,7 @@ package sonia.scm.repository.spi;
|
|||||||
|
|
||||||
//~--- non-JDK imports --------------------------------------------------------
|
//~--- non-JDK imports --------------------------------------------------------
|
||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
import com.google.common.collect.Iterables;
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import org.eclipse.jgit.errors.MissingObjectException;
|
import org.eclipse.jgit.errors.MissingObjectException;
|
||||||
@@ -53,6 +51,7 @@ import org.eclipse.jgit.treewalk.filter.PathFilter;
|
|||||||
import org.eclipse.jgit.treewalk.filter.TreeFilter;
|
import org.eclipse.jgit.treewalk.filter.TreeFilter;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import sonia.scm.NotFoundException;
|
||||||
import sonia.scm.repository.BrowserResult;
|
import sonia.scm.repository.BrowserResult;
|
||||||
import sonia.scm.repository.FileObject;
|
import sonia.scm.repository.FileObject;
|
||||||
import sonia.scm.repository.GitSubModuleParser;
|
import sonia.scm.repository.GitSubModuleParser;
|
||||||
@@ -64,7 +63,6 @@ import sonia.scm.repository.SubRepository;
|
|||||||
import sonia.scm.util.Util;
|
import sonia.scm.util.Util;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -107,7 +105,7 @@ public class GitBrowseCommand extends AbstractGitCommand
|
|||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public BrowserResult getBrowserResult(BrowseCommandRequest request)
|
public BrowserResult getBrowserResult(BrowseCommandRequest request)
|
||||||
throws IOException, RevisionNotFoundException {
|
throws IOException, NotFoundException {
|
||||||
logger.debug("try to create browse result for {}", request);
|
logger.debug("try to create browse result for {}", request);
|
||||||
|
|
||||||
BrowserResult result;
|
BrowserResult result;
|
||||||
@@ -276,7 +274,7 @@ public class GitBrowseCommand extends AbstractGitCommand
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private FileObject getEntry(org.eclipse.jgit.lib.Repository repo, BrowseCommandRequest request, ObjectId revId) throws IOException, RevisionNotFoundException {
|
private FileObject getEntry(org.eclipse.jgit.lib.Repository repo, BrowseCommandRequest request, ObjectId revId) throws IOException, NotFoundException {
|
||||||
RevWalk revWalk = null;
|
RevWalk revWalk = null;
|
||||||
TreeWalk treeWalk = null;
|
TreeWalk treeWalk = null;
|
||||||
|
|
||||||
@@ -328,7 +326,7 @@ public class GitBrowseCommand extends AbstractGitCommand
|
|||||||
return Strings.isNullOrEmpty(request.getPath()) || "/".equals(request.getPath());
|
return Strings.isNullOrEmpty(request.getPath()) || "/".equals(request.getPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
private FileObject findChildren(FileObject parent, org.eclipse.jgit.lib.Repository repo, BrowseCommandRequest request, ObjectId revId, TreeWalk treeWalk) throws IOException, RevisionNotFoundException {
|
private FileObject findChildren(FileObject parent, org.eclipse.jgit.lib.Repository repo, BrowseCommandRequest request, ObjectId revId, TreeWalk treeWalk) throws IOException, NotFoundException {
|
||||||
List<FileObject> files = Lists.newArrayList();
|
List<FileObject> files = Lists.newArrayList();
|
||||||
while (treeWalk.next())
|
while (treeWalk.next())
|
||||||
{
|
{
|
||||||
@@ -360,11 +358,26 @@ public class GitBrowseCommand extends AbstractGitCommand
|
|||||||
}
|
}
|
||||||
|
|
||||||
private FileObject first(org.eclipse.jgit.lib.Repository repo,
|
private FileObject first(org.eclipse.jgit.lib.Repository repo,
|
||||||
BrowseCommandRequest request, ObjectId revId, TreeWalk treeWalk) throws IOException, RevisionNotFoundException {
|
BrowseCommandRequest request, ObjectId revId, TreeWalk treeWalk) throws IOException, NotFoundException {
|
||||||
if (!treeWalk.next()) {
|
String[] parts = request.getPath().split("/");
|
||||||
throw new IOException("tree seams to be empty");
|
int current = 0;
|
||||||
}
|
int limit = parts.length;
|
||||||
|
|
||||||
|
while (treeWalk.next()) {
|
||||||
|
String name = treeWalk.getNameString();
|
||||||
|
|
||||||
|
if (name.equalsIgnoreCase(parts[current])) {
|
||||||
|
current++;
|
||||||
|
|
||||||
|
if (current >= limit) {
|
||||||
return createFileObject(repo, request, revId, treeWalk);
|
return createFileObject(repo, request, revId, treeWalk);
|
||||||
|
} else {
|
||||||
|
treeWalk.enterSubtree();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new NotFoundException("file", request.getPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
|||||||
@@ -36,10 +36,10 @@ package sonia.scm.repository.spi;
|
|||||||
//~--- non-JDK imports --------------------------------------------------------
|
//~--- non-JDK imports --------------------------------------------------------
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import sonia.scm.NotFoundException;
|
||||||
import sonia.scm.repository.BrowserResult;
|
import sonia.scm.repository.BrowserResult;
|
||||||
import sonia.scm.repository.FileObject;
|
import sonia.scm.repository.FileObject;
|
||||||
import sonia.scm.repository.GitConstants;
|
import sonia.scm.repository.GitConstants;
|
||||||
import sonia.scm.repository.RevisionNotFoundException;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -60,7 +60,7 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase
|
|||||||
{
|
{
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetFile() throws IOException, RevisionNotFoundException {
|
public void testGetFile() throws IOException, NotFoundException {
|
||||||
BrowseCommandRequest request = new BrowseCommandRequest();
|
BrowseCommandRequest request = new BrowseCommandRequest();
|
||||||
request.setPath("a.txt");
|
request.setPath("a.txt");
|
||||||
BrowserResult result = createCommand().getBrowserResult(request);
|
BrowserResult result = createCommand().getBrowserResult(request);
|
||||||
@@ -72,7 +72,7 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase
|
|||||||
* Test browse command with default branch.
|
* Test browse command with default branch.
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testDefaultBranch() throws IOException, RevisionNotFoundException {
|
public void testDefaultBranch() throws IOException, NotFoundException {
|
||||||
// without default branch, the repository head should be used
|
// without default branch, the repository head should be used
|
||||||
FileObject root = createCommand().getBrowserResult(new BrowseCommandRequest()).getFile();
|
FileObject root = createCommand().getBrowserResult(new BrowseCommandRequest()).getFile();
|
||||||
assertNotNull(root);
|
assertNotNull(root);
|
||||||
@@ -104,7 +104,7 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBrowse() throws IOException, RevisionNotFoundException {
|
public void testBrowse() throws IOException, NotFoundException {
|
||||||
FileObject root = createCommand().getBrowserResult(new BrowseCommandRequest()).getFile();
|
FileObject root = createCommand().getBrowserResult(new BrowseCommandRequest()).getFile();
|
||||||
assertNotNull(root);
|
assertNotNull(root);
|
||||||
|
|
||||||
@@ -143,7 +143,7 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBrowseSubDirectory() throws IOException, RevisionNotFoundException {
|
public void testBrowseSubDirectory() throws IOException, NotFoundException {
|
||||||
BrowseCommandRequest request = new BrowseCommandRequest();
|
BrowseCommandRequest request = new BrowseCommandRequest();
|
||||||
|
|
||||||
request.setPath("c");
|
request.setPath("c");
|
||||||
@@ -190,7 +190,7 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRecursive() throws IOException, RevisionNotFoundException {
|
public void testRecursive() throws IOException, NotFoundException {
|
||||||
BrowseCommandRequest request = new BrowseCommandRequest();
|
BrowseCommandRequest request = new BrowseCommandRequest();
|
||||||
|
|
||||||
request.setRecursive(true);
|
request.setRecursive(true);
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ package sonia.scm.api.v2.resources;
|
|||||||
import sonia.scm.NotFoundException;
|
import sonia.scm.NotFoundException;
|
||||||
import sonia.scm.repository.BrowserResult;
|
import sonia.scm.repository.BrowserResult;
|
||||||
import sonia.scm.repository.NamespaceAndName;
|
import sonia.scm.repository.NamespaceAndName;
|
||||||
import sonia.scm.repository.RepositoryNotFoundException;
|
|
||||||
import sonia.scm.repository.RevisionNotFoundException;
|
|
||||||
import sonia.scm.repository.api.BrowseCommandBuilder;
|
import sonia.scm.repository.api.BrowseCommandBuilder;
|
||||||
import sonia.scm.repository.api.RepositoryService;
|
import sonia.scm.repository.api.RepositoryService;
|
||||||
import sonia.scm.repository.api.RepositoryServiceFactory;
|
import sonia.scm.repository.api.RepositoryServiceFactory;
|
||||||
@@ -33,14 +31,14 @@ public class SourceRootResource {
|
|||||||
@GET
|
@GET
|
||||||
@Produces(VndMediaType.SOURCE)
|
@Produces(VndMediaType.SOURCE)
|
||||||
@Path("")
|
@Path("")
|
||||||
public Response getAllWithoutRevision(@PathParam("namespace") String namespace, @PathParam("name") String name) throws RevisionNotFoundException, RepositoryNotFoundException, IOException {
|
public Response getAllWithoutRevision(@PathParam("namespace") String namespace, @PathParam("name") String name) throws NotFoundException, IOException {
|
||||||
return getSource(namespace, name, "/", null);
|
return getSource(namespace, name, "/", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Produces(VndMediaType.SOURCE)
|
@Produces(VndMediaType.SOURCE)
|
||||||
@Path("{revision}")
|
@Path("{revision}")
|
||||||
public Response getAll(@PathParam("namespace") String namespace, @PathParam("name") String name, @PathParam("revision") String revision) throws RevisionNotFoundException, RepositoryNotFoundException, IOException {
|
public Response getAll(@PathParam("namespace") String namespace, @PathParam("name") String name, @PathParam("revision") String revision) throws NotFoundException, IOException {
|
||||||
return getSource(namespace, name, "/", revision);
|
return getSource(namespace, name, "/", revision);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,7 +49,7 @@ public class SourceRootResource {
|
|||||||
return getSource(namespace, name, path, revision);
|
return getSource(namespace, name, path, revision);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Response getSource(String namespace, String repoName, String path, String revision) throws IOException, RevisionNotFoundException, RepositoryNotFoundException {
|
private Response getSource(String namespace, String repoName, String path, String revision) throws IOException, NotFoundException {
|
||||||
NamespaceAndName namespaceAndName = new NamespaceAndName(namespace, repoName);
|
NamespaceAndName namespaceAndName = new NamespaceAndName(namespace, repoName);
|
||||||
try (RepositoryService repositoryService = serviceFactory.create(namespaceAndName)) {
|
try (RepositoryService repositoryService = serviceFactory.create(namespaceAndName)) {
|
||||||
BrowseCommandBuilder browseCommand = repositoryService.getBrowseCommand();
|
BrowseCommandBuilder browseCommand = repositoryService.getBrowseCommand();
|
||||||
@@ -59,6 +57,7 @@ public class SourceRootResource {
|
|||||||
if (revision != null && !revision.isEmpty()) {
|
if (revision != null && !revision.isEmpty()) {
|
||||||
browseCommand.setRevision(revision);
|
browseCommand.setRevision(revision);
|
||||||
}
|
}
|
||||||
|
browseCommand.setDisableCache(true);
|
||||||
BrowserResult browserResult = browseCommand.getBrowserResult();
|
BrowserResult browserResult = browseCommand.getBrowserResult();
|
||||||
|
|
||||||
if (browserResult != null) {
|
if (browserResult != null) {
|
||||||
|
|||||||
@@ -10,11 +10,11 @@ import org.junit.runner.RunWith;
|
|||||||
import org.mockito.InjectMocks;
|
import org.mockito.InjectMocks;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.junit.MockitoJUnitRunner;
|
import org.mockito.junit.MockitoJUnitRunner;
|
||||||
|
import sonia.scm.NotFoundException;
|
||||||
import sonia.scm.repository.BrowserResult;
|
import sonia.scm.repository.BrowserResult;
|
||||||
import sonia.scm.repository.FileObject;
|
import sonia.scm.repository.FileObject;
|
||||||
import sonia.scm.repository.NamespaceAndName;
|
import sonia.scm.repository.NamespaceAndName;
|
||||||
import sonia.scm.repository.RepositoryNotFoundException;
|
import sonia.scm.repository.RepositoryNotFoundException;
|
||||||
import sonia.scm.repository.RevisionNotFoundException;
|
|
||||||
import sonia.scm.repository.api.BrowseCommandBuilder;
|
import sonia.scm.repository.api.BrowseCommandBuilder;
|
||||||
import sonia.scm.repository.api.RepositoryService;
|
import sonia.scm.repository.api.RepositoryService;
|
||||||
import sonia.scm.repository.api.RepositoryServiceFactory;
|
import sonia.scm.repository.api.RepositoryServiceFactory;
|
||||||
@@ -22,8 +22,6 @@ import sonia.scm.repository.api.RepositoryServiceFactory;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
@@ -69,7 +67,7 @@ public class SourceRootResourceTest extends RepositoryTestBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldReturnSources() throws URISyntaxException, IOException, RevisionNotFoundException {
|
public void shouldReturnSources() throws URISyntaxException, IOException, NotFoundException {
|
||||||
BrowserResult result = createBrowserResult();
|
BrowserResult result = createBrowserResult();
|
||||||
when(browseCommandBuilder.getBrowserResult()).thenReturn(result);
|
when(browseCommandBuilder.getBrowserResult()).thenReturn(result);
|
||||||
MockHttpRequest request = MockHttpRequest.get("/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + "space/repo/sources");
|
MockHttpRequest request = MockHttpRequest.get("/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + "space/repo/sources");
|
||||||
@@ -92,7 +90,7 @@ public class SourceRootResourceTest extends RepositoryTestBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldGetResultForSingleFile() throws URISyntaxException, IOException, RevisionNotFoundException {
|
public void shouldGetResultForSingleFile() throws URISyntaxException, IOException, NotFoundException {
|
||||||
FileObject fileObject = new FileObject();
|
FileObject fileObject = new FileObject();
|
||||||
fileObject.setName("File Object!");
|
fileObject.setName("File Object!");
|
||||||
BrowserResult browserResult = new BrowserResult("revision", fileObject);
|
BrowserResult browserResult = new BrowserResult("revision", fileObject);
|
||||||
|
|||||||
Reference in New Issue
Block a user