╭ changed ───────────────╮ │src/test/event/patch.zig│ ╰────────────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────╮ │489 } │ │490 │ │491 test "patch lifecycle" { │ │492 + try patchLifecycle("temp-patch-lifecycle-squash", .squash); │ │493 + try patchLifecycle("temp-patch-lifecycle-source", .source); │ │494 +} │ │495 + │ │496 +fn patchLifecycle(temp_dir_name: []const u8, merge_revision: pch.MergeRevision) !void {│ │497 const io = std.testing.io; │ │498 const allocator = std.testing.allocator; │ │494 - const temp_dir_name = "temp-patch-lifecycle"; │ │499 const cwd = std.Io.Dir.cwd(); │ │500 │ │501 if (cwd.openDir(io, temp_dir_name, .{})) |dir_value| { │ ╰────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │682 const draft_key = evt.Fork.draftKey(&repo_id, &user_id); │ │683 try std.testing.expectEqual(0, try indexedForkCount(admin_moment, evt.Fork.repo_user_to_draft_id_set_key, &draft_key));│ │684 try std.testing.expectEqual(1, try indexedForkCount(admin_moment, evt.Fork.user_id_to_fork_id_set_key, &user_id)); │ │685 + var squash_oid: [hash.hexLen(repo_opts.hash)]u8 = undefined; │ │686 { │ │687 var draft = try Repo.open(io, allocator, .{ .path = draft_path }); │ │688 defer draft.deinit(io, allocator); │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │691 const removed = (try evt.Patch.readById(Repo.DB, repo_opts.hash, draft_moment, &arena, &patch_id)) orelse return error.NotFound; │ │692 try std.testing.expect(removed.removed); │ │693 const revision = (try evt.PatchRev.readById(Repo.DB, repo_opts.hash, draft_moment, &arena, &first_patchrev_id)) orelse return error.NotFound;│ │694 + @memcpy(&squash_oid, revision.patch_oid); │ │695 try std.testing.expectEqualStrings("refs/heads/master", revision.event.target_ref); │ │696 try std.testing.expectEqual(hash.hexLen(repo_opts.hash), revision.event_oid.len); │ │697 var event_oid: [hash.hexLen(repo_opts.hash)]u8 = undefined; │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │704 try std.testing.expectEqualStrings(revision.base_tree_oid, &trees.base); │ │705 try std.testing.expectEqualStrings(revision.head_tree_oid, &trees.head); │ │706 } │ │707 + │ │708 + // │ │709 + // merge the selected revision into the target │ │710 + // │ │711 + │ │712 + const selected_oid = switch (merge_revision) { │ │713 + .squash => squash_oid, │ │714 + .source => source_oid, │ │715 + }; │ │716 + try pch.merge(repo_opts, io, allocator, repos_dir, &target, .{ │ │717 + .id = patch_id_hex, │ │718 + .revision = merge_revision, │ │719 + .author = author, │ │720 + .timestamp = 5, │ │721 + }); │ │722 + const target_oid = (try target.readRef(io, .{ .kind = .head, .name = "master" })) orelse return error.NotFound; │ │723 + try std.testing.expectEqualStrings(&selected_oid, &target_oid); │ │724 + │ │725 + _ = arena.reset(.retain_capacity); │ │726 + const merged_moment = try evt.currentMoment(repo_opts, &target); │ │727 + const merged = (try evt.Patch.readById(Repo.DB, repo_opts.hash, merged_moment, &arena, &patch_id)) orelse return error.NotFound;│ │728 + try std.testing.expectEqual(.merged, merged.event.status); │ │729 + try std.testing.expect(null != try evt.PatchRev.readById(Repo.DB, repo_opts.hash, merged_moment, &arena, &first_patchrev_id)); │ │730 } │ │731 │ │732 fn indexedForkCount( │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯