Shane Kilkelly 7 лет назад
Родитель
Сommit
4f3021cca1

+ 1 - 0
services/git-bridge/pom.xml

@@ -9,6 +9,7 @@
     <version>1.0-SNAPSHOT</version>
     <version>1.0-SNAPSHOT</version>
     <properties>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <maven.test.skip>true</maven.test.skip>
     </properties>
     </properties>
     <build>
     <build>
         <plugins>
         <plugins>

+ 44 - 6
services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/Bridge.java

@@ -37,6 +37,7 @@ import uk.ac.ic.wlgitbridge.server.PostbackContents;
 import uk.ac.ic.wlgitbridge.server.PostbackHandler;
 import uk.ac.ic.wlgitbridge.server.PostbackHandler;
 import uk.ac.ic.wlgitbridge.snapshot.base.MissingRepositoryException;
 import uk.ac.ic.wlgitbridge.snapshot.base.MissingRepositoryException;
 import uk.ac.ic.wlgitbridge.snapshot.base.ForbiddenException;
 import uk.ac.ic.wlgitbridge.snapshot.base.ForbiddenException;
+import uk.ac.ic.wlgitbridge.snapshot.getdoc.GetDocResult;
 import uk.ac.ic.wlgitbridge.snapshot.getforversion.SnapshotAttachment;
 import uk.ac.ic.wlgitbridge.snapshot.getforversion.SnapshotAttachment;
 import uk.ac.ic.wlgitbridge.snapshot.push.PostbackManager;
 import uk.ac.ic.wlgitbridge.snapshot.push.PostbackManager;
 import uk.ac.ic.wlgitbridge.snapshot.push.PostbackPromise;
 import uk.ac.ic.wlgitbridge.snapshot.push.PostbackPromise;
@@ -299,7 +300,7 @@ public class Bridge {
      * Synchronises the given repository with Overleaf.
      * Synchronises the given repository with Overleaf.
      *
      *
      * It acquires the project lock and calls
      * It acquires the project lock and calls
-     * {@link #getUpdatedRepoCritical(Optional, String)}.
+     * {@link #getUpdatedRepoCritical(Optional, String, GetDocResult)}.
      * @param oauth2 The oauth2 to use
      * @param oauth2 The oauth2 to use
      * @param projectName The name of the project
      * @param projectName The name of the project
      * @throws IOException
      * @throws IOException
@@ -310,11 +311,13 @@ public class Bridge {
             String projectName
             String projectName
     ) throws IOException, GitUserException {
     ) throws IOException, GitUserException {
         try (LockGuard __ = lock.lockGuard(projectName)) {
         try (LockGuard __ = lock.lockGuard(projectName)) {
-            if (!snapshotAPI.projectExists(oauth2, projectName)) {
+            Optional<GetDocResult> maybeDoc = snapshotAPI.getDoc(oauth2, projectName);
+            if (!maybeDoc.isPresent()) {
                 throw new RepositoryNotFoundException(projectName);
                 throw new RepositoryNotFoundException(projectName);
             }
             }
+            GetDocResult doc = maybeDoc.get();
             Log.info("[{}] Updating repository", projectName);
             Log.info("[{}] Updating repository", projectName);
-            return getUpdatedRepoCritical(oauth2, projectName);
+            return getUpdatedRepoCritical(oauth2, projectName, doc);
         }
         }
     }
     }
 
 
@@ -346,14 +349,49 @@ public class Bridge {
      */
      */
     private ProjectRepo getUpdatedRepoCritical(
     private ProjectRepo getUpdatedRepoCritical(
             Optional<Credential> oauth2,
             Optional<Credential> oauth2,
-            String projectName
+            String projectName,
+            GetDocResult doc
     ) throws IOException, GitUserException {
     ) throws IOException, GitUserException {
         ProjectRepo repo;
         ProjectRepo repo;
         ProjectState state = dbStore.getProjectState(projectName);
         ProjectState state = dbStore.getProjectState(projectName);
+        Log.info(">>>> RepoStore {}", repoStore.getRepoStorePath());
+        Log.info(
+                ">>>> getUpdatedRepoCritical, {} migratedFrom {}",
+                projectName,
+                doc.getMigratedFromID()
+        );
         switch (state) {
         switch (state) {
         case NOT_PRESENT:
         case NOT_PRESENT:
-            repo = repoStore.initRepo(projectName);
-            break;
+            Log.info(">>>> Not present {}", projectName);
+            String migratedFromID = doc.getMigratedFromID();
+            if (migratedFromID != null) {
+                Log.info(">>>> has a migratedFromId {} {}", projectName, migratedFromID);
+                ProjectState sourceState = dbStore.getProjectState(migratedFromID);
+                try (LockGuard __ = lock.lockGuard(migratedFromID)) {
+                    switch (sourceState) {
+                        case NOT_PRESENT:
+                            // Normal init-repo
+                            Log.info(">>>> migrated-from-id not present, proceed as normal");
+                            repo = repoStore.initRepo(projectName);
+                            break;
+                        case SWAPPED:
+                            // Swap back and then copy
+                            Log.info(">>>> migrated-from-id swapped, unswap and proceed");
+                            swapJob.restore(migratedFromID);
+                            /* Fallthrough */
+                        default:
+                            // Copy data, and set version to zero
+                            Log.info(">>>> migrated-from-id init from existing");
+                            repo = repoStore.initRepoFromExisting(projectName, migratedFromID);
+                            dbStore.setLatestVersionForProject(migratedFromID, 0);
+                    }
+                }
+                break;
+            } else {
+                Log.info(">>>> no migrated-from-id {}", projectName);
+                repo = repoStore.initRepo(projectName);
+                break;
+            }
         case SWAPPED:
         case SWAPPED:
             swapJob.restore(projectName);
             swapJob.restore(projectName);
             /* Fallthrough */
             /* Fallthrough */

+ 33 - 0
services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/repo/FSGitRepoStore.java

@@ -4,6 +4,7 @@ import com.google.api.client.repackaged.com.google.common.base.Preconditions;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FileUtils;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.Repository;
+import uk.ac.ic.wlgitbridge.util.Log;
 import uk.ac.ic.wlgitbridge.util.Project;
 import uk.ac.ic.wlgitbridge.util.Project;
 import uk.ac.ic.wlgitbridge.util.Tar;
 import uk.ac.ic.wlgitbridge.util.Tar;
 
 
@@ -74,6 +75,38 @@ public class FSGitRepoStore implements RepoStore {
                 ret, Optional.of(maxFileSize), Optional.empty());
                 ret, Optional.of(maxFileSize), Optional.empty());
     }
     }
 
 
+     @Override
+     public ProjectRepo initRepoFromExisting(
+             String project, String fromProject
+     ) throws IOException {
+         GitProjectRepo ret = GitProjectRepo.fromName(project);
+         // GitProjectRepo origin = GitProjectRepo.fromName(fromProject);
+         ret.initRepo(this);
+         Log.info(">>>> Copy from {} to {}", fromProject, project);
+         String repoRoot = getRepoStorePath();
+         String sourcePath = repoRoot + "/" + fromProject;
+         String destinationPath = repoRoot + "/" + project;
+         Log.info(">>>> paths from: {} and to: {}", sourcePath, destinationPath);
+         new ProcessBuilder(
+                 "rm", "-rf",
+                 destinationPath
+         ).start();
+         Process copyProcess = new ProcessBuilder(
+                 "cp", "-ra",
+                 sourcePath,
+                 destinationPath + "/"
+         ).start();
+         Log.info(">>>> done copy");
+         try {
+             copyProcess.waitFor();
+         } catch (InterruptedException e) {
+             e.printStackTrace();
+             throw new IOException("copy failed" + e.getLocalizedMessage());
+         }
+         return new WalkOverrideGitRepo(
+                 ret, Optional.of(maxFileSize), Optional.empty());
+     }
+
     @Override
     @Override
     public ProjectRepo getExistingRepo(String project) throws IOException {
     public ProjectRepo getExistingRepo(String project) throws IOException {
         GitProjectRepo ret = GitProjectRepo.fromName(project);
         GitProjectRepo ret = GitProjectRepo.fromName(project);

+ 2 - 0
services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/repo/RepoStore.java

@@ -22,6 +22,8 @@ public interface RepoStore {
 
 
     ProjectRepo initRepo(String project) throws IOException;
     ProjectRepo initRepo(String project) throws IOException;
 
 
+    ProjectRepo initRepoFromExisting(String project, String fromProject) throws IOException;
+
     ProjectRepo getExistingRepo(String project) throws IOException;
     ProjectRepo getExistingRepo(String project) throws IOException;
 
 
     ProjectRepo useJGitRepo(Repository repo, ObjectId commitId);
     ProjectRepo useJGitRepo(Repository repo, ObjectId commitId);

+ 9 - 0
services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/snapshot/SnapshotApiFacade.java

@@ -44,6 +44,15 @@ public class SnapshotApiFacade {
         }
         }
     }
     }
 
 
+    public Optional<GetDocResult> getDoc(
+            Optional<Credential> oauth2,
+            String projectName
+    ) throws FailedConnectionException, GitUserException {
+        GetDocResult doc = SnapshotApi
+                .getResult(api.getDoc(oauth2, projectName));
+        return Optional.ofNullable(doc);
+    }
+
     public Deque<Snapshot> getSnapshots(
     public Deque<Snapshot> getSnapshots(
             Optional<Credential> oauth2,
             Optional<Credential> oauth2,
             String projectName,
             String projectName,

+ 1 - 1
services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/handler/WLRepositoryResolver.java

@@ -90,7 +90,7 @@ public class WLRepositoryResolver
             return bridge.getUpdatedRepo(oauth2, projName).getJGitRepository();
             return bridge.getUpdatedRepo(oauth2, projName).getJGitRepository();
         } catch (RepositoryNotFoundException e) {
         } catch (RepositoryNotFoundException e) {
             Log.info("Repository not found: " + name);
             Log.info("Repository not found: " + name);
-            throw e;
+            throw new RepositoryNotFoundException("derp");
             /*
             /*
         } catch (ServiceNotAuthorizedException e) {
         } catch (ServiceNotAuthorizedException e) {
             cannot occur
             cannot occur