6fa57b06f8eb464a6be5c8518cc7f43363eab9dc
[teamcity/git-plugin.git] / git-agent / src / jetbrains / buildServer / buildTriggers / vcs / git / agent / AgentMirrorCleaner.java
1 /*
2  * Copyright 2000-2018 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package jetbrains.buildServer.buildTriggers.vcs.git.agent;
18
19 import com.intellij.openapi.diagnostic.Logger;
20 import jetbrains.buildServer.agent.DirectoryCleanersProvider;
21 import jetbrains.buildServer.agent.DirectoryCleanersProviderContext;
22 import jetbrains.buildServer.agent.DirectoryCleanersRegistry;
23 import jetbrains.buildServer.buildTriggers.vcs.git.Constants;
24 import jetbrains.buildServer.buildTriggers.vcs.git.GitVcsRoot;
25 import jetbrains.buildServer.buildTriggers.vcs.git.MirrorManager;
26 import jetbrains.buildServer.vcs.VcsException;
27 import jetbrains.buildServer.vcs.VcsRoot;
28 import jetbrains.buildServer.vcs.VcsRootEntry;
29 import org.eclipse.jgit.lib.Repository;
30 import org.eclipse.jgit.lib.RepositoryBuilder;
31 import org.jetbrains.annotations.NotNull;
32
33 import java.io.File;
34 import java.util.Date;
35 import java.util.HashSet;
36 import java.util.Map;
37 import java.util.Set;
38
39 public class AgentMirrorCleaner implements DirectoryCleanersProvider {
40
41   private final static Logger ourLog = Logger.getInstance(AgentMirrorCleaner.class.getName());
42   private final MirrorManager myMirrorManager;
43
44   public AgentMirrorCleaner(@NotNull MirrorManager mirrorManager) {
45     myMirrorManager = mirrorManager;
46   }
47
48   @NotNull
49   public String getCleanerName() {
50     return "Git mirrors cleaner";
51   }
52
53   public void registerDirectoryCleaners(@NotNull DirectoryCleanersProviderContext context,
54                                         @NotNull DirectoryCleanersRegistry registry) {
55     Set<String> repositoriesUsedInBuild = getRunningBuildRepositories(context);
56     for (Map.Entry<String, File> entry : myMirrorManager.getMappings().entrySet()) {
57       String repository = entry.getKey();
58       File mirror = entry.getValue();
59       if (!repositoriesUsedInBuild.contains(repository)) {
60         if (isCleanupEnabled(mirror)) {
61           ourLog.debug("Register cleaner for mirror " + mirror.getAbsolutePath());
62           registry.addCleaner(mirror, new Date(myMirrorManager.getLastUsedTime(mirror)));
63         } else {
64           ourLog.debug("Clean-up is disabled in " + repository + " (" + mirror.getName() + ")");
65         }
66       }
67     }
68   }
69
70   private Set<String> getRunningBuildRepositories(@NotNull DirectoryCleanersProviderContext context) {
71     Set<String> repositories = new HashSet<String>();
72     for (VcsRootEntry entry : context.getRunningBuild().getVcsRootEntries()) {
73       VcsRoot root = entry.getVcsRoot();
74       if (!Constants.VCS_NAME.equals(root.getVcsName()))
75         continue;
76       try {
77         GitVcsRoot gitRoot = new GitVcsRoot(myMirrorManager, root);
78         String repositoryUrl = gitRoot.getRepositoryFetchURL().toString();
79         ourLog.debug("Repository " + repositoryUrl + " is used in the build, its mirror won't be cleaned");
80         repositories.add(gitRoot.getRepositoryFetchURL().toString());
81       } catch (VcsException e) {
82         ourLog.warn("Error while creating git root " + root.getName() + ". If the root has a mirror on agent, the mirror might be cleaned", e);
83       }
84     }
85     return repositories;
86   }
87
88   private boolean isCleanupEnabled(@NotNull File gitDir) {
89     Repository repository = null;
90     try {
91       repository = new RepositoryBuilder().setGitDir(gitDir).setBare().build();
92       return repository.getConfig().getBoolean("teamcity", "freeDiskSpaceCleanupEnabled", true);
93     } catch (Exception e) {
94       return true;
95     } finally {
96       if (repository != null) {
97         repository.close();
98       }
99     }
100   }
101 }