From 1beaf9d53a97c7e0f562c5a1082db98982898a4c Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Thu, 12 Dec 2019 17:03:37 +0100 Subject: [PATCH] Cleanup --- .../scm/repository/spi/GitBrowseCommand.java | 142 +++++------------- 1 file changed, 35 insertions(+), 107 deletions(-) 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 18b8b628f1..7927d38b2c 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 @@ -73,6 +73,7 @@ import java.util.Optional; import java.util.function.Consumer; import static java.util.Optional.empty; +import static java.util.Optional.of; import static sonia.scm.ContextEntry.ContextBuilder.entity; import static sonia.scm.NotFoundException.notFound; import static sonia.scm.repository.spi.SyncAsyncExecutor.ExecutionType.ASYNCHRONOUS; @@ -101,24 +102,12 @@ public class GitBrowseCommand extends AbstractGitCommand private BrowserResult browserResult; - //~--- constructors --------------------------------------------------------- - - /** - * Constructs ... - * @param context - * @param repository - * @param lfsBlobStoreFactory - * @param executor - */ - public GitBrowseCommand(GitContext context, Repository repository, LfsBlobStoreFactory lfsBlobStoreFactory, SyncAsyncExecutor executor) - { + public GitBrowseCommand(GitContext context, Repository repository, LfsBlobStoreFactory lfsBlobStoreFactory, SyncAsyncExecutor executor) { super(context, repository); this.lfsBlobStoreFactory = lfsBlobStoreFactory; this.executor = executor; } - //~--- get methods ---------------------------------------------------------- - @Override public BrowserResult getBrowserResult(BrowseCommandRequest request) throws IOException { @@ -131,8 +120,7 @@ public class GitBrowseCommand extends AbstractGitCommand browserResult = new BrowserResult(revId.getName(), request.getRevision(), getEntry(repo, request, revId)); executor.execute(executionType -> { if (executionType == ASYNCHRONOUS) { - request.updateCache(browserResult); - logger.info("updated browser result for repository {}", repository.getNamespaceAndName()); + updateCache(request); } }, () -> {}); return browserResult; @@ -156,8 +144,6 @@ public class GitBrowseCommand extends AbstractGitCommand } } - //~--- methods -------------------------------------------------------------- - private FileObject createEmtpyRoot() { FileObject fileObject = new FileObject(); fileObject.setName(""); @@ -166,18 +152,6 @@ public class GitBrowseCommand extends AbstractGitCommand return fileObject; } - /** - * Method description - * - * @param repo - * @param request - * @param revId - * @param treeWalk - * - * @return - * - * @throws IOException - */ private FileObject createFileObject(org.eclipse.jgit.lib.Repository repo, BrowseCommandRequest request, ObjectId revId, TreeWalk treeWalk) throws IOException { @@ -221,97 +195,41 @@ public class GitBrowseCommand extends AbstractGitCommand return file; } - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * - * @param repo - * @param revId - * @param path - * - * @return - */ - private RevCommit getLatestCommit(org.eclipse.jgit.lib.Repository repo, - ObjectId revId, String path) - { - RevCommit result = null; - RevWalk walk = null; - - try - { - walk = new RevWalk(repo); - walk.setTreeFilter(AndTreeFilter.create( - TreeFilter.ANY_DIFF - , - PathFilter.create(path) - ) - ); - - RevCommit commit = walk.parseCommit(revId); - - walk.markStart(commit); - result = Util.getFirst(walk); - } - catch (IOException ex) - { - logger.error("could not parse commit for file", ex); - } - finally - { - GitUtil.release(walk); - } - - return result; + private void updateCache(BrowseCommandRequest request) { + request.updateCache(browserResult); + logger.info("updated browser result for repository {}", repository.getNamespaceAndName()); } private FileObject getEntry(org.eclipse.jgit.lib.Repository repo, BrowseCommandRequest request, ObjectId revId) throws IOException { - RevWalk revWalk = null; - TreeWalk treeWalk = null; - FileObject result; - - try { + try (RevWalk revWalk = new RevWalk(repo); TreeWalk treeWalk = new TreeWalk(repo)) { logger.debug("load repository browser for revision {}", revId.name()); - treeWalk = new TreeWalk(repo); if (!isRootRequest(request)) { treeWalk.setFilter(PathFilter.create(request.getPath())); } - revWalk = new RevWalk(repo); RevTree tree = revWalk.parseTree(revId); - if (tree != null) - { + if (tree != null) { treeWalk.addTree(tree); - } - else - { + } else { throw new IllegalStateException("could not find tree for " + revId.name()); } if (isRootRequest(request)) { - result = createEmtpyRoot(); + FileObject result = createEmtpyRoot(); findChildren(result, repo, request, revId, treeWalk); + return result; } else { - result = findFirstMatch(repo, request, revId, treeWalk); + FileObject result = findFirstMatch(repo, request, revId, treeWalk); if ( result.isDirectory() ) { treeWalk.enterSubtree(); findChildren(result, repo, request, revId, treeWalk); } + return result; } - } - finally - { - GitUtil.release(revWalk); - GitUtil.release(treeWalk); - } - - return result; } private boolean isRootRequest(BrowseCommandRequest request) { @@ -368,7 +286,6 @@ public class GitBrowseCommand extends AbstractGitCommand throw notFound(entity("File", request.getPath()).in("Revision", revId.getName()).in(this.repository)); } - @SuppressWarnings("unchecked") private Map getSubRepositories(org.eclipse.jgit.lib.Repository repo, ObjectId revision) @@ -443,9 +360,9 @@ public class GitBrowseCommand extends AbstractGitCommand @Override public void accept(SyncAsyncExecutor.ExecutionType executionType) { logger.trace("fetch last commit for {} at {}", path, revId.getName()); - RevCommit commit = GitBrowseCommand.this.getLatestCommit(repo, revId, path); + Optional commit = getLatestCommit(repo, revId, path); - Optional lfsPointer = getLfsPointer(commit); + Optional lfsPointer = commit.flatMap(this::getLfsPointer); if (lfsPointer.isPresent()) { setFileLengthFromLfsBlob(lfsPointer.get()); @@ -454,13 +371,28 @@ public class GitBrowseCommand extends AbstractGitCommand } file.setPartialResult(false); - if (commit != null) { - applyValuesFromCommit(executionType, commit); + if (commit.isPresent()) { + applyValuesFromCommit(executionType, commit.get()); } else { logger.warn("could not find latest commit for {} on {}", path, revId); } } + private Optional getLatestCommit(org.eclipse.jgit.lib.Repository repo, + ObjectId revId, String path) { + try (RevWalk walk = new RevWalk(repo)) { + walk.setTreeFilter(AndTreeFilter.create(TreeFilter.ANY_DIFF, PathFilter.create(path))); + + RevCommit commit = walk.parseCommit(revId); + + walk.markStart(commit); + return of(Util.getFirst(walk)); + } catch (IOException ex) { + logger.error("could not parse commit for file", ex); + return empty(); + } + } + private void setFileLengthFromLfsBlob(LfsPointer lfsPointer) { BlobStore lfsBlobStore = lfsBlobStoreFactory.getLfsBlobStore(repository); String oid = lfsPointer.getOid().getName(); @@ -477,19 +409,16 @@ public class GitBrowseCommand extends AbstractGitCommand file.setLastModified(GitUtil.getCommitTime(commit)); file.setDescription(commit.getShortMessage()); if (executionType == ASYNCHRONOUS && browserResult != null) { - request.updateCache(browserResult); - logger.info("updated browser result for repository {}", repository.getNamespaceAndName()); + updateCache(request); } } private Optional getLfsPointer(RevCommit commit) { - Optional lfsPointer; try { - lfsPointer = commit == null ? empty() : GitUtil.getLfsPointer(repo, path, commit, treeWalk); + return GitUtil.getLfsPointer(repo, path, commit, treeWalk); } catch (IOException e) { throw new InternalRepositoryException(repository, "could not read lfs pointer", e); } - return lfsPointer; } } @@ -506,8 +435,7 @@ public class GitBrowseCommand extends AbstractGitCommand public void run() { file.setPartialResult(false); file.setComputationAborted(true); - request.updateCache(browserResult); - logger.info("updated browser result for repository {}", repository.getNamespaceAndName()); + updateCache(request); } } }