mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-01 19:15:52 +01:00
Collect metrics over lifetime of working copies (#1591)
Capture metrics about the lifetime of working copies used, for example, by the merge and modify commands. Working copies are internal repository clones that can place a large load on the server. Therefore, these metrics can be helpful in identifying sources of large server load. Co-authored-by: Sebastian Sdorra <sebastian.sdorra@cloudogu.com>
This commit is contained in:
2
gradle/changelog/workingcopy_metrics.yaml
Normal file
2
gradle/changelog/workingcopy_metrics.yaml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
- type: added
|
||||||
|
description: Adds metrics over lifetime duration of working copies ([#1591](https://github.com/scm-manager/scm-manager/pull/1591))
|
||||||
@@ -26,6 +26,7 @@ package sonia.scm.metrics;
|
|||||||
|
|
||||||
import io.micrometer.core.instrument.MeterRegistry;
|
import io.micrometer.core.instrument.MeterRegistry;
|
||||||
import io.micrometer.core.instrument.Tag;
|
import io.micrometer.core.instrument.Tag;
|
||||||
|
import io.micrometer.core.instrument.Timer;
|
||||||
import io.micrometer.core.instrument.binder.jvm.ExecutorServiceMetrics;
|
import io.micrometer.core.instrument.binder.jvm.ExecutorServiceMetrics;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -56,4 +57,17 @@ public final class Metrics {
|
|||||||
Collections.singleton(Tag.of("type", type))
|
Collections.singleton(Tag.of("type", type))
|
||||||
).bindTo(registry);
|
).bindTo(registry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collect metrics from an {@link sonia.scm.repository.work.WorkingCopy}.
|
||||||
|
*
|
||||||
|
* @param registry meter registry
|
||||||
|
* @param type type of repository
|
||||||
|
*/
|
||||||
|
public static Timer workingCopyTimer(MeterRegistry registry, String type) {
|
||||||
|
return Timer.builder("scm.workingcopy.duration")
|
||||||
|
.description("Duration of temporary working copy lifetime")
|
||||||
|
.tags("type", type)
|
||||||
|
.register(registry);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,8 +24,12 @@
|
|||||||
|
|
||||||
package sonia.scm.repository.work;
|
package sonia.scm.repository.work;
|
||||||
|
|
||||||
|
import io.micrometer.core.instrument.MeterRegistry;
|
||||||
|
import io.micrometer.core.instrument.Timer;
|
||||||
|
import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import sonia.scm.metrics.Metrics;
|
||||||
import sonia.scm.repository.Repository;
|
import sonia.scm.repository.Repository;
|
||||||
import sonia.scm.repository.RepositoryProvider;
|
import sonia.scm.repository.RepositoryProvider;
|
||||||
|
|
||||||
@@ -100,9 +104,28 @@ public abstract class SimpleWorkingCopyFactory<R, W, C extends RepositoryProvide
|
|||||||
private static final Logger LOG = LoggerFactory.getLogger(SimpleWorkingCopyFactory.class);
|
private static final Logger LOG = LoggerFactory.getLogger(SimpleWorkingCopyFactory.class);
|
||||||
|
|
||||||
private final WorkingCopyPool workingCopyPool;
|
private final WorkingCopyPool workingCopyPool;
|
||||||
|
private final MeterRegistry meterRegistry;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new {@link SimpleWorkingCopyFactory}
|
||||||
|
*
|
||||||
|
* @param workingCopyPool pool which provides working copies
|
||||||
|
* @deprecated since 2.16.0 use {@link SimpleWorkingCopyFactory(WorkingCopyPool, MeterRegistry)} instead
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public SimpleWorkingCopyFactory(WorkingCopyPool workingCopyPool) {
|
public SimpleWorkingCopyFactory(WorkingCopyPool workingCopyPool) {
|
||||||
|
this(workingCopyPool, new CompositeMeterRegistry());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new {@link SimpleWorkingCopyFactory}
|
||||||
|
*
|
||||||
|
* @param workingCopyPool pool which provides working copies
|
||||||
|
* @param meterRegistry registry to collect metrics
|
||||||
|
*/
|
||||||
|
public SimpleWorkingCopyFactory(WorkingCopyPool workingCopyPool, MeterRegistry meterRegistry) {
|
||||||
this.workingCopyPool = workingCopyPool;
|
this.workingCopyPool = workingCopyPool;
|
||||||
|
this.meterRegistry = meterRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -181,10 +204,12 @@ public abstract class SimpleWorkingCopyFactory<R, W, C extends RepositoryProvide
|
|||||||
public class WorkingCopyContext {
|
public class WorkingCopyContext {
|
||||||
private final String requestedBranch;
|
private final String requestedBranch;
|
||||||
private final C repositoryContext;
|
private final C repositoryContext;
|
||||||
|
private final Timer.Sample sample;
|
||||||
|
|
||||||
public WorkingCopyContext(String requestedBranch, C repositoryContext) {
|
public WorkingCopyContext(String requestedBranch, C repositoryContext) {
|
||||||
this.requestedBranch = requestedBranch;
|
this.requestedBranch = requestedBranch;
|
||||||
this.repositoryContext = repositoryContext;
|
this.repositoryContext = repositoryContext;
|
||||||
|
sample = Timer.start(meterRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Repository getScmRepository() {
|
public Repository getScmRepository() {
|
||||||
@@ -204,6 +229,14 @@ public abstract class SimpleWorkingCopyFactory<R, W, C extends RepositoryProvide
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void close(ParentAndClone<R, W> parentAndClone) {
|
private void close(ParentAndClone<R, W> parentAndClone) {
|
||||||
|
try {
|
||||||
|
closeResources(parentAndClone);
|
||||||
|
} finally {
|
||||||
|
sample.stop(Metrics.workingCopyTimer(meterRegistry, repositoryContext.get().getType()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void closeResources(ParentAndClone<R, W> parentAndClone) {
|
||||||
try {
|
try {
|
||||||
closeWorkingCopy(parentAndClone.getClone());
|
closeWorkingCopy(parentAndClone.getClone());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|||||||
@@ -24,6 +24,9 @@
|
|||||||
|
|
||||||
package sonia.scm.repository.work;
|
package sonia.scm.repository.work;
|
||||||
|
|
||||||
|
import io.micrometer.core.instrument.Meter;
|
||||||
|
import io.micrometer.core.instrument.MeterRegistry;
|
||||||
|
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -62,8 +65,11 @@ public class SimpleWorkingCopyFactoryTest {
|
|||||||
private boolean workdirIsCached = false;
|
private boolean workdirIsCached = false;
|
||||||
private File workdir;
|
private File workdir;
|
||||||
|
|
||||||
|
private MeterRegistry meterRegistry;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void initFactory() throws IOException {
|
public void initFactory() throws IOException {
|
||||||
|
meterRegistry = new SimpleMeterRegistry();
|
||||||
WorkdirProvider workdirProvider = new WorkdirProvider(temporaryFolder.newFolder(), repositoryLocationResolver, false);
|
WorkdirProvider workdirProvider = new WorkdirProvider(temporaryFolder.newFolder(), repositoryLocationResolver, false);
|
||||||
WorkingCopyPool configurableTestWorkingCopyPool = new WorkingCopyPool() {
|
WorkingCopyPool configurableTestWorkingCopyPool = new WorkingCopyPool() {
|
||||||
@Override
|
@Override
|
||||||
@@ -83,7 +89,7 @@ public class SimpleWorkingCopyFactoryTest {
|
|||||||
public void shutdown() {
|
public void shutdown() {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
simpleWorkingCopyFactory = new SimpleWorkingCopyFactory<Closeable, Closeable, Context>(configurableTestWorkingCopyPool) {
|
simpleWorkingCopyFactory = new SimpleWorkingCopyFactory<Closeable, Closeable, Context>(configurableTestWorkingCopyPool, meterRegistry) {
|
||||||
@Override
|
@Override
|
||||||
protected void closeRepository(Closeable repository) throws IOException {
|
protected void closeRepository(Closeable repository) throws IOException {
|
||||||
repository.close();
|
repository.close();
|
||||||
@@ -126,6 +132,10 @@ public class SimpleWorkingCopyFactoryTest {
|
|||||||
try (WorkingCopy<Closeable, Closeable> workingCopy = simpleWorkingCopyFactory.createWorkingCopy(context, null)) {}
|
try (WorkingCopy<Closeable, Closeable> workingCopy = simpleWorkingCopyFactory.createWorkingCopy(context, null)) {}
|
||||||
|
|
||||||
verify(parent).close();
|
verify(parent).close();
|
||||||
|
assertThat(meterRegistry.getMeters()).hasSize(1);
|
||||||
|
Meter.Id meterId = meterRegistry.getMeters().get(0).getId();
|
||||||
|
assertThat(meterId.getName()).isEqualTo("scm.workingcopy.duration");
|
||||||
|
assertThat(meterId.getTag("type")).isEqualTo("git");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -134,6 +144,10 @@ public class SimpleWorkingCopyFactoryTest {
|
|||||||
try (WorkingCopy<Closeable, Closeable> workingCopy = simpleWorkingCopyFactory.createWorkingCopy(context, null)) {}
|
try (WorkingCopy<Closeable, Closeable> workingCopy = simpleWorkingCopyFactory.createWorkingCopy(context, null)) {}
|
||||||
|
|
||||||
verify(clone).close();
|
verify(clone).close();
|
||||||
|
assertThat(meterRegistry.getMeters()).hasSize(1);
|
||||||
|
Meter.Id meterId = meterRegistry.getMeters().get(0).getId();
|
||||||
|
assertThat(meterId.getName()).isEqualTo("scm.workingcopy.duration");
|
||||||
|
assertThat(meterId.getTag("type")).isEqualTo("git");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
package sonia.scm.repository.spi;
|
package sonia.scm.repository.spi;
|
||||||
|
|
||||||
|
import io.micrometer.core.instrument.MeterRegistry;
|
||||||
import org.eclipse.jgit.lib.Repository;
|
import org.eclipse.jgit.lib.Repository;
|
||||||
import org.eclipse.jgit.transport.ScmTransportProtocol;
|
import org.eclipse.jgit.transport.ScmTransportProtocol;
|
||||||
import sonia.scm.repository.GitWorkingCopyFactory;
|
import sonia.scm.repository.GitWorkingCopyFactory;
|
||||||
@@ -37,8 +38,8 @@ import java.io.File;
|
|||||||
public class SimpleGitWorkingCopyFactory extends SimpleWorkingCopyFactory<Repository, Repository, GitContext> implements GitWorkingCopyFactory {
|
public class SimpleGitWorkingCopyFactory extends SimpleWorkingCopyFactory<Repository, Repository, GitContext> implements GitWorkingCopyFactory {
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public SimpleGitWorkingCopyFactory(WorkingCopyPool workdirProvider) {
|
public SimpleGitWorkingCopyFactory(WorkingCopyPool workdirProvider, MeterRegistry meterRegistry) {
|
||||||
super(workdirProvider);
|
super(workdirProvider, meterRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ package sonia.scm.repository.spi;
|
|||||||
|
|
||||||
import com.github.sdorra.shiro.ShiroRule;
|
import com.github.sdorra.shiro.ShiroRule;
|
||||||
import com.github.sdorra.shiro.SubjectAware;
|
import com.github.sdorra.shiro.SubjectAware;
|
||||||
|
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
|
||||||
import org.apache.shiro.subject.SimplePrincipalCollection;
|
import org.apache.shiro.subject.SimplePrincipalCollection;
|
||||||
import org.apache.shiro.subject.Subject;
|
import org.apache.shiro.subject.Subject;
|
||||||
import org.eclipse.jgit.api.Git;
|
import org.eclipse.jgit.api.Git;
|
||||||
@@ -516,7 +517,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private GitMergeCommand createCommand(Consumer<Git> interceptor) {
|
private GitMergeCommand createCommand(Consumer<Git> interceptor) {
|
||||||
return new GitMergeCommand(createContext(), new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver)))) {
|
return new GitMergeCommand(createContext(), new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver)), new SimpleMeterRegistry())) {
|
||||||
@Override
|
@Override
|
||||||
<R, W extends GitCloneWorker<R>> R inClone(Function<Git, W> workerSupplier, GitWorkingCopyFactory workingCopyFactory, String initialBranch) {
|
<R, W extends GitCloneWorker<R>> R inClone(Function<Git, W> workerSupplier, GitWorkingCopyFactory workingCopyFactory, String initialBranch) {
|
||||||
Function<Git, W> interceptedWorkerSupplier = git -> {
|
Function<Git, W> interceptedWorkerSupplier = git -> {
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
package sonia.scm.repository.spi;
|
package sonia.scm.repository.spi;
|
||||||
|
|
||||||
|
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import sonia.scm.repository.spi.MergeConflictResult.SingleMergeConflict;
|
import sonia.scm.repository.spi.MergeConflictResult.SingleMergeConflict;
|
||||||
@@ -92,7 +93,7 @@ public class GitMergeCommand_Conflict_Test extends AbstractGitCommandTestBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private MergeConflictResult computeMergeConflictResult(String branchToMerge, String targetBranch) {
|
private MergeConflictResult computeMergeConflictResult(String branchToMerge, String targetBranch) {
|
||||||
GitMergeCommand gitMergeCommand = new GitMergeCommand(createContext(), new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver))));
|
GitMergeCommand gitMergeCommand = new GitMergeCommand(createContext(), new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver)), new SimpleMeterRegistry()));
|
||||||
MergeCommandRequest mergeCommandRequest = new MergeCommandRequest();
|
MergeCommandRequest mergeCommandRequest = new MergeCommandRequest();
|
||||||
mergeCommandRequest.setBranchToMerge(branchToMerge);
|
mergeCommandRequest.setBranchToMerge(branchToMerge);
|
||||||
mergeCommandRequest.setTargetBranch(targetBranch);
|
mergeCommandRequest.setTargetBranch(targetBranch);
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ package sonia.scm.repository.spi;
|
|||||||
|
|
||||||
import com.github.sdorra.shiro.ShiroRule;
|
import com.github.sdorra.shiro.ShiroRule;
|
||||||
import com.github.sdorra.shiro.SubjectAware;
|
import com.github.sdorra.shiro.SubjectAware;
|
||||||
|
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
|
||||||
import org.eclipse.jgit.api.Git;
|
import org.eclipse.jgit.api.Git;
|
||||||
import org.eclipse.jgit.api.errors.GitAPIException;
|
import org.eclipse.jgit.api.errors.GitAPIException;
|
||||||
import org.eclipse.jgit.errors.CorruptObjectException;
|
import org.eclipse.jgit.errors.CorruptObjectException;
|
||||||
@@ -72,7 +73,7 @@ class GitModifyCommandTestBase extends AbstractGitCommandTestBase {
|
|||||||
GitModifyCommand createCommand() {
|
GitModifyCommand createCommand() {
|
||||||
return new GitModifyCommand(
|
return new GitModifyCommand(
|
||||||
createContext(),
|
createContext(),
|
||||||
new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver))),
|
new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver)), new SimpleMeterRegistry()),
|
||||||
lfsBlobStoreFactory,
|
lfsBlobStoreFactory,
|
||||||
createGitRepositoryConfigStoreProvider());
|
createGitRepositoryConfigStoreProvider());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void emptyPoolShouldCreateNewWorkdir() {
|
public void emptyPoolShouldCreateNewWorkdir() {
|
||||||
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider));
|
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry());
|
||||||
File masterRepo = createRepositoryDirectory();
|
File masterRepo = createRepositoryDirectory();
|
||||||
|
|
||||||
try (WorkingCopy<Repository, Repository> workingCopy = factory.createWorkingCopy(createContext(), null)) {
|
try (WorkingCopy<Repository, Repository> workingCopy = factory.createWorkingCopy(createContext(), null)) {
|
||||||
@@ -100,7 +100,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldCheckoutInitialBranch() {
|
public void shouldCheckoutInitialBranch() {
|
||||||
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider));
|
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry());
|
||||||
|
|
||||||
try (WorkingCopy<Repository, Repository> workingCopy = factory.createWorkingCopy(createContext(), "test-branch")) {
|
try (WorkingCopy<Repository, Repository> workingCopy = factory.createWorkingCopy(createContext(), "test-branch")) {
|
||||||
assertThat(new File(workingCopy.getWorkingRepository().getWorkTree(), "a.txt"))
|
assertThat(new File(workingCopy.getWorkingRepository().getWorkTree(), "a.txt"))
|
||||||
@@ -112,7 +112,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldCheckoutDefaultBranch() {
|
public void shouldCheckoutDefaultBranch() {
|
||||||
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider));
|
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry());
|
||||||
|
|
||||||
try (WorkingCopy<Repository, Repository> workingCopy = factory.createWorkingCopy(createContext(), null)) {
|
try (WorkingCopy<Repository, Repository> workingCopy = factory.createWorkingCopy(createContext(), null)) {
|
||||||
assertThat(new File(workingCopy.getWorkingRepository().getWorkTree(), "a.txt"))
|
assertThat(new File(workingCopy.getWorkingRepository().getWorkTree(), "a.txt"))
|
||||||
@@ -124,7 +124,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void cloneFromPoolShouldNotBeReused() {
|
public void cloneFromPoolShouldNotBeReused() {
|
||||||
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider));
|
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry());
|
||||||
|
|
||||||
File firstDirectory;
|
File firstDirectory;
|
||||||
try (WorkingCopy<Repository, Repository> workingCopy = factory.createWorkingCopy(createContext(), null)) {
|
try (WorkingCopy<Repository, Repository> workingCopy = factory.createWorkingCopy(createContext(), null)) {
|
||||||
@@ -138,7 +138,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void cloneFromPoolShouldBeDeletedOnClose() {
|
public void cloneFromPoolShouldBeDeletedOnClose() {
|
||||||
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider));
|
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry());
|
||||||
|
|
||||||
File directory;
|
File directory;
|
||||||
try (WorkingCopy<Repository, Repository> workingCopy = factory.createWorkingCopy(createContext(), null)) {
|
try (WorkingCopy<Repository, Repository> workingCopy = factory.createWorkingCopy(createContext(), null)) {
|
||||||
@@ -149,7 +149,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldReclaimCleanDirectoryWithSameBranch() throws Exception {
|
public void shouldReclaimCleanDirectoryWithSameBranch() throws Exception {
|
||||||
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider));
|
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry());
|
||||||
File workdir = createExistingClone(factory);
|
File workdir = createExistingClone(factory);
|
||||||
|
|
||||||
factory.reclaim(createContext(), workdir, "master");
|
factory.reclaim(createContext(), workdir, "master");
|
||||||
@@ -159,7 +159,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldReclaimCleanDirectoryWithOtherBranch() throws Exception {
|
public void shouldReclaimCleanDirectoryWithOtherBranch() throws Exception {
|
||||||
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider));
|
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry());
|
||||||
File workdir = createExistingClone(factory);
|
File workdir = createExistingClone(factory);
|
||||||
|
|
||||||
factory.reclaim(createContext(), workdir, "test-branch");
|
factory.reclaim(createContext(), workdir, "test-branch");
|
||||||
@@ -169,7 +169,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldReclaimDirectoryWithDeletedFileInIndex() throws Exception {
|
public void shouldReclaimDirectoryWithDeletedFileInIndex() throws Exception {
|
||||||
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider));
|
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry());
|
||||||
File workdir = createExistingClone(factory);
|
File workdir = createExistingClone(factory);
|
||||||
Git.open(workdir).rm().addFilepattern("a.txt").call();
|
Git.open(workdir).rm().addFilepattern("a.txt").call();
|
||||||
|
|
||||||
@@ -180,7 +180,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldReclaimDirectoryWithDeletedFileInDirectory() throws Exception {
|
public void shouldReclaimDirectoryWithDeletedFileInDirectory() throws Exception {
|
||||||
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider));
|
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry());
|
||||||
File workdir = createExistingClone(factory);
|
File workdir = createExistingClone(factory);
|
||||||
Files.delete(workdir.toPath().resolve("a.txt"));
|
Files.delete(workdir.toPath().resolve("a.txt"));
|
||||||
|
|
||||||
@@ -191,7 +191,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldReclaimDirectoryWithAdditionalFileInDirectory() throws Exception {
|
public void shouldReclaimDirectoryWithAdditionalFileInDirectory() throws Exception {
|
||||||
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider));
|
SimpleGitWorkingCopyFactory factory = new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry());
|
||||||
File workdir = createExistingClone(factory);
|
File workdir = createExistingClone(factory);
|
||||||
Path newDirectory = workdir.toPath().resolve("new");
|
Path newDirectory = workdir.toPath().resolve("new");
|
||||||
Files.createDirectories(newDirectory);
|
Files.createDirectories(newDirectory);
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import com.aragost.javahg.commands.PullCommand;
|
|||||||
import com.aragost.javahg.commands.StatusCommand;
|
import com.aragost.javahg.commands.StatusCommand;
|
||||||
import com.aragost.javahg.commands.UpdateCommand;
|
import com.aragost.javahg.commands.UpdateCommand;
|
||||||
import com.aragost.javahg.commands.flags.CloneCommandFlags;
|
import com.aragost.javahg.commands.flags.CloneCommandFlags;
|
||||||
|
import io.micrometer.core.instrument.MeterRegistry;
|
||||||
import sonia.scm.repository.HgExtensions;
|
import sonia.scm.repository.HgExtensions;
|
||||||
import sonia.scm.repository.InternalRepositoryException;
|
import sonia.scm.repository.InternalRepositoryException;
|
||||||
import sonia.scm.repository.work.SimpleWorkingCopyFactory;
|
import sonia.scm.repository.work.SimpleWorkingCopyFactory;
|
||||||
@@ -45,8 +46,8 @@ import java.io.IOException;
|
|||||||
public class SimpleHgWorkingCopyFactory extends SimpleWorkingCopyFactory<Repository, Repository, HgCommandContext> implements HgWorkingCopyFactory {
|
public class SimpleHgWorkingCopyFactory extends SimpleWorkingCopyFactory<Repository, Repository, HgCommandContext> implements HgWorkingCopyFactory {
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public SimpleHgWorkingCopyFactory(WorkingCopyPool workdirProvider) {
|
public SimpleHgWorkingCopyFactory(WorkingCopyPool workdirProvider, MeterRegistry meterRegistry) {
|
||||||
super(workdirProvider);
|
super(workdirProvider, meterRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
package sonia.scm.repository.spi;
|
package sonia.scm.repository.spi;
|
||||||
|
|
||||||
import com.aragost.javahg.commands.PullCommand;
|
import com.aragost.javahg.commands.PullCommand;
|
||||||
|
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import sonia.scm.repository.Branch;
|
import sonia.scm.repository.Branch;
|
||||||
@@ -45,7 +46,7 @@ public class HgBranchCommandTest extends AbstractHgCommandTestBase {
|
|||||||
@Before
|
@Before
|
||||||
public void initWorkingCopyFactory() {
|
public void initWorkingCopyFactory() {
|
||||||
|
|
||||||
workingCopyFactory = new SimpleHgWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver))) {
|
workingCopyFactory = new SimpleHgWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver)), new SimpleMeterRegistry()) {
|
||||||
@Override
|
@Override
|
||||||
public void configure(PullCommand pullCommand) {
|
public void configure(PullCommand pullCommand) {
|
||||||
// we do not want to configure http hooks in this unit test
|
// we do not want to configure http hooks in this unit test
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
package sonia.scm.repository.spi;
|
package sonia.scm.repository.spi;
|
||||||
|
|
||||||
|
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -51,7 +52,7 @@ public class HgModifyCommandTest extends AbstractHgCommandTestBase {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void initHgModifyCommand() {
|
public void initHgModifyCommand() {
|
||||||
SimpleHgWorkingCopyFactory workingCopyFactory = new SimpleHgWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver))) {
|
SimpleHgWorkingCopyFactory workingCopyFactory = new SimpleHgWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver)), new SimpleMeterRegistry()) {
|
||||||
@Override
|
@Override
|
||||||
public void configure(com.aragost.javahg.commands.PullCommand pullCommand) {
|
public void configure(com.aragost.javahg.commands.PullCommand pullCommand) {
|
||||||
// we do not want to configure http hooks in this unit test
|
// we do not want to configure http hooks in this unit test
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
package sonia.scm.repository.spi;
|
package sonia.scm.repository.spi;
|
||||||
|
|
||||||
import com.aragost.javahg.commands.PullCommand;
|
import com.aragost.javahg.commands.PullCommand;
|
||||||
|
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import sonia.scm.repository.Tag;
|
import sonia.scm.repository.Tag;
|
||||||
@@ -44,7 +45,7 @@ public class HgTagCommandTest extends AbstractHgCommandTestBase {
|
|||||||
@Before
|
@Before
|
||||||
public void initWorkingCopyFactory() {
|
public void initWorkingCopyFactory() {
|
||||||
|
|
||||||
workingCopyFactory = new SimpleHgWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver))) {
|
workingCopyFactory = new SimpleHgWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver)), new SimpleMeterRegistry()) {
|
||||||
@Override
|
@Override
|
||||||
public void configure(PullCommand pullCommand) {
|
public void configure(PullCommand pullCommand) {
|
||||||
// we do not want to configure http hooks in this unit test
|
// we do not want to configure http hooks in this unit test
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
package sonia.scm.repository.spi;
|
package sonia.scm.repository.spi;
|
||||||
|
|
||||||
import com.aragost.javahg.Repository;
|
import com.aragost.javahg.Repository;
|
||||||
|
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -53,7 +54,7 @@ public class SimpleHgWorkingCopyFactoryTest extends AbstractHgCommandTestBase {
|
|||||||
@Before
|
@Before
|
||||||
public void bindScmProtocol() throws IOException {
|
public void bindScmProtocol() throws IOException {
|
||||||
workdirProvider = new WorkdirProvider(temporaryFolder.newFolder(), repositoryLocationResolver, false);
|
workdirProvider = new WorkdirProvider(temporaryFolder.newFolder(), repositoryLocationResolver, false);
|
||||||
workingCopyFactory = new SimpleHgWorkingCopyFactory(new SimpleCachingWorkingCopyPool(workdirProvider)) {
|
workingCopyFactory = new SimpleHgWorkingCopyFactory(new SimpleCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry()) {
|
||||||
@Override
|
@Override
|
||||||
public void configure(com.aragost.javahg.commands.PullCommand pullCommand) {
|
public void configure(com.aragost.javahg.commands.PullCommand pullCommand) {
|
||||||
// we do not want to configure http hooks in this unit test
|
// we do not want to configure http hooks in this unit test
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
package sonia.scm.repository.spi;
|
package sonia.scm.repository.spi;
|
||||||
|
|
||||||
|
import io.micrometer.core.instrument.MeterRegistry;
|
||||||
import sonia.scm.repository.SvnWorkingCopyFactory;
|
import sonia.scm.repository.SvnWorkingCopyFactory;
|
||||||
import sonia.scm.repository.work.SimpleWorkingCopyFactory;
|
import sonia.scm.repository.work.SimpleWorkingCopyFactory;
|
||||||
import sonia.scm.repository.work.WorkingCopyPool;
|
import sonia.scm.repository.work.WorkingCopyPool;
|
||||||
@@ -34,8 +35,8 @@ import java.io.File;
|
|||||||
public class SimpleSvnWorkingCopyFactory extends SimpleWorkingCopyFactory<File, File, SvnContext> implements SvnWorkingCopyFactory {
|
public class SimpleSvnWorkingCopyFactory extends SimpleWorkingCopyFactory<File, File, SvnContext> implements SvnWorkingCopyFactory {
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public SimpleSvnWorkingCopyFactory(WorkingCopyPool workingCopyPool) {
|
public SimpleSvnWorkingCopyFactory(WorkingCopyPool workingCopyPool, MeterRegistry meterRegistry) {
|
||||||
super(workingCopyPool);
|
super(workingCopyPool, meterRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
package sonia.scm.repository.spi;
|
package sonia.scm.repository.spi;
|
||||||
|
|
||||||
|
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -54,7 +55,7 @@ public class SimpleSvnWorkingCopyFactoryTest extends AbstractSvnCommandTestBase
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldCheckoutLatestRevision() throws SVNException, IOException {
|
public void shouldCheckoutLatestRevision() throws SVNException, IOException {
|
||||||
SimpleSvnWorkingCopyFactory factory = new SimpleSvnWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider));
|
SimpleSvnWorkingCopyFactory factory = new SimpleSvnWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry());
|
||||||
|
|
||||||
try (WorkingCopy<File, File> workingCopy = factory.createWorkingCopy(createContext(), null)) {
|
try (WorkingCopy<File, File> workingCopy = factory.createWorkingCopy(createContext(), null)) {
|
||||||
assertThat(new File(workingCopy.getWorkingRepository(), "a.txt"))
|
assertThat(new File(workingCopy.getWorkingRepository(), "a.txt"))
|
||||||
@@ -66,7 +67,7 @@ public class SimpleSvnWorkingCopyFactoryTest extends AbstractSvnCommandTestBase
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void cloneFromPoolShouldNotBeReused() {
|
public void cloneFromPoolShouldNotBeReused() {
|
||||||
SimpleSvnWorkingCopyFactory factory = new SimpleSvnWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider));
|
SimpleSvnWorkingCopyFactory factory = new SimpleSvnWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry());
|
||||||
|
|
||||||
File firstDirectory;
|
File firstDirectory;
|
||||||
try (WorkingCopy<File, File> workingCopy = factory.createWorkingCopy(createContext(), null)) {
|
try (WorkingCopy<File, File> workingCopy = factory.createWorkingCopy(createContext(), null)) {
|
||||||
@@ -80,7 +81,7 @@ public class SimpleSvnWorkingCopyFactoryTest extends AbstractSvnCommandTestBase
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldDeleteCloneOnClose() {
|
public void shouldDeleteCloneOnClose() {
|
||||||
SimpleSvnWorkingCopyFactory factory = new SimpleSvnWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider));
|
SimpleSvnWorkingCopyFactory factory = new SimpleSvnWorkingCopyFactory(new NoneCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry());
|
||||||
|
|
||||||
File directory;
|
File directory;
|
||||||
File workingRepository;
|
File workingRepository;
|
||||||
@@ -95,7 +96,7 @@ public class SimpleSvnWorkingCopyFactoryTest extends AbstractSvnCommandTestBase
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldDeleteUntrackedFileOnReclaim() throws IOException {
|
public void shouldDeleteUntrackedFileOnReclaim() throws IOException {
|
||||||
SimpleSvnWorkingCopyFactory factory = new SimpleSvnWorkingCopyFactory(new SimpleCachingWorkingCopyPool(workdirProvider));
|
SimpleSvnWorkingCopyFactory factory = new SimpleSvnWorkingCopyFactory(new SimpleCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry());
|
||||||
|
|
||||||
WorkingCopy<File, File> workingCopy = factory.createWorkingCopy(createContext(), null);
|
WorkingCopy<File, File> workingCopy = factory.createWorkingCopy(createContext(), null);
|
||||||
File directory = workingCopy.getWorkingRepository();
|
File directory = workingCopy.getWorkingRepository();
|
||||||
@@ -113,7 +114,7 @@ public class SimpleSvnWorkingCopyFactoryTest extends AbstractSvnCommandTestBase
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldRestoreDeletedFileOnReclaim() throws IOException {
|
public void shouldRestoreDeletedFileOnReclaim() throws IOException {
|
||||||
SimpleSvnWorkingCopyFactory factory = new SimpleSvnWorkingCopyFactory(new SimpleCachingWorkingCopyPool(workdirProvider));
|
SimpleSvnWorkingCopyFactory factory = new SimpleSvnWorkingCopyFactory(new SimpleCachingWorkingCopyPool(workdirProvider), new SimpleMeterRegistry());
|
||||||
|
|
||||||
WorkingCopy<File, File> workingCopy = factory.createWorkingCopy(createContext(), null);
|
WorkingCopy<File, File> workingCopy = factory.createWorkingCopy(createContext(), null);
|
||||||
File directory = workingCopy.getWorkingRepository();
|
File directory = workingCopy.getWorkingRepository();
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
package sonia.scm.repository.spi;
|
package sonia.scm.repository.spi;
|
||||||
|
|
||||||
|
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
|
||||||
import org.apache.shiro.subject.Subject;
|
import org.apache.shiro.subject.Subject;
|
||||||
import org.apache.shiro.util.ThreadContext;
|
import org.apache.shiro.util.ThreadContext;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
@@ -57,7 +58,7 @@ public class SvnModifyCommandTest extends AbstractSvnCommandTestBase {
|
|||||||
@Before
|
@Before
|
||||||
public void initSvnModifyCommand() {
|
public void initSvnModifyCommand() {
|
||||||
context = createContext();
|
context = createContext();
|
||||||
workingCopyFactory = new SimpleSvnWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(context.getDirectory(), repositoryLocationResolver, false)));
|
workingCopyFactory = new SimpleSvnWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(context.getDirectory(), repositoryLocationResolver, false)), new SimpleMeterRegistry());
|
||||||
svnModifyCommand = new SvnModifyCommand(context, workingCopyFactory);
|
svnModifyCommand = new SvnModifyCommand(context, workingCopyFactory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user