TW-57690: now when we load mirrors mapping file we ignore non existing directories...
[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 LOG = 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     final Map<String, File> mappings = myMirrorManager.getMappings();
57     for (Map.Entry<String, File> entry : mappings.entrySet()) {
58       String repository = entry.getKey();
59       File mirror = entry.getValue();
60       if (!repositoriesUsedInBuild.contains(repository)) {
61
62         if (!mirror.isDirectory()) {
63           myMirrorManager.removeMirrorDir(mirror);
64           LOG.debug("Found non existing mirror directory: " + mirror.getAbsolutePath() + ", removed it from the list of mirrors");
65           continue;
66         }
67
68         if (isCleanupEnabled(mirror)) {
69           LOG.debug("Register cleaner for mirror " + mirror.getAbsolutePath());
70           registry.addCleaner(mirror, new Date(myMirrorManager.getLastUsedTime(mirror)));
71         } else {
72           LOG.debug("Clean-up is disabled in " + repository + " (" + mirror.getName() + ")");
73         }
74       }
75     }
76   }
77
78   private Set<String> getRunningBuildRepositories(@NotNull DirectoryCleanersProviderContext context) {
79     Set<String> repositories = new HashSet<String>();
80     for (VcsRootEntry entry : context.getRunningBuild().getVcsRootEntries()) {
81       VcsRoot root = entry.getVcsRoot();
82       if (!Constants.VCS_NAME.equals(root.getVcsName()))
83         continue;
84       try {
85         GitVcsRoot gitRoot = new GitVcsRoot(myMirrorManager, root);
86         String repositoryUrl = gitRoot.getRepositoryFetchURL().toString();
87         LOG.debug("Repository " + repositoryUrl + " is used in the build, its mirror won't be cleaned");
88         repositories.add(gitRoot.getRepositoryFetchURL().toString());
89       } catch (VcsException e) {
90         LOG.warn("Error while creating git root " + root.getName() + ". If the root has a mirror on agent, the mirror might be cleaned", e);
91       }
92     }
93     return repositories;
94   }
95
96   private boolean isCleanupEnabled(@NotNull File gitDir) {
97     Repository repository = null;
98     try {
99       repository = new RepositoryBuilder().setGitDir(gitDir).setBare().build();
100       return repository.getConfig().getBoolean("teamcity", "freeDiskSpaceCleanupEnabled", true);
101     } catch (Exception e) {
102       return true;
103     } finally {
104       if (repository != null) {
105         repository.close();
106       }
107     }
108   }
109 }