From 4fbd6eaabeed08b86325aa55184253970fe7e4cc Mon Sep 17 00:00:00 2001 From: Winston Li Date: Tue, 4 Aug 2015 21:13:50 +0100 Subject: [PATCH] Fix issue with cloning multiple identical files and add test --- .../ic/wlgitbridge/data/model/DataStore.java | 12 ++--- .../data/model/ResourceFetcher.java | 11 +++- .../WLGitBridgeIntegrationTest.java | 21 ++++++++ .../state/state.json | 50 ++++++++++++++++++ .../state/testproj/main.tex | 1 + .../testproj/overleaf-white-410-copy.png | Bin 0 -> 8786 bytes .../state/testproj/overleaf-white-410.png | Bin 0 -> 8786 bytes .../state/testproj/test.tex | 1 + 8 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/state.json create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/testproj/main.tex create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/testproj/overleaf-white-410-copy.png create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/testproj/overleaf-white-410.png create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/testproj/test.tex diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/DataStore.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/DataStore.java index 6f9e7eb74d..f81b4ddfdb 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/DataStore.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/DataStore.java @@ -4,12 +4,12 @@ import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Repository; -import uk.ac.ic.wlgitbridge.data.filestore.RawFile; import uk.ac.ic.wlgitbridge.data.CandidateSnapshot; import uk.ac.ic.wlgitbridge.data.SnapshotFetcher; import uk.ac.ic.wlgitbridge.data.filestore.GitDirectoryContents; -import uk.ac.ic.wlgitbridge.data.model.db.PersistentStore; import uk.ac.ic.wlgitbridge.data.filestore.RawDirectory; +import uk.ac.ic.wlgitbridge.data.filestore.RawFile; +import uk.ac.ic.wlgitbridge.data.model.db.PersistentStore; import uk.ac.ic.wlgitbridge.snapshot.exception.FailedConnectionException; import uk.ac.ic.wlgitbridge.snapshot.getforversion.SnapshotAttachment; import uk.ac.ic.wlgitbridge.snapshot.push.exception.SnapshotPostException; @@ -17,10 +17,7 @@ import uk.ac.ic.wlgitbridge.util.Util; import java.io.File; import java.io.IOException; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; -import java.util.TimeZone; +import java.util.*; /** * Created by Winston on 06/11/14. @@ -55,8 +52,9 @@ public class DataStore { for (Snapshot snapshot : snapshots) { List files = new LinkedList(); files.addAll(snapshot.getSrcs()); + Map fetchedUrls = new HashMap(); for (SnapshotAttachment snapshotAttachment : snapshot.getAtts()) { - files.add(resourceFetcher.get(name, snapshotAttachment.getUrl(), snapshotAttachment.getPath(), repository)); + files.add(resourceFetcher.get(name, snapshotAttachment.getUrl(), snapshotAttachment.getPath(), repository, fetchedUrls)); } commit(name, new GitDirectoryContents(files, rootGitDirectory, name, snapshot), repository); } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcher.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcher.java index 4ec8627734..e3f1115651 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcher.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/data/model/ResourceFetcher.java @@ -14,6 +14,7 @@ import uk.ac.ic.wlgitbridge.util.Util; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.util.Map; import java.util.concurrent.ExecutionException; /** @@ -27,16 +28,22 @@ public class ResourceFetcher { this.persistentStore = persistentStore; } - public RawFile get(String projectName, String url, String newPath, Repository repository) throws IOException { + public RawFile get(String projectName, String url, String newPath, Repository repository, Map fetchedUrls) throws IOException { String path = persistentStore.getPathForURLInProject(projectName, url); byte[] contents; if (path == null) { path = newPath; contents = fetch(projectName, url, path); + fetchedUrls.put(url, contents); } else { Util.sout("Found (" + projectName + "): " + url); Util.sout("At (" + projectName + "): " + path); - contents = new RepositoryObjectTreeWalker(repository).getDirectoryContents().getFileTable().get(path).getContents(); + RawFile rawFile = new RepositoryObjectTreeWalker(repository).getDirectoryContents().getFileTable().get(path); + if (rawFile != null) { + contents = rawFile.getContents(); + } else { + contents = fetchedUrls.get(url); + } } return new RepositoryFile(newPath, contents); } diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest.java index 8fe9e36b24..b47f7fba33 100644 --- a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest.java +++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest.java @@ -60,6 +60,9 @@ public class WLGitBridgeIntegrationTest { put("base", new SnapshotAPIStateBuilder(getResourceAsStream("/canPullADuplicateBinaryFile/base/state.json")).build()); put("withDuplicateBinaryFile", new SnapshotAPIStateBuilder(getResourceAsStream("/canPullADuplicateBinaryFile/withDuplicateBinaryFile/state.json")).build()); }}); + put("canCloneDuplicateBinaryFiles", new HashMap() {{ + put("state", new SnapshotAPIStateBuilder(getResourceAsStream("/canCloneDuplicateBinaryFiles/state/state.json")).build()); + }}); put("canPullAModifiedNestedFile", new HashMap() {{ put("base", new SnapshotAPIStateBuilder(getResourceAsStream("/canPullAModifiedNestedFile/base/state.json")).build()); put("withModifiedNestedFile", new SnapshotAPIStateBuilder(getResourceAsStream("/canPullAModifiedNestedFile/withModifiedNestedFile/state.json")).build()); @@ -273,6 +276,24 @@ public class WLGitBridgeIntegrationTest { assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canPullADuplicateBinaryFile/withDuplicateBinaryFile/testproj"), testprojDir.toPath())); } + @Test + public void canCloneDuplicateBinaryFiles() throws IOException, GitAPIException, InterruptedException { + MockSnapshotServer server = new MockSnapshotServer(4002, getResource("/canCloneDuplicateBinaryFiles").toFile()); + server.start(); + server.setState(states.get("canCloneDuplicateBinaryFiles").get("state")); + GitBridgeApp wlgb = new GitBridgeApp(new String[] { + makeConfigFile(44002, 4002) + }); + wlgb.run(); + File dir = folder.newFolder(); + Process git = runtime.exec("git clone http://127.0.0.1:44002/testproj.git", null, dir); + int exitCode = git.waitFor(); + wlgb.stop(); + File testprojDir = new File(dir, "testproj"); + assertEquals(0, exitCode); + assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canCloneDuplicateBinaryFiles/state/testproj"), testprojDir.toPath())); + } + @Test public void canPullAModifiedNestedFile() throws IOException, GitAPIException, InterruptedException { MockSnapshotServer server = new MockSnapshotServer(3864, getResource("/canPullAModifiedNestedFile").toFile()); diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/state.json b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/state.json new file mode 100644 index 0000000000..3f047d32e8 --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/state.json @@ -0,0 +1,50 @@ +[ + { + "project": "testproj", + "getDoc": { + "versionID": 1, + "createdAt": "2014-11-30T18:40:58.123Z", + "email": "jdleesmiller+1@gmail.com", + "name": "John+1" + }, + "getSavedVers": [ + { + "versionID": 1, + "comment": "added more info on doc GET and error details", + "email": "jdleesmiller+1@gmail.com", + "name": "John+1", + "createdAt": "2014-11-30T18:47:01.456Z" + } + ], + "getForVers": [ + { + "versionID": 1, + "srcs": [ + { + "content": "content\n", + "path": "main.tex" + }, + { + "content": "This text is from another file.", + "path": "test.tex" + } + ], + "atts": [ + { + "url": "http://127.0.0.1:4002/state/testproj/overleaf-white-410.png", + "path": "overleaf-white-410-copy.png" + }, + { + "url": "http://127.0.0.1:4002/state/testproj/overleaf-white-410.png", + "path": "overleaf-white-410.png" + } + ] + } + ], + "push": "success", + "postback": { + "type": "success", + "versionID": 2 + } + } +] diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/testproj/main.tex b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/testproj/main.tex new file mode 100644 index 0000000000..d95f3ad14d --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/testproj/main.tex @@ -0,0 +1 @@ +content diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/testproj/overleaf-white-410-copy.png b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/testproj/overleaf-white-410-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..6a23d10c15d3eb7fcb18609be0bc4bf0706eca49 GIT binary patch literal 8786 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 literal 0 HcmV?d00001 diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/testproj/overleaf-white-410.png b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/testproj/overleaf-white-410.png new file mode 100644 index 0000000000000000000000000000000000000000..6a23d10c15d3eb7fcb18609be0bc4bf0706eca49 GIT binary patch literal 8786 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 literal 0 HcmV?d00001 diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/testproj/test.tex b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/testproj/test.tex new file mode 100644 index 0000000000..046794f19a --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneDuplicateBinaryFiles/state/testproj/test.tex @@ -0,0 +1 @@ +This text is from another file. \ No newline at end of file