<bean class="jetbrains.buildServer.buildTriggers.vcs.git.health.GitGcErrorsHealthPage"/>
<bean class="jetbrains.buildServer.buildTriggers.vcs.git.GitExternalChangeViewerExtension"/>
<bean class="jetbrains.buildServer.buildTriggers.vcs.git.GitTrustStoreProviderBuildServer"/>
+ <bean class="jetbrains.buildServer.buildTriggers.vcs.git.CleanupCustomizer"/>
</beans>
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright 2000-2018 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package jetbrains.buildServer.buildTriggers.vcs.git;
+
+import jetbrains.buildServer.serverSide.ReadOnlyRestrictor;
+import org.jetbrains.annotations.NotNull;
+
+public class CleanupCustomizer {
+
+ public CleanupCustomizer(@NotNull Cleanup cleanup) {
+ cleanup.setCleanupCallWrapper(cleanupRunner -> ReadOnlyRestrictor.doReadOnlyCommandLine(cleanupRunner::run));
+ }
+}
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.Lock;
+import java.util.function.Consumer;
import java.util.regex.Pattern;
public class Cleanup {
private final ServerPluginConfig myConfig;
private final GcErrors myGcErrors;
private final AtomicReference<RunGitError> myNativeGitError = new AtomicReference<>();
+ @NotNull
+ private volatile Consumer<Runnable> myCleanupCallWrapper = Runnable::run;
public Cleanup(@NotNull final ServerPluginConfig config,
@NotNull final RepositoryManager repositoryManager,
try {
LOG.info("Git cleanup started");
- removeUnusedRepositories();
- cleanupMonitoringData();
- if (myConfig.isRunNativeGC()) {
- runNativeGC();
- } else if (myConfig.isRunJGitGC()) {
- runJGitGC();
- }
+ myCleanupCallWrapper.accept(() -> {
+ removeUnusedRepositories();
+ cleanupMonitoringData();
+ if (myConfig.isRunNativeGC()) {
+ runNativeGC();
+ } else if (myConfig.isRunJGitGC()) {
+ runJGitGC();
+ }
+ });
LOG.info("Git cleanup finished");
} finally {
ourSemaphore.release();
}
}
+ public void setCleanupCallWrapper(@NotNull Consumer<Runnable> cleanupCallWrapper) {
+ myCleanupCallWrapper = cleanupCallWrapper;
+ }
+
private void removeUnusedRepositories() {
List<File> unusedDirs = getUnusedDirs();
LOG.debug("Remove unused git repository clones started");
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
+import java.util.concurrent.atomic.AtomicBoolean;
import static jetbrains.buildServer.buildTriggers.vcs.git.tests.GitSupportBuilder.gitSupport;
import static org.assertj.core.api.BDDAssertions.then;
private static final TempFiles ourTempFiles = new TempFiles();
private Cleanup myCleanup;
+ private AtomicBoolean myCleanupCalled;
private GitVcsSupport mySupport;
private RepositoryManager myRepositoryManager;
private ServerPluginConfig myConfig;
myCleanup.run();
+ assertTrue(myCleanupCalled.get());
File[] files = baseMirrorsDir.listFiles(new FileFilter() {
public boolean accept(File f) {
return f.isDirectory();
mySupport = gitBuilder.build();
myRepositoryManager = gitBuilder.getRepositoryManager();
myCleanup = new Cleanup(myConfig, myRepositoryManager, new GcErrors());
+ myCleanupCalled = new AtomicBoolean();
+ myCleanup.setCleanupCallWrapper(cleanup -> {
+ myCleanupCalled.set(true);
+ cleanup.run();
+ });
}