╭ changed ────────╮ │src/serve_ssh.zig│ ╰─────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │342 const fork_record = (try evt.Fork.readById(evt.AdminDB, evt.admin_repo_opts.hash, admin_moment, &admin_arena, &fork_id)) orelse │ │343 return writeError(sess, "patch draft not found"); │ │344 if (fork_record.removed) return writeError(sess, "patch draft not found"); │ │345 - const target_repo = (try evt.Repo.readByOwnerAndName(evt.AdminDB, evt.admin_repo_opts.hash, admin_moment, &admin_arena, owner_repo.owner, owner_repo.name)) orelse│ │346 - return writeError(sess, "repo not found"); │ │347 - if (!std.mem.eql(u8, fork_record.event.repo_id, &target_repo.event_id)) return writeError(sess, "patch draft belongs to another repo"); │ │345 const user = (try evt.User.readById(evt.AdminDB, evt.admin_repo_opts.hash, admin_moment, &admin_arena, fork_record.event.user_id)) orelse │ │346 return writeError(sess, "invalid patch draft"); │ │347 if (user.removed) return writeError(sess, "invalid patch draft"); │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │353 var draft = rp.AnyRepo(.xit, .{}).open(io, allocator, .{ .path = draft_path }) catch │ │354 return writeError(sess, "patch draft not found"); │ │355 defer draft.deinit(io, allocator); │ │359 - switch (draft) { │ │360 - inline else => |*repo| { │ │361 - var reader_buf: [4096]u8 = undefined; │ │362 - var writer_buf: [4096]u8 = undefined; │ │363 - var reader = ssh.SessionReader.init(sess, &reader_buf); │ │364 - var writer = ssh.SessionWriter.init(sess, &writer_buf); │ │365 - switch (parsed.service) { │ │366 - .upload_pack => try repo.uploadPack(io, allocator, &reader.interface, &writer.interface, .{}), │ │367 - .receive_pack => try repo.receivePack(io, allocator, &reader.interface, &writer.interface, .{}), │ │368 - } │ │369 - writer.interface.flush() catch {}; │ │370 - if (parsed.service == .receive_pack) { │ │371 - const source_oid = (try repo.readRef(io, fork.ref)) orelse return writeError(sess, "push HEAD to refs/heads/patch"); │ │372 - try fork.recordPush(io, allocator, &admin, &route.id, route.target, &source_oid, .{ │ │373 - .name = user.event.name, │ │374 - .email = user.event.email, │ │375 - }, @intCast(std.Io.Timestamp.now(io, .real).toSeconds())); │ │376 - } │ │377 - }, │ │356 + var reader_buf: [4096]u8 = undefined; │ │357 + var writer_buf: [4096]u8 = undefined; │ │358 + var reader = ssh.SessionReader.init(sess, &reader_buf); │ │359 + var writer = ssh.SessionWriter.init(sess, &writer_buf); │ │360 + if (parsed.service == .upload_pack) { │ │361 + switch (draft) { │ │362 + inline else => |*repo| try repo.uploadPack(io, allocator, &reader.interface, &writer.interface, .{}), │ │363 + } │ │364 + } else { │ │365 + const target = (try evt.Repo.readByOwnerAndName(evt.AdminDB, evt.admin_repo_opts.hash, admin_moment, &admin_arena, owner_repo.owner, owner_repo.name)) orelse │ │366 + return writeError(sess, "repo not found"); │ │367 + if (!std.mem.eql(u8, fork_record.event.repo_id, &target.event_id)) return writeError(sess, "patch draft belongs to another repo"); │ │368 + const target_id = std.fmt.bytesToHex(target.event_id, .lower); │ │369 + const target_path = try std.fs.path.join(allocator, &.{ handler.repo_root_path, &target_id }); │ │370 + defer allocator.free(target_path); │ │371 + const author: evt.CommitAuthor = .{ .name = user.event.name, .email = user.event.email }; │ │372 + const timestamp: u64 = @intCast(std.Io.Timestamp.now(io, .real).toSeconds()); │ │373 + switch (draft) { │ │374 + inline else => |*repo| { │ │375 + var target_repo = rp.Repo(.xit, repo.self_repo_opts).open(io, allocator, .{ .path = target_path }) catch │ │376 + return writeError(sess, "repo not found or has the wrong hash"); │ │377 + defer target_repo.deinit(io, allocator); │ │378 + try fork.receivePack(repo.self_repo_opts, io, allocator, repo, &target_repo, &route.id, route.target, author, timestamp, &reader.interface, &writer.interface);│ │379 + }, │ │380 + } │ │381 } │ │382 + writer.interface.flush() catch {}; │ │383 try sess.exit(0); │ │384 return; │ │385 } │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯