/** * Restores a {@link ProjectMetadata} whose name equals to the specified {@code projectName}. */ public CompletableFuture<Revision> restoreProject(Author author, String projectName) { requireNonNull(author, "author"); requireNonNull(projectName, "projectName"); final Change<JsonNode> change = Change.ofJsonPatch(METADATA_JSON, new RemoveOperation(PROJECT_REMOVAL).toJsonNode()); return metadataRepo.push(projectName, Project.REPO_DOGMA, author, "Restore the project: " + projectName, change); }
/** * Restores a {@link ProjectMetadata} whose name equals to the specified {@code projectName}. */ public CompletableFuture<Revision> restoreProject(Author author, String projectName) { requireNonNull(author, "author"); requireNonNull(projectName, "projectName"); final Change<JsonNode> change = Change.ofJsonPatch(METADATA_JSON, new RemoveOperation(PROJECT_REMOVAL).toJsonNode()); return metadataRepo.push(projectName, Project.REPO_DOGMA, author, "Restore the project: " + projectName, change); }
/** * Restores a {@link ProjectMetadata} whose name equals to the specified {@code projectName}. */ public CompletableFuture<Revision> restoreProject(Author author, String projectName) { requireNonNull(author, "author"); requireNonNull(projectName, "projectName"); final Change<JsonNode> change = Change.ofJsonPatch(METADATA_JSON, new RemoveOperation(PROJECT_REMOVAL).toJsonNode()); return metadataRepo.push(projectName, Project.REPO_DOGMA, author, "Restore the project: " + projectName, change); }
/** * Removes {@link Permission}s from the specified {@code path}. */ private CompletableFuture<Revision> removePermissionAtPointer(Author author, String projectName, JsonPointer path, String commitSummary) { final Change<JsonNode> change = Change.ofJsonPatch(METADATA_JSON, new RemoveOperation(path).toJsonNode()); return metadataRepo.push(projectName, Project.REPO_DOGMA, author, commitSummary, change); }
/** * Restores a {@link RepositoryMetadata} of the specified {@code repoName} in the specified * {@code projectName}. */ public CompletableFuture<Revision> restoreRepo(Author author, String projectName, String repoName) { requireNonNull(author, "author"); requireNonNull(projectName, "projectName"); requireNonNull(repoName, "repoName"); final Change<JsonNode> change = Change.ofJsonPatch(METADATA_JSON, new RemoveOperation(JsonPointer.compile( "/repos" + encodeSegment(repoName) + "/removal")).toJsonNode()); final String commitSummary = "Restore the repo '" + repoName + "' from the project " + projectName; return metadataRepo.push(projectName, Project.REPO_DOGMA, author, commitSummary, change); }
/** * Removes {@link Permission}s from the specified {@code path}. */ private CompletableFuture<Revision> removePermissionAtPointer(Author author, String projectName, JsonPointer path, String commitSummary) { final Change<JsonNode> change = Change.ofJsonPatch(METADATA_JSON, new RemoveOperation(path).toJsonNode()); return metadataRepo.push(projectName, Project.REPO_DOGMA, author, commitSummary, change); }
/** * Restores a {@link RepositoryMetadata} of the specified {@code repoName} in the specified * {@code projectName}. */ public CompletableFuture<Revision> restoreRepo(Author author, String projectName, String repoName) { requireNonNull(author, "author"); requireNonNull(projectName, "projectName"); requireNonNull(repoName, "repoName"); final Change<JsonNode> change = Change.ofJsonPatch(METADATA_JSON, new RemoveOperation(JsonPointer.compile( "/repos" + encodeSegment(repoName) + "/removal")).toJsonNode()); final String commitSummary = "Restore the repo '" + repoName + "' from the project " + projectName; return metadataRepo.push(projectName, Project.REPO_DOGMA, author, commitSummary, change); }
/** * Removes {@link Permission}s from the specified {@code path}. */ private CompletableFuture<Revision> removePermissionAtPointer(Author author, String projectName, JsonPointer path, String commitSummary) { final Change<JsonNode> change = Change.ofJsonPatch(METADATA_JSON, new RemoveOperation(path).toJsonNode()); return metadataRepo.push(projectName, Project.REPO_DOGMA, author, commitSummary, change); }
/** * Removes a {@link ProjectMetadata} whose name equals to the specified {@code projectName}. */ public CompletableFuture<Revision> removeProject(Author author, String projectName) { requireNonNull(author, "author"); requireNonNull(projectName, "projectName"); final Change<JsonNode> change = Change.ofJsonPatch( METADATA_JSON, asJsonArray(new TestAbsenceOperation(PROJECT_REMOVAL), new AddOperation(PROJECT_REMOVAL, Jackson.valueToTree(UserAndTimestamp.of(author))))); return metadataRepo.push(projectName, Project.REPO_DOGMA, author, "Remove the project: " + projectName, change); }
/** * Replaces {@link Permission}s of the specified {@code path} with the specified {@code permission}. */ private CompletableFuture<Revision> replacePermissionAtPointer(Author author, String projectName, JsonPointer path, Collection<Permission> permission, String commitSummary) { final Change<JsonNode> change = Change.ofJsonPatch(METADATA_JSON, new ReplaceOperation(path, Jackson.valueToTree(permission)).toJsonNode()); return metadataRepo.push(projectName, Project.REPO_DOGMA, author, commitSummary, change); }
/** * Replaces {@link Permission}s of the specified {@code path} with the specified {@code permission}. */ private CompletableFuture<Revision> replacePermissionAtPointer(Author author, String projectName, JsonPointer path, Collection<Permission> permission, String commitSummary) { final Change<JsonNode> change = Change.ofJsonPatch(METADATA_JSON, new ReplaceOperation(path, Jackson.valueToTree(permission)).toJsonNode()); return metadataRepo.push(projectName, Project.REPO_DOGMA, author, commitSummary, change); }
/** * Removes a {@link ProjectMetadata} whose name equals to the specified {@code projectName}. */ public CompletableFuture<Revision> removeProject(Author author, String projectName) { requireNonNull(author, "author"); requireNonNull(projectName, "projectName"); final Change<JsonNode> change = Change.ofJsonPatch( METADATA_JSON, asJsonArray(new TestAbsenceOperation(PROJECT_REMOVAL), new AddOperation(PROJECT_REMOVAL, Jackson.valueToTree(UserAndTimestamp.of(author))))); return metadataRepo.push(projectName, Project.REPO_DOGMA, author, "Remove the project: " + projectName, change); }
/** * Removes a {@link ProjectMetadata} whose name equals to the specified {@code projectName}. */ public CompletableFuture<Revision> removeProject(Author author, String projectName) { requireNonNull(author, "author"); requireNonNull(projectName, "projectName"); final Change<JsonNode> change = Change.ofJsonPatch( METADATA_JSON, asJsonArray(new TestAbsenceOperation(PROJECT_REMOVAL), new AddOperation(PROJECT_REMOVAL, Jackson.valueToTree(UserAndTimestamp.of(author))))); return metadataRepo.push(projectName, Project.REPO_DOGMA, author, "Remove the project: " + projectName, change); }
/** * Replaces {@link Permission}s of the specified {@code path} with the specified {@code permission}. */ private CompletableFuture<Revision> replacePermissionAtPointer(Author author, String projectName, JsonPointer path, Collection<Permission> permission, String commitSummary) { final Change<JsonNode> change = Change.ofJsonPatch(METADATA_JSON, new ReplaceOperation(path, Jackson.valueToTree(permission)).toJsonNode()); return metadataRepo.push(projectName, Project.REPO_DOGMA, author, commitSummary, change); }
/** * Adds {@link Permission}s to the specified {@code path}. */ private CompletableFuture<Revision> addPermissionAtPointer(Author author, String projectName, JsonPointer path, Collection<Permission> permission, String commitSummary) { final Change<JsonNode> change = Change.ofJsonPatch(METADATA_JSON, asJsonArray(new TestAbsenceOperation(path), new AddOperation(path, Jackson.valueToTree(permission)))); return metadataRepo.push(projectName, Project.REPO_DOGMA, author, commitSummary, change); }
/** * Adds {@link Permission}s to the specified {@code path}. */ private CompletableFuture<Revision> addPermissionAtPointer(Author author, String projectName, JsonPointer path, Collection<Permission> permission, String commitSummary) { final Change<JsonNode> change = Change.ofJsonPatch(METADATA_JSON, asJsonArray(new TestAbsenceOperation(path), new AddOperation(path, Jackson.valueToTree(permission)))); return metadataRepo.push(projectName, Project.REPO_DOGMA, author, commitSummary, change); }
/** * Adds {@link Permission}s to the specified {@code path}. */ private CompletableFuture<Revision> addPermissionAtPointer(Author author, String projectName, JsonPointer path, Collection<Permission> permission, String commitSummary) { final Change<JsonNode> change = Change.ofJsonPatch(METADATA_JSON, asJsonArray(new TestAbsenceOperation(path), new AddOperation(path, Jackson.valueToTree(permission)))); return metadataRepo.push(projectName, Project.REPO_DOGMA, author, commitSummary, change); }
@Test public void testJsonPatch_safeReplace() throws JsonProcessingException { final String jsonFilePath = String.format("/test_%s.json", testName.getMethodName()); final Change<JsonNode> change = Change.ofJsonUpsert(jsonFilePath, "{\"key\":1}"); repo.commit(HEAD, 0L, Author.UNKNOWN, SUMMARY, change).join(); final Change<JsonNode> nextChange = Change.ofJsonPatch(jsonFilePath, "{\"key\":2}", "{\"key\":3}"); assertThatThrownBy( () -> repo.commit(HEAD, 0L, Author.UNKNOWN, SUMMARY, nextChange).join()) .isInstanceOf(CompletionException.class) .hasCauseInstanceOf(ChangeConflictException.class); }
@Test public void testApplyUpsertOnExistingPath() throws Exception { final String jsonPath = "/a_new_json_file.json"; rule.client().push(rule.project(), rule.repo1(), Revision.HEAD, "Add a new JSON file", Change.ofJsonUpsert(jsonPath, "{ \"a\": \"apple\" }")).join(); final Change<JsonNode> change = Change.ofJsonPatch(jsonPath, "{ \"a\": \"apple\" }", "{ \"a\": \"angle\" }"); final List<Change<?>> returnedList = rule.client().getPreviewDiffs(rule.project(), rule.repo1(), Revision.HEAD, change).join(); assertThat(returnedList).hasSize(1); assertThat(returnedList.get(0).type()).isEqualTo(ChangeType.APPLY_JSON_PATCH); } }
@Test public void testInvalidPatch() throws Exception { // Apply a conflict change final Change<?> change = Change.ofJsonPatch("/test/new_json_file.json", "{ \"a\": \"apple\" }", "{ \"a\": \"angle\" }"); assertThatThrownByWithExpectedException(ChangeConflictException.class, "/test/new_json_file.json", () -> rule.client().getPreviewDiffs(rule.project(), rule.repo1(), Revision.HEAD, change).join()) .isInstanceOf(CompletionException.class).hasCauseInstanceOf(ChangeConflictException.class); }