mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-10 23:45:44 +01:00
Update browser result after computation
This commit is contained in:
@@ -300,6 +300,13 @@ public final class BrowseCommandBuilder
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateCache(BrowserResult updatedResult) {
|
||||||
|
if (!disableCache) {
|
||||||
|
CacheKey key = new CacheKey(repository, request);
|
||||||
|
cache.put(key, updatedResult);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//~--- inner classes --------------------------------------------------------
|
//~--- inner classes --------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -416,5 +423,5 @@ public final class BrowseCommandBuilder
|
|||||||
private final Repository repository;
|
private final Repository repository;
|
||||||
|
|
||||||
/** request for the command */
|
/** request for the command */
|
||||||
private final BrowseCommandRequest request = new BrowseCommandRequest();
|
private final BrowseCommandRequest request = new BrowseCommandRequest(this::updateCache);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,10 @@ package sonia.scm.repository.spi;
|
|||||||
|
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
import com.google.common.base.Objects;
|
import com.google.common.base.Objects;
|
||||||
|
import sonia.scm.repository.BrowserResult;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Sebastian Sdorra
|
* @author Sebastian Sdorra
|
||||||
@@ -48,6 +52,14 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest
|
|||||||
/** Field description */
|
/** Field description */
|
||||||
private static final long serialVersionUID = 7956624623516803183L;
|
private static final long serialVersionUID = 7956624623516803183L;
|
||||||
|
|
||||||
|
public BrowseCommandRequest() {
|
||||||
|
this(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BrowseCommandRequest(Consumer<BrowserResult> updater) {
|
||||||
|
this.updater = updater;
|
||||||
|
}
|
||||||
|
|
||||||
//~--- methods --------------------------------------------------------------
|
//~--- methods --------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -220,6 +232,12 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest
|
|||||||
return recursive;
|
return recursive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateCache(BrowserResult update) {
|
||||||
|
if (updater != null) {
|
||||||
|
updater.accept(update);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//~--- fields ---------------------------------------------------------------
|
//~--- fields ---------------------------------------------------------------
|
||||||
|
|
||||||
/** disable last commit */
|
/** disable last commit */
|
||||||
@@ -230,4 +248,6 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest
|
|||||||
|
|
||||||
/** browse file objects recursive */
|
/** browse file objects recursive */
|
||||||
private boolean recursive = false;
|
private boolean recursive = false;
|
||||||
|
|
||||||
|
private final Consumer<BrowserResult> updater;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ 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;
|
||||||
import sonia.scm.repository.GitUtil;
|
import sonia.scm.repository.GitUtil;
|
||||||
|
import sonia.scm.repository.InternalRepositoryException;
|
||||||
import sonia.scm.repository.Repository;
|
import sonia.scm.repository.Repository;
|
||||||
import sonia.scm.repository.SubRepository;
|
import sonia.scm.repository.SubRepository;
|
||||||
import sonia.scm.store.Blob;
|
import sonia.scm.store.Blob;
|
||||||
@@ -71,9 +72,7 @@ import java.util.Map;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.Future;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.TimeoutException;
|
|
||||||
|
|
||||||
import static java.util.Optional.empty;
|
import static java.util.Optional.empty;
|
||||||
import static sonia.scm.ContextEntry.ContextBuilder.entity;
|
import static sonia.scm.ContextEntry.ContextBuilder.entity;
|
||||||
@@ -99,7 +98,6 @@ public class GitBrowseCommand extends AbstractGitCommand
|
|||||||
LoggerFactory.getLogger(GitBrowseCommand.class);
|
LoggerFactory.getLogger(GitBrowseCommand.class);
|
||||||
private final LfsBlobStoreFactory lfsBlobStoreFactory;
|
private final LfsBlobStoreFactory lfsBlobStoreFactory;
|
||||||
|
|
||||||
private boolean fetchCommits = true;
|
|
||||||
private ExecutorService executorService;
|
private ExecutorService executorService;
|
||||||
|
|
||||||
//~--- constructors ---------------------------------------------------------
|
//~--- constructors ---------------------------------------------------------
|
||||||
@@ -130,13 +128,25 @@ public class GitBrowseCommand extends AbstractGitCommand
|
|||||||
ObjectId revId = computeRevIdToBrowse(request, repo);
|
ObjectId revId = computeRevIdToBrowse(request, repo);
|
||||||
|
|
||||||
if (revId != null) {
|
if (revId != null) {
|
||||||
return new BrowserResult(revId.getName(), request.getRevision(), getEntry(repo, request, revId));
|
BrowserResult browserResult = new BrowserResult(revId.getName(), request.getRevision(), getEntry(repo, request, revId));
|
||||||
|
executorService.execute(() -> {
|
||||||
|
request.updateCache(browserResult);
|
||||||
|
logger.info("updated browser result for repository {}", repository.getNamespaceAndName());
|
||||||
|
});
|
||||||
|
return browserResult;
|
||||||
} else {
|
} else {
|
||||||
logger.warn("could not find head of repository {}, empty?", repository.getNamespaceAndName());
|
logger.warn("could not find head of repository {}, empty?", repository.getNamespaceAndName());
|
||||||
return new BrowserResult(Constants.HEAD, request.getRevision(), createEmtpyRoot());
|
return new BrowserResult(Constants.HEAD, request.getRevision(), createEmtpyRoot());
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
executorService.shutdown();
|
executorService.shutdown();
|
||||||
|
try {
|
||||||
|
if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) {
|
||||||
|
logger.info("lookup of all commits took too long in repo {}", repository.getNamespaceAndName());
|
||||||
|
}
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,21 +219,16 @@ public class GitBrowseCommand extends AbstractGitCommand
|
|||||||
// don't show message and date for directories to improve performance
|
// don't show message and date for directories to improve performance
|
||||||
if (!file.isDirectory() &&!request.isDisableLastCommit())
|
if (!file.isDirectory() &&!request.isDisableLastCommit())
|
||||||
{
|
{
|
||||||
RevCommit commit = null;
|
executorService.execute(() -> {
|
||||||
if (fetchCommits) {
|
|
||||||
logger.trace("fetch last commit for {} at {}", path, revId.getName());
|
logger.trace("fetch last commit for {} at {}", path, revId.getName());
|
||||||
Future<RevCommit> f = executorService.submit(() -> getLatestCommit(repo, revId, path));
|
RevCommit commit = getLatestCommit(repo, revId, path);
|
||||||
try {
|
|
||||||
commit = f.get(100, TimeUnit.MILLISECONDS);
|
|
||||||
} catch (TimeoutException e) {
|
|
||||||
logger.info("lookup of latest commit took too much time for {} at {}; disabling lookup on {}", path, revId.name(), repository.getNamespaceAndName());
|
|
||||||
fetchCommits = false;
|
|
||||||
} catch (Exception e) {
|
|
||||||
logger.warn("got exception while computing last commit for {} on {}", path, revId.name(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Optional<LfsPointer> lfsPointer = commit == null? empty(): GitUtil.getLfsPointer(repo, path, commit, treeWalk);
|
Optional<LfsPointer> lfsPointer;
|
||||||
|
try {
|
||||||
|
lfsPointer = commit == null ? empty() : GitUtil.getLfsPointer(repo, path, commit, treeWalk);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new InternalRepositoryException(repository, "could not read lfs pointer", e);
|
||||||
|
}
|
||||||
|
|
||||||
if (lfsPointer.isPresent()) {
|
if (lfsPointer.isPresent()) {
|
||||||
BlobStore lfsBlobStore = lfsBlobStoreFactory.getLfsBlobStore(repository);
|
BlobStore lfsBlobStore = lfsBlobStoreFactory.getLfsBlobStore(repository);
|
||||||
@@ -239,16 +244,14 @@ public class GitBrowseCommand extends AbstractGitCommand
|
|||||||
file.setLength(loader.getSize());
|
file.setLength(loader.getSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (commit != null)
|
if (commit != null) {
|
||||||
{
|
|
||||||
file.setLastModified(GitUtil.getCommitTime(commit));
|
file.setLastModified(GitUtil.getCommitTime(commit));
|
||||||
file.setDescription(commit.getShortMessage());
|
file.setDescription(commit.getShortMessage());
|
||||||
}
|
} else {
|
||||||
else if (fetchCommits)
|
|
||||||
{
|
|
||||||
logger.warn("could not find latest commit for {} on {}", path,
|
logger.warn("could not find latest commit for {} on {}", path,
|
||||||
revId);
|
revId);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return file;
|
return file;
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRecusive() throws IOException {
|
public void testRecursive() throws IOException {
|
||||||
BrowseCommandRequest request = new BrowseCommandRequest();
|
BrowseCommandRequest request = new BrowseCommandRequest();
|
||||||
|
|
||||||
request.setRecursive(true);
|
request.setRecursive(true);
|
||||||
|
|||||||
Reference in New Issue
Block a user