╭ changed ──╮ │src/web.zig│ ╰───────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1117 const request_repo = (try requestRepoSource(io, allocator, host, parts.repo_base)) orelse return respondRemoveNotFound(request); │ │1118 defer request_repo.deinit(allocator); │ │1119 const source = request_repo.source; │ │1120 + │ │1121 + if (parts.kind == .patch) switch (host) { │ │1122 + .remote => |remote| { │ │1123 + const token = getCookieValue(request, cookie_name) orelse return respondLoginRequired(request); │ │1124 + var user_id: [evt.event_id_size]u8 = undefined; │ │1125 + if (!remote.session_store.lookup(token, &user_id)) return respondLoginRequired(request); │ │1126 + │ │1127 + var admin_repo = try rp.Repo(.xit, evt.admin_repo_opts).open(io, allocator, .{ .path = remote.admin_repo_path }); │ │1128 + defer admin_repo.deinit(io, allocator); │ │1129 + const moment = try evt.currentMoment(evt.admin_repo_opts, &admin_repo); │ │1130 + const record = try evt.Fork.readById(evt.AdminDB, evt.admin_repo_opts.hash, moment, &author_arena, &parts.id); │ │1131 + if (record) |fork_record| { │ │1132 + const repo_id = evt.parseEventId(std.fs.path.basename(source.path)) catch return respondRemoveNotFound(request); │ │1133 + if (!fork_record.removed and fork_record.event.stage == .draft and std.mem.eql(u8, fork_record.event.repo_id, &repo_id)) { │ │1134 + const id = std.fmt.bytesToHex(parts.id, .lower); │ │1135 + const repos_dir = try std.fs.path.join(allocator, &.{ std.fs.path.dirname(remote.admin_repo_path) orelse ".", "repos" });│ │1136 + defer allocator.free(repos_dir); │ │1137 + try fork.remove(io, allocator, repos_dir, &admin_repo, &id, &user_id, author); │ │1138 + │ │1139 + const location = try std.fmt.allocPrint(allocator, "{s}/patches/drafts", .{parts.repo_base}); │ │1140 + defer allocator.free(location); │ │1141 + try request.respond("", .{ │ │1142 + .status = .see_other, │ │1143 + .keep_alive = false, │ │1144 + .extra_headers = &.{.{ .name = "location", .value = location }}, │ │1145 + }); │ │1146 + return; │ │1147 + } │ │1148 + } │ │1149 + }, │ │1150 + .local => {}, │ │1151 + }; │ │1152 + │ │1153 switch (source.repo_kind) { │ │1154 inline else => |repo_kind| { │ │1155 var any_repo = try rp.AnyRepo(repo_kind, .{}).open(io, allocator, source.localInitOpts()); │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯