Show url of the repository where 'git gc' failed
authorDmitry Neverov <dmitry.neverov@gmail.com>
Mon, 19 Jun 2017 15:22:02 +0000 (17:22 +0200)
committerDmitry Neverov <dmitry.neverov@gmail.com>
Mon, 19 Jun 2017 15:22:02 +0000 (17:22 +0200)
git-common/src/jetbrains/buildServer/buildTriggers/vcs/git/MirrorManager.java
git-common/src/jetbrains/buildServer/buildTriggers/vcs/git/MirrorManagerImpl.java
git-server-tc/src/jetbrains/buildServer/buildTriggers/vcs/git/health/GitGcErrorsHealthPage.java
git-server/resources/buildServerResources/health/gitGcErrorsReport.jsp
git-server/src/jetbrains/buildServer/buildTriggers/vcs/git/RepositoryManagerImpl.java

index d9c3eaf248b85bc0373c2b360d06bd15c46fd94c..32761f63fc9ca1622fe28e5a4cd40d5992e221db 100644 (file)
@@ -17,6 +17,7 @@
 package jetbrains.buildServer.buildTriggers.vcs.git;
 
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.io.File;
 import java.util.Map;
@@ -31,7 +32,7 @@ public interface MirrorManager {
    * @return parent dir of local repositories
    */
   @NotNull
-  public File getBaseMirrorsDir();
+  File getBaseMirrorsDir();
 
   /**
    * Get default directory for remote repository with specified url
@@ -39,17 +40,27 @@ public interface MirrorManager {
    * @return see above
    */
   @NotNull
-  public File getMirrorDir(@NotNull String repositoryUrl);
+  File getMirrorDir(@NotNull String repositoryUrl);
 
   /**
    * Mark dir as invalid, urls mapped to this dir will get another mapping
    * on subsequent call to getMirrorDir()
    * @param dir dir of interest
    */
-  public void invalidate(@NotNull File dir);
+  void invalidate(@NotNull File dir);
 
 
-  public Map<String, File> getMappings();
+  @NotNull
+  Map<String, File> getMappings();
+
+  long getLastUsedTime(@NotNull final File dir);
 
-  public long getLastUsedTime(@NotNull final File dir);
+  /**
+   * Returns url for the given clone directory name inside the baseMirrorsDir
+   * or null if mapping from the url is not found
+   * @param cloneDirName clone directory name of interest
+   * @return see above
+   */
+  @Nullable
+  String getUrl(@NotNull String cloneDirName);
 }
index a29305022c2792c840baabc95d3700413320c0e4..dd4b71898afe0fe02801e67f3226d4719db761b7 100644 (file)
@@ -81,6 +81,7 @@ public class MirrorManagerImpl implements MirrorManager {
   }
 
 
+  @NotNull
   public Map<String, File> getMappings() {
     Map<String, String> mirrorMapSnapshot;
     synchronized (myLock) {
@@ -95,6 +96,19 @@ public class MirrorManagerImpl implements MirrorManager {
     return result;
   }
 
+  @Nullable
+  @Override
+  public String getUrl(@NotNull String cloneDirName) {
+    Map<String, String> mirrorMapSnapshot;
+    synchronized (myLock) {
+      mirrorMapSnapshot = new HashMap<String, String>(myMirrorMap);
+    }
+    for (Map.Entry<String, String> e : mirrorMapSnapshot.entrySet()) {
+      if (cloneDirName.equals(e.getValue()))
+        return e.getKey();
+    }
+    return null;
+  }
 
   public long getLastUsedTime(@NotNull final File dir) {
     File timestamp = new File(dir, "timestamp");
index e9e1813e18d2e168edf7b66c656b3013dfae247e..283c52689a162af1726c85b7e08671658883ab77 100644 (file)
@@ -17,6 +17,8 @@
 package jetbrains.buildServer.buildTriggers.vcs.git.health;
 
 import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.util.Pair;
+import jetbrains.buildServer.buildTriggers.vcs.git.MirrorManager;
 import jetbrains.buildServer.serverSide.ServerPaths;
 import jetbrains.buildServer.serverSide.auth.Permission;
 import jetbrains.buildServer.serverSide.healthStatus.HealthStatusItem;
@@ -38,12 +40,15 @@ public class GitGcErrorsHealthPage extends HealthStatusItemPageExtension {
 
   private static final Logger LOG = Logger.getInstance(GitGcErrorsHealthPage.class.getName());
   private final ServerPaths myServerPaths;
+  private final MirrorManager myMirrorManager;
 
   public GitGcErrorsHealthPage(@NotNull PluginDescriptor pluginDescriptor,
                                @NotNull PagePlaces pagePlaces,
-                               @NotNull ServerPaths serverPaths) {
+                               @NotNull ServerPaths serverPaths,
+                               @NotNull MirrorManager mirrorManager) {
     super(GitGcErrorsHealthReport.REPORT_TYPE, pagePlaces);
     myServerPaths = serverPaths;
+    myMirrorManager = mirrorManager;
     setIncludeUrl(pluginDescriptor.getPluginResourcesPath("health/gitGcErrorsReport.jsp"));
     setVisibleOutsideAdminArea(false);
     register();
@@ -63,7 +68,7 @@ public class GitGcErrorsHealthPage extends HealthStatusItemPageExtension {
   public void fillModel(@NotNull final Map<String, Object> model, @NotNull final HttpServletRequest request) {
     HealthStatusItem item = getStatusItem(request);
     Object errors = item.getAdditionalData().get(GitGcErrorsHealthReport.ERRORS_KEY);
-    Map<String, String> sortedErrors = new TreeMap<>();
+    Map<String, Pair<String, String>> sortedErrors = new TreeMap<>();
     if (errors instanceof Map) {
       String baseDir;
       try {
@@ -80,7 +85,10 @@ public class GitGcErrorsHealthPage extends HealthStatusItemPageExtension {
         if (key instanceof File && value instanceof String) {
           try {
             String relativePath = FileUtil.getRelativePath(baseDir, ((File)key).getCanonicalPath(), File.separatorChar);
-            sortedErrors.put(relativePath, (String) value);
+            String url = myMirrorManager.getUrl(relativePath);
+            if (url != null) {
+              sortedErrors.put(url, Pair.create(relativePath, (String) value));
+            }
           } catch (IOException e) {
             LOG.warnAndDebugDetails("Error while preparing health report data", e);
           }
index 4e1af2592b22dbd0d2c591dd084c73a913340b2e..66fadba8b798e24eb642855f054af05f1b539288 100644 (file)
@@ -12,7 +12,7 @@
 <div id="${errorsBlockId}" style="margin-left: 1em; display: ${showMode == inplaceMode ? 'none' : ''}">
   <c:forEach var="error" items="${errors}">
     <div>
-      <b><c:out value="${error.key}"/></b>: <c:out value="${error.value}"/>
+      <b><c:out value="${error.key}"/></b> (clone dir <c:out value="${error.value.first}"/>): <c:out value="${error.value.second}"/>
     </div>
   </c:forEach>
 </div>
index 6967712c1167f52dd4a1a2d443b1dc9142c3299c..fbcb47304fe393f0514eaf0b1e9e8d643787bef1 100644 (file)
@@ -24,6 +24,7 @@ import org.eclipse.jgit.lib.RepositoryCache;
 import org.eclipse.jgit.transport.URIish;
 import org.eclipse.jgit.util.FS;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.io.File;
 import java.io.IOException;
@@ -100,10 +101,17 @@ public final class RepositoryManagerImpl implements RepositoryManager {
   }
 
 
+  @NotNull
   public Map<String, File> getMappings() {
     return myMirrorManager.getMappings();
   }
 
+  @Nullable
+  @Override
+  public String getUrl(@NotNull String cloneDirName) {
+    return myMirrorManager.getUrl(cloneDirName);
+  }
+
   @NotNull
   public List<File> getExpiredDirs() {
     long now = System.currentTimeMillis();