TW-51672 store large files in a mirror repository
authorDmitry Neverov <dmitry.neverov@gmail.com>
Thu, 28 Sep 2017 10:54:30 +0000 (12:54 +0200)
committerDmitry Neverov <dmitry.neverov@gmail.com>
Thu, 28 Sep 2017 10:54:30 +0000 (12:54 +0200)
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/UpdaterImpl.java
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/UpdaterWithAlternates.java

index cc1b13c2c21bb8f5faa7aa980ab32e665e6e4382..cdeb750ef59046fd8374f8670f7ab5962fff34e7 100644 (file)
@@ -171,6 +171,7 @@ public class UpdaterImpl implements Updater {
 
   protected void setupExistingRepository() throws VcsException {
     removeUrlSections();
+    removeLfsStorage();
     disableAlternates();
   }
 
@@ -503,6 +504,24 @@ public class UpdaterImpl implements Updater {
   }
 
 
+  private void removeLfsStorage() throws VcsException {
+    Repository r = null;
+    try {
+      r = new RepositoryBuilder().setWorkTree(myTargetDirectory).build();
+      StoredConfig config = r.getConfig();
+      config.unsetSection("lfs", null);
+      config.save();
+    } catch (IOException e) {
+      String msg = "Error while removing lfs.storage section";
+      LOG.error(msg, e);
+      throw new VcsException(msg, e);
+    } finally {
+      if (r != null)
+        r.close();
+    }
+  }
+
+
   protected void disableAlternates() {
     FileUtil.delete(new File(myTargetDirectory, ".git" + File.separator + "objects" + File.separator + "info" + File.separator + "alternates"));
   }
index 5e3674a3771ea9c16e7189e3f79a36da6bde945b..219de3b798a6e4385682d6d60c700aad6cec2a8c 100644 (file)
@@ -53,12 +53,14 @@ public class UpdaterWithAlternates extends UpdaterWithMirror {
   @Override
   protected void setupExistingRepository() throws VcsException {
     setupAlternates();
+    setupLfsStorage();
   }
 
 
   @Override
   protected void setupNewRepository() throws VcsException {
     setupAlternates();
+    setupLfsStorage();
   }
 
 
@@ -68,6 +70,28 @@ public class UpdaterWithAlternates extends UpdaterWithMirror {
   }
 
 
+  private void setupLfsStorage() throws VcsException {
+    //add lfs.storage = <mirror/lfs>
+    GitFacade git = myGitFactory.create(myTargetDirectory);
+    File mirrorLfs = new File(myRoot.getRepositoryDir(), "lfs");
+    String lfsStorage = git.resolvePath(mirrorLfs);
+    git.setConfig()
+      .setPropertyName("lfs.storage")
+      .setValue(lfsStorage)
+      .call();
+    File checkoutDirLfs = new File(new File(myTargetDirectory, ".git"), "lfs");
+    if (!mirrorLfs.exists() && checkoutDirLfs.isDirectory()) {
+      //If mirror doesn't have lfs storage and checkout dir has one, copy it to
+      //the mirror in order to not fetch lfs files from scratch. This situation occurs
+      //after upgrade to the TC version supporting lfs.storage and after enabling
+      //mirrors in Git VCS root settings.
+      if (!checkoutDirLfs.renameTo(mirrorLfs)) {
+        LOG.info("Failed to move lfs storage to the mirror repository " + mirrorLfs.getAbsoluteFile() + ", large files will be fetched from scratch");
+      }
+    }
+  }
+
+
   private void setupAlternates() throws VcsException {
     File gitDir = new File(myTargetDirectory, ".git");
     if (!gitDir.exists())