From ba8ba001d61f3ea45e9fe7e9817c4517d5b3f305 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Wed, 9 Jan 2019 12:23:00 +0000 Subject: [PATCH 1/4] Fetch snapshots in edge-case where version-id is zero --- .../uk/ac/ic/wlgitbridge/bridge/snapshot/SnapshotApiFacade.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/snapshot/SnapshotApiFacade.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/snapshot/SnapshotApiFacade.java index 9bbcf09142..6f07b7e924 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/snapshot/SnapshotApiFacade.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/snapshot/SnapshotApiFacade.java @@ -97,7 +97,7 @@ public class SnapshotApiFacade { = api.getSavedVers(oauth2, projectName); GetDocResult latestDoc = SnapshotApi.getResult(getDoc); int latest = latestDoc.getVersionID(); - if (latest > version) { + if (latest > version || (latest == 0 && version == 0)) { for ( SnapshotInfo snapshotInfo : SnapshotApi.getResult(savedVers).getSavedVers() From b8d252244c5712d105d7e06e7bc8deeb7f399a98 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Wed, 9 Jan 2019 12:23:26 +0000 Subject: [PATCH 2/4] Tolerate case where there is no latest version timestamp in version info --- .../uk/ac/ic/wlgitbridge/snapshot/getdoc/GetDocResult.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/getdoc/GetDocResult.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/getdoc/GetDocResult.java index 3fafb394f0..f95a5c6619 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/getdoc/GetDocResult.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/getdoc/GetDocResult.java @@ -98,7 +98,11 @@ public class GetDocResult extends Result { } } else { versionID = jsonObject.get("latestVerId").getAsInt(); - createdAt = jsonObject.get("latestVerAt").getAsString(); + if (jsonObject.has("latestVerAt")) { + createdAt = jsonObject.get("latestVerAt").getAsString(); + } else { + createdAt = null; + } if (jsonObject.has("migratedFromId")) { migratedFromID = jsonObject.get("migratedFromId").getAsString(); } else { From 4f1168a590c8cd9767e3baa764490e5f1f48fb7c Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Wed, 9 Jan 2019 14:24:04 +0000 Subject: [PATCH 3/4] Add comments pointing to github issue --- .../ac/ic/wlgitbridge/bridge/snapshot/SnapshotApiFacade.java | 3 +++ .../uk/ac/ic/wlgitbridge/snapshot/getdoc/GetDocResult.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/snapshot/SnapshotApiFacade.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/snapshot/SnapshotApiFacade.java index 6f07b7e924..9aa3165e06 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/snapshot/SnapshotApiFacade.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/snapshot/SnapshotApiFacade.java @@ -97,6 +97,9 @@ public class SnapshotApiFacade { = api.getSavedVers(oauth2, projectName); GetDocResult latestDoc = SnapshotApi.getResult(getDoc); int latest = latestDoc.getVersionID(); + // Handle edge-case for projects with no changes, that were imported + // to v2. In which case both `latest` and `version` will be zero. + // See: https://github.com/overleaf/writelatex-git-bridge/pull/50 if (latest > version || (latest == 0 && version == 0)) { for ( SnapshotInfo snapshotInfo : diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/getdoc/GetDocResult.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/getdoc/GetDocResult.java index f95a5c6619..bfb659769a 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/getdoc/GetDocResult.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/getdoc/GetDocResult.java @@ -98,6 +98,9 @@ public class GetDocResult extends Result { } } else { versionID = jsonObject.get("latestVerId").getAsInt(); + // Handle edge-case for projects with no changes, that were imported + // to v2. In which case `latestVerAt` will not be present. + // See: https://github.com/overleaf/writelatex-git-bridge/pull/50 if (jsonObject.has("latestVerAt")) { createdAt = jsonObject.get("latestVerAt").getAsString(); } else { From 4dc140aced66233ec81b203c48a10000b6c735d7 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Thu, 10 Jan 2019 10:21:31 +0000 Subject: [PATCH 4/4] Add integration test to cover imported-but-not-changed projects --- .../state/SnapshotAPIStateBuilder.java | 21 +++++++++++--- .../WLGitBridgeIntegrationTest.java | 19 ++++++++++++ .../state/state.json | 29 +++++++++++++++++++ .../state/testproj_no_change/main.tex | 1 + 4 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneAMigratedRepositoryWithoutChanges/state/state.json create mode 100644 services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneAMigratedRepositoryWithoutChanges/state/testproj_no_change/main.tex diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/state/SnapshotAPIStateBuilder.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/state/SnapshotAPIStateBuilder.java index 179985f1ea..502a67aaa8 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/state/SnapshotAPIStateBuilder.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/state/SnapshotAPIStateBuilder.java @@ -83,7 +83,20 @@ public class SnapshotAPIStateBuilder { String projectName, JsonObject jsonGetDoc ) { + int versionID = jsonGetDoc.get("versionID").getAsInt(); + String createdAt = null; + String email = null; + String name = null; String migratedFromId = null; + if (jsonGetDoc.has("createdAt")) { + createdAt = jsonGetDoc.get("createdAt").getAsString(); + } + if (jsonGetDoc.has("email")) { + email = jsonGetDoc.get("email").getAsString(); + } + if (jsonGetDoc.has("name")) { + name = jsonGetDoc.get("name").getAsString(); + } if (jsonGetDoc.has("migratedFromId")) { migratedFromId = jsonGetDoc.get("migratedFromId").getAsString(); } @@ -91,10 +104,10 @@ public class SnapshotAPIStateBuilder { projectName, new GetDocResult( jsonGetDoc.get("error"), - jsonGetDoc.get("versionID").getAsInt(), - jsonGetDoc.get("createdAt").getAsString(), - jsonGetDoc.get("email").getAsString(), - jsonGetDoc.get("name").getAsString(), + versionID, + createdAt, + email, + name, migratedFromId ) ); diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java index 1c3f7f9950..941be6f9e3 100644 --- a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java +++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java @@ -123,6 +123,9 @@ public class WLGitBridgeIntegrationTest { put("skipMigrationWhenMigratedFromMissing", new HashMap() {{ put("state", new SnapshotAPIStateBuilder(getResourceAsStream("/skipMigrationWhenMigratedFromMissing/state/state.json")).build()); }}); + put("canCloneAMigratedRepositoryWithoutChanges", new HashMap() {{ + put("state", new SnapshotAPIStateBuilder(getResourceAsStream("/canCloneAMigratedRepositoryWithoutChanges/state/state.json")).build()); + }}); }}; @Rule @@ -830,6 +833,22 @@ public class WLGitBridgeIntegrationTest { assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/skipMigrationWhenMigratedFromMissing/state/testproj2"), testprojDir2.toPath())); } + @Test + public void canCloneAMigratedRepositoryWithoutChanges() throws IOException, GitAPIException, InterruptedException { + int gitBridgePort = 33883; + int mockServerPort = 3883; + MockSnapshotServer server = new MockSnapshotServer(mockServerPort, getResource("/canCloneAMigratedRepositoryWithoutChanges").toFile()); + server.start(); + server.setState(states.get("canCloneAMigratedRepositoryWithoutChanges").get("state")); + GitBridgeApp wlgb = new GitBridgeApp(new String[] { + makeConfigFile(gitBridgePort, mockServerPort) + }); + wlgb.run(); + File testprojDir = gitClone("testproj_no_change", gitBridgePort, dir); + wlgb.stop(); + assertTrue(FileUtil.gitDirectoriesAreEqual(getResource("/canCloneAMigratedRepositoryWithoutChanges/state/testproj_no_change"), testprojDir.toPath())); + } + private String makeConfigFile( int port, int apiPort diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneAMigratedRepositoryWithoutChanges/state/state.json b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneAMigratedRepositoryWithoutChanges/state/state.json new file mode 100644 index 0000000000..070bdaa8d6 --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneAMigratedRepositoryWithoutChanges/state/state.json @@ -0,0 +1,29 @@ +[ + { + "project": "testproj_no_change", + "getDoc": { + "versionID": 0, + "createdAt": "2014-11-30T18:40:58.123Z", + "email": "jdleesmiller+1@gmail.com", + "name": "John+1" + }, + "getSavedVers": [], + "getForVers": [ + { + "versionID": 0, + "srcs": [ + { + "content": "test content\n", + "path": "main.tex" + } + ], + "atts": [] + } + ], + "push": "success", + "postback": { + "type": "success", + "versionID": 1 + } + } +] diff --git a/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneAMigratedRepositoryWithoutChanges/state/testproj_no_change/main.tex b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneAMigratedRepositoryWithoutChanges/state/testproj_no_change/main.tex new file mode 100644 index 0000000000..d670460b4b --- /dev/null +++ b/services/git-bridge/src/test/resources/uk/ac/ic/wlgitbridge/WLGitBridgeIntegrationTest/canCloneAMigratedRepositoryWithoutChanges/state/testproj_no_change/main.tex @@ -0,0 +1 @@ +test content