╭ changed ────╮ │src/patch.zig│ ╰─────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭──────────╮ │← previous│ ╰──────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1009 if (fork_record.event.stage == .draft) { │ │1010 var published = fork_record.event; │ │1011 published.stage = .publish; │ │ 944 - try evt.consume(.server, .user, .xit, evt.user_repo_opts, io, allocator, user_repo, evt.events_ref, &.{.{ │ │1012 + try evt.consume(.server, .user, .xit, evt.user_repo_opts, io, allocator, &user_repo, evt.events_ref, &.{.{│ │1013 .id = input.id, │ │1014 .timestamp = input.timestamp, │ │1015 .author = input.author, │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────╮ │1022 comptime repo_opts: rp.RepoOpts(.xit), │ │1023 io: std.Io, │ │1024 allocator: std.mem.Allocator, │ │1025 + users_dir: []const u8, │ │1026 admin_repo: *rp.Repo(.xit, evt.admin_repo_opts), │ │ 958 - user_repo: *rp.Repo(.xit, evt.user_repo_opts), │ │ 959 - fork_path: []const u8, │ │1027 input: EditDraftInput, │ │1028 ) !bool { │ │1029 // validate the submitted fields before opening repositories│ ╰──────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1035 │ │1036 // validate the draft ownership and editing identity │ │1037 { │ │1038 + var user_repo = (try evt.openUserRepo(io, allocator, users_dir, &input.user_id)) orelse return false; │ │1039 + defer user_repo.deinit(io, allocator); │ │1040 const admin_moment = try evt.currentMoment(evt.admin_repo_opts, admin_repo); │ │ 972 - const user_moment = (try evt.userMoment(user_repo)) orelse return false; │ │1041 + const user_moment = (try evt.userMoment(&user_repo)) orelse return false; │ │1042 const fork_record = (try evt.Fork.readById(evt.UserDB, evt.user_repo_opts.hash, user_moment, &arena, &patch_id)) orelse return false;│ │1043 if (fork_record.event.stage != .draft) return false; │ │1044 if (fork_record.removed or !std.mem.eql(u8, fork_record.event.repo_id, &input.repo_id)) return error.InvalidPatchDraft; │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1049 } │ │1050 │ │1051 // read the draft patch from its fork │ │1052 + const fork_path = try fork.forkPath(arena.allocator(), users_dir, &input.user_id, &patch_id); │ │1053 var fork_repo = rp.Repo(.xit, repo_opts).open(io, allocator, .{ .path = fork_path, .require_repo_root = true }) catch return error.PatchDataUnavailable;│ │1054 defer fork_repo.deinit(io, allocator); │ │1055 const fork_moment = evt.currentMoment(repo_opts, &fork_repo) catch return error.PatchDataUnavailable; │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────╮ │1079 comptime repo_opts: rp.RepoOpts(.xit), │ │1080 io: std.Io, │ │1081 allocator: std.mem.Allocator, │ │1012 - repo_root_path: []const u8, │ │1082 + users_dir: []const u8, │ │1083 target_repo: *rp.Repo(.xit, repo_opts),│ │1084 input: MergeInput, │ │1085 ) !void { │ ╰─────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1105 const target_ref = rf.Ref{ .kind = .head, .name = patch_record.event.target_branch }; │ │1106 │ │1107 // open the fork │ │1038 - const fork_path = try fork.forkPath(arena.allocator(), repo_root_path, &input.id); │ │1039 - var fork_repo_maybe: ?rp.Repo(.xit, repo_opts) = if (patch_record.event.source_branch != null) null else rp.Repo(.xit, repo_opts).open(io, allocator, .{ .path = fork_path, .require_repo_root = true }) catch return error.PatchDataUnavailable;│ │1108 + var fork_repo_maybe: ?rp.Repo(.xit, repo_opts) = if (patch_record.event.source_branch != null) null else blk: { │ │1109 + var config = try target_repo.listConfig(io, allocator); │ │1110 + defer config.deinit(); │ │1111 + const forker_id = (try fork.readForkerId(&config.sections, &patch_id)) orelse return error.PatchDataUnavailable; │ │1112 + const fork_path = try fork.forkPath(arena.allocator(), users_dir, &forker_id, &patch_id); │ │1113 + break :blk rp.Repo(.xit, repo_opts).open(io, allocator, .{ .path = fork_path, .require_repo_root = true }) catch return error.PatchDataUnavailable; │ │1114 + }; │ │1115 defer if (fork_repo_maybe) |*repo| repo.deinit(io, allocator); │ │1116 │ │1117 // select the commit and merge identity │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────╮ │1242 comptime repo_opts: rp.RepoOpts(.xit), │ │1243 io: std.Io, │ │1244 allocator: std.mem.Allocator, │ │1170 - repo_root_path: []const u8, │ │1245 + users_dir: []const u8, │ │1246 target_repo: *rp.Repo(.xit, repo_opts),│ │1247 input: MergeInput, │ │1248 ) !void { │ ╰─────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────╮ │1174 - try merge(repo_opts, io, allocator, repo_root_path, target_repo, input);│ │1249 + try merge(repo_opts, io, allocator, users_dir, target_repo, input); │ │1250 var arena = std.heap.ArenaAllocator.init(allocator); │ │1251 defer arena.deinit(); │ │1252 │ ╰──────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1253 // 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;│ │1254 + const patch_id = try evt.parseEventId(&input.id); │ │1255 + const record = (try evt.readFromRepo(evt.Patch, .xit, repo_opts, io, allocator, &arena, target_repo, &patch_id)) orelse return error.InvalidPatch; │ │1256 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); │ │1257 + // a patch from another instance has no fork here │ │1258 + const forker_id = blk: { │ │1259 + var config = try target_repo.listConfig(io, allocator); │ │1260 + defer config.deinit(); │ │1261 + break :blk (try fork.readForkerId(&config.sections, &patch_id)) orelse return; │ │1262 + }; │ │1263 + try fork.remove(io, allocator, users_dir, &forker_id, &input.id, input.author); │ │1264 } │ │1265 │ │1266 fn commitAuthor(line: []const u8) !evt.CommitAuthor { │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────╮ │1279 moment: *evt.EventDB(repo_opts.hash).HashMap(.read_write),│ │1280 io: std.Io, │ │1281 allocator: std.mem.Allocator, │ │1205 - repo_root_path: []const u8, │ │1282 + users_dir: []const u8, │ │1283 patch_id: *const [evt.event_id_size]u8, │ │1284 matched_oid: *const [hash.hexLen(repo_opts.hash)]u8, │ │1285 before_oid: *const [hash.hexLen(repo_opts.hash)]u8, │ ╰────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯