From ecab3ce13b603234b07494482c18b3bd337877d8 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 28 Oct 2020 17:00:12 +0100 Subject: [PATCH] Fix internal server error for git sub modules without tree object --- CHANGELOG.md | 1 + .../scm/repository/spi/GitBrowseCommand.java | 74 +++++++--- .../GitBrowseCommand_BrokenSubmoduleTest.java | 129 ++++++++++++++++++ .../spi/scm-git-broken-submodule-repo.zip | Bin 0 -> 47140 bytes 4 files changed, 182 insertions(+), 22 deletions(-) create mode 100644 scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommand_BrokenSubmoduleTest.java create mode 100644 scm-plugins/scm-git-plugin/src/test/resources/sonia/scm/repository/spi/scm-git-broken-submodule-repo.zip diff --git a/CHANGELOG.md b/CHANGELOG.md index 6cbd392b0f..2159d10d1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased ### Fixed +- Internal server error for git sub modules without tree object ([#1397](https://github.com/scm-manager/scm-manager/pull/1397)) - Do not expose subversion commit with id 0 ([#1395](https://github.com/scm-manager/scm-manager/pull/1395)) ## [2.8.0] - 2020-10-27 diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java index 97115ca159..b80349cb2b 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java @@ -55,6 +55,7 @@ import sonia.scm.store.BlobStore; import sonia.scm.util.Util; import sonia.scm.web.lfs.LfsBlobStoreFactory; +import javax.annotation.Nullable; import javax.inject.Inject; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -283,11 +284,15 @@ public class GitBrowseCommand extends AbstractGitCommand parents.pop(); } TreeEntry currentParent = parents.peek(); - TreeEntry treeEntry = new TreeEntry(repo, treeWalk); - currentParent.addChild(treeEntry); - if (request.isRecursive() && treeEntry.getType() == TreeType.DIRECTORY) { - treeWalk.enterSubtree(); - parents.push(treeEntry); + TreeEntry treeEntry = createTreeEntry(repo, treeWalk); + if (treeEntry != null) { + currentParent.addChild(treeEntry); + if (request.isRecursive() && treeEntry.getType() == TreeType.DIRECTORY) { + treeWalk.enterSubtree(); + parents.push(treeEntry); + } + } else { + logger.warn("failed to find tree entry for {}", currentPath); } } } @@ -304,7 +309,12 @@ public class GitBrowseCommand extends AbstractGitCommand currentDepth++; if (currentDepth >= limit) { - return createFileObject(new TreeEntry(repo, treeWalk)); + TreeEntry treeEntry = createTreeEntry(repo, treeWalk); + if (treeEntry != null) { + return createFileObject(treeEntry); + } else { + logger.warn("could not find tree entry at {}", name); + } } else { treeWalk.enterSubtree(); } @@ -328,8 +338,12 @@ public class GitBrowseCommand extends AbstractGitCommand } } - private SubRepository getSubRepository(String path) - throws IOException { + @Nullable + private SubRepository getSubRepository(String path) throws IOException { + if (request.isDisableSubRepositoryDetection()) { + return null; + } + Map subRepositories = subrepositoryCache.get(revId); if (subRepositories == null) { @@ -447,6 +461,23 @@ public class GitBrowseCommand extends AbstractGitCommand FILE, DIRECTORY, SUB_REPOSITORY } + @Nullable + TreeEntry createTreeEntry(org.eclipse.jgit.lib.Repository repo, TreeWalk treeWalk) throws IOException { + String pathString = treeWalk.getPathString(); + ObjectId objectId = treeWalk.getObjectId(0); + SubRepository subRepository = getSubRepository(pathString); + if (subRepository != null) { + return new TreeEntry(pathString, treeWalk.getNameString(), objectId, subRepository); + } else if (repo.getObjectDatabase().has(objectId)) { + TreeType type = TreeType.FILE; + if (repo.open(objectId).getType() == Constants.OBJ_TREE) { + type = TreeType.DIRECTORY; + } + return new TreeEntry(pathString, treeWalk.getNameString(), objectId, type); + } + return null; + } + private class TreeEntry { private final String pathString; @@ -466,21 +497,20 @@ public class GitBrowseCommand extends AbstractGitCommand type = TreeType.DIRECTORY; } - TreeEntry(org.eclipse.jgit.lib.Repository repo, TreeWalk treeWalk) throws IOException { - this.pathString = treeWalk.getPathString(); - this.nameString = treeWalk.getNameString(); - this.objectId = treeWalk.getObjectId(0); + TreeEntry(String pathString, String nameString, ObjectId objectId, SubRepository subRepository) { + this.pathString = pathString; + this.nameString = nameString; + this.objectId = objectId; + this.type = TreeType.SUB_REPOSITORY; + this.subRepository = subRepository; + } - if (!request.isDisableSubRepositoryDetection() && GitBrowseCommand.this.getSubRepository(pathString) != null) { - subRepository = GitBrowseCommand.this.getSubRepository(pathString); - type = TreeType.SUB_REPOSITORY; - } else if (repo.open(objectId).getType() == Constants.OBJ_TREE) { - subRepository = null; - type = TreeType.DIRECTORY; - } else { - subRepository = null; - type = TreeType.FILE; - } + TreeEntry(String pathString, String nameString, ObjectId objectId, TreeType type) { + this.pathString = pathString; + this.nameString = nameString; + this.objectId = objectId; + this.type = type; + this.subRepository = null; } String getPathString() { diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommand_BrokenSubmoduleTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommand_BrokenSubmoduleTest.java new file mode 100644 index 0000000000..4d73bef0f2 --- /dev/null +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommand_BrokenSubmoduleTest.java @@ -0,0 +1,129 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.repository.spi; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import sonia.scm.repository.BrowserResult; +import sonia.scm.repository.FileObject; +import sonia.scm.web.lfs.LfsBlobStoreFactory; + +import javax.annotation.Nonnull; +import java.io.IOException; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; +import static sonia.scm.repository.spi.SyncAsyncExecutors.synchronousExecutor; + +@RunWith(MockitoJUnitRunner.class) +public class GitBrowseCommand_BrokenSubmoduleTest extends AbstractGitCommandTestBase { + + @Mock + private LfsBlobStoreFactory lfsBlobStoreFactory; + + private GitBrowseCommand command; + + @Before + public void createCommand() { + command = new GitBrowseCommand(createContext(), lfsBlobStoreFactory, synchronousExecutor()); + } + + @Test + public void testBrowse() throws IOException { + BrowserResult result = command.getBrowserResult(new BrowseCommandRequest()); + Collection children = result.getFile().getChildren(); + + List subrepos = subRepositoriesOnly(children); + assertThat(subrepos).containsExactly( + "anonymous-access", + "hasselhoffme", + "recipes", + "scm-redmine-plugin" + ); + + List directories = directoriesOnly(children); + assertThat(directories).containsExactly( + "dir", + "plugins" + ); + + List files = filesOnly(children); + assertThat(files) + .containsExactly( + ".gitmodules", + "README.md", + "test.txt" + ); + } + + @Test + public void testBrowseRecursive() throws IOException { + BrowseCommandRequest request = new BrowseCommandRequest(); + request.setRecursive(true); + BrowserResult result = command.getBrowserResult(request); + Collection children = result.getFile().getChildren(); + FileObject fileObject = children.stream().filter(f -> "plugins".equals(f.getPath())).findFirst().get(); + assertThat(fileObject.getChildren()).hasSize(3); + List subrepos = subRepositoriesOnly(fileObject.getChildren()); + assertThat(subrepos) + .containsExactly( + "plugins/scm-branchwp-plugin", + "plugins/scm-jira-plugin", + "plugins/statistic-plugin" + ); + } + + @Nonnull + private List filesOnly(Collection children) { + return children.stream().filter(f -> !f.isDirectory()).map(FileObject::getPath).collect(Collectors.toList()); + } + + @Nonnull + private List directoriesOnly(Collection children) { + return children.stream() + .filter(FileObject::isDirectory) + .filter(f -> f.getSubRepository() == null) + .map(FileObject::getPath) + .collect(Collectors.toList()); + } + + @Nonnull + private List subRepositoriesOnly(Collection children) { + return children.stream() + .filter(f -> f.getSubRepository() != null) + .map(FileObject::getPath) + .collect(Collectors.toList()); + } + + @Override + protected String getZippedRepositoryResource() { + return "sonia/scm/repository/spi/scm-git-broken-submodule-repo.zip"; + } +} diff --git a/scm-plugins/scm-git-plugin/src/test/resources/sonia/scm/repository/spi/scm-git-broken-submodule-repo.zip b/scm-plugins/scm-git-plugin/src/test/resources/sonia/scm/repository/spi/scm-git-broken-submodule-repo.zip new file mode 100644 index 0000000000000000000000000000000000000000..e123c32400cfc63d3ea62be36a420f7ad7a300bd GIT binary patch literal 47140 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�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 VfXFCkvE6}x&c1GQjyn6l{{sc@+PnY& literal 0 HcmV?d00001