╭ changed ────╮ │src/patch.zig│ ╰─────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭─────────────────────────────────────────────────────────╮ │869 io: std.Io, │ │870 allocator: std.mem.Allocator, │ │871 admin_repo: *rp.Repo(.xit, evt.admin_repo_opts),│ │872 + user_repo: *rp.Repo(.xit, evt.user_repo_opts), │ │873 target_repo: *rp.Repo(.xit, repo_opts), │ │874 fork_path: []const u8, │ │875 input: PublishInput, │ ╰─────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │880 │ │881 // validate the fork ownership and publishing identity │ │882 const admin_moment = try evt.currentMoment(evt.admin_repo_opts, admin_repo); │ │882 - const fork_record = (try evt.Fork.readById(evt.AdminDB, evt.admin_repo_opts.hash, admin_moment, &arena, &patch_id)) orelse return error.InvalidPatchDraft;│ │883 - if (fork_record.removed or │ │884 - !std.mem.eql(u8, fork_record.event.user_id, &input.user_id) or │ │885 - !std.mem.eql(u8, fork_record.event.repo_id, &input.repo_id)) return error.InvalidPatchDraft; │ │883 + const user_moment = (try evt.userMoment(user_repo)) orelse return error.InvalidPatchDraft; │ │884 + const fork_record = (try evt.Fork.readById(evt.UserDB, evt.user_repo_opts.hash, user_moment, &arena, &patch_id)) orelse return error.InvalidPatchDraft; │ │885 + if (fork_record.removed or !std.mem.eql(u8, fork_record.event.repo_id, &input.repo_id)) return error.InvalidPatchDraft; │ │886 const user = (try evt.User.readById(evt.AdminDB, evt.admin_repo_opts.hash, admin_moment, &arena, &input.user_id)) orelse return error.InvalidPatchDraft; │ │887 if (user.removed or │ │888 !std.mem.eql(u8, user.event.name, input.author.name) or │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────╮ │937 }}); │ │938 } │ │939 │ │940 - // mark the fork as published in the administration repository│ │940 + // mark the fork as published in the forker's user repo │ │941 if (fork_record.event.stage == .draft) { │ │942 var published = fork_record.event; │ │943 published.stage = .publish; │ ╰───────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │944 - try evt.consume(.server, .admin, .xit, evt.admin_repo_opts, io, allocator, admin_repo, evt.events_ref, &.{.{│ │944 + try evt.consume(.server, .user, .xit, evt.user_repo_opts, io, allocator, user_repo, evt.events_ref, &.{.{ │ │945 .id = input.id, │ │946 .timestamp = input.timestamp, │ │947 .author = input.author, │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────╮ │955 io: std.Io, │ │956 allocator: std.mem.Allocator, │ │957 admin_repo: *rp.Repo(.xit, evt.admin_repo_opts),│ │958 + user_repo: *rp.Repo(.xit, evt.user_repo_opts), │ │959 fork_path: []const u8, │ │960 input: EditDraftInput, │ │961 ) !bool { │ ╰─────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │969 // validate the draft ownership and editing identity │ │970 { │ │971 const admin_moment = try evt.currentMoment(evt.admin_repo_opts, admin_repo); │ │971 - const fork_record = (try evt.Fork.readById(evt.AdminDB, evt.admin_repo_opts.hash, admin_moment, &arena, &patch_id)) orelse return false; │ │972 + const user_moment = (try evt.userMoment(user_repo)) orelse return false; │ │973 + const fork_record = (try evt.Fork.readById(evt.UserDB, evt.user_repo_opts.hash, user_moment, &arena, &patch_id)) orelse return false; │ │974 if (fork_record.event.stage != .draft) return false; │ │973 - if (fork_record.removed or │ │974 - !std.mem.eql(u8, fork_record.event.user_id, &input.user_id) or │ │975 - !std.mem.eql(u8, fork_record.event.repo_id, &input.repo_id)) return error.InvalidPatchDraft; │ │975 + if (fork_record.removed or !std.mem.eql(u8, fork_record.event.repo_id, &input.repo_id)) return error.InvalidPatchDraft; │ │976 const user = (try evt.User.readById(evt.AdminDB, evt.admin_repo_opts.hash, admin_moment, &arena, &input.user_id)) orelse return error.InvalidPatchDraft;│ │977 if (user.removed or │ │978 !std.mem.eql(u8, user.event.name, input.author.name) or │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────╮ │1168 io: std.Io, │ │1169 allocator: std.mem.Allocator, │ │1170 repo_root_path: []const u8, │ │1171 - admin_repo: *rp.Repo(.xit, evt.admin_repo_opts),│ │1171 target_repo: *rp.Repo(.xit, repo_opts), │ │1172 input: MergeInput, │ │1173 ) !void { │ ╰──────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1175 var arena = std.heap.ArenaAllocator.init(allocator); │ │1176 defer arena.deinit(); │ │1177 │ │1179 - // remove fork data only for patches backed by a fork. │ │1178 + // remove fork data only for patches backed by a fork │ │1179 const record = (try evt.readFromRepo(evt.Patch, .xit, repo_opts, io, allocator, &arena, target_repo, &try evt.parseEventId(&input.id))) orelse return error.InvalidPatch;│ │1181 - if (record.event.source_branch == null) try fork.remove(io, allocator, repo_root_path, admin_repo, &input.id, null, input.author); │ │1180 + if (record.event.source_branch != null) return; │ │1181 + // a fork already cleaned up has no repo left │ │1182 + const fork_path = try fork.forkPath(arena.allocator(), repo_root_path, &input.id); │ │1183 + const forker_id = (try fork.readForkerId(io, allocator, fork_path)) orelse return; │ │1184 + var user_repo = (try evt.openUserRepo(io, allocator, repo_root_path, &forker_id)) orelse return error.InvalidPatchDraft; │ │1185 + defer user_repo.deinit(io, allocator); │ │1186 + try fork.remove(io, allocator, repo_root_path, &user_repo, &input.id, input.author); │ │1187 } │ │1188 │ │1189 fn commitAuthor(line: []const u8) !evt.CommitAuthor { │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯