╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ────────╮ │src/serve_ssh.zig│ ╰─────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │450 var repo = try rp.Repo(.xit, any_repo_opts.toRepoOptsWithHash(kind)).open(io, allocator, .{ .path = repo_path }); │ │451 defer repo.deinit(io, allocator); │ │452 // stateless since the advertisement already went out │ │451 - try push.receivePackAndConsume(repo.self_repo_opts, io, allocator, &repo, reader, writer, .{ .protocol_version = protocol_version, .is_stateless = true }, creator.owner, handler.users_dir, handler.err, sess);│ │453 + try push.receivePackAndConsume(repo.self_repo_opts, io, allocator, &repo, reader, writer, .{ .protocol_version = protocol_version, .is_stateless = true }, creator.owner, handler.server, handler.err, sess); │ │454 }, │ │455 } │ │456 } │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │480 const fork_id = try evt.parseEventId(&route.id); │ │481 const forker_id = (try evt.User.readIdByName(evt.AdminDB, evt.admin_repo_opts.hash, admin_moment, forker_repo.owner)) orelse │ │482 return writeError(sess, "patch draft not found"); │ │481 - const fork_record = (try evt.readForkById(io, allocator, &admin_arena, handler.users_dir, &forker_id, &fork_id)) orelse │ │483 + const fork_record = (try evt.readForkById(io, allocator, &admin_arena, handler.server.users_dir, &forker_id, &fork_id)) orelse│ │484 return writeError(sess, "patch draft not found"); │ │485 if (fork_record.removed) return writeError(sess, "patch draft not found"); │ │486 const user = (try evt.User.readById(evt.AdminDB, evt.admin_repo_opts.hash, admin_moment, &admin_arena, &forker_id)) orelse │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │489 if (service == .receive_pack and !isKeyInAuthorizedKeys(user.event.ssh_keys, &sess.fingerprint)) │ │490 return writeError(sess, "unauthorized: this SSH key is not registered to the patch author"); │ │491 │ │490 - const target = (try evt.readRepoById(io, allocator, &admin_arena, handler.users_dir, fork_record.event.repo_user_id[0..evt.event_id_size], fork_record.event.repo_id[0..evt.event_id_size], forker_id)) orelse │ │492 + const target = (try evt.readRepoById(io, allocator, &admin_arena, handler.server.users_dir, fork_record.event.repo_user_id[0..evt.event_id_size], fork_record.event.repo_id[0..evt.event_id_size], forker_id)) orelse│ │493 return writeError(sess, "repo not found"); │ │494 // patches that are off take their drafts with them │ │495 const patch_role = target.repo.event.patch_role orelse return writeError(sess, "patch draft not found"); │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │498 if (!role.atLeast(patch_role)) return writeError(sess, "unauthorized: your role in this repo may not write patches");│ │499 } │ │500 │ │499 - const draft_path = try fork.forkPath(allocator, handler.users_dir, &forker_id, &fork_id); │ │501 + const draft_path = try fork.forkPath(allocator, handler.server.users_dir, &forker_id, &fork_id); │ │502 defer allocator.free(draft_path); │ │503 var draft = rp.AnyRepo(.xit, any_repo_opts).open(io, allocator, .{ .path = draft_path }) catch │ │504 return writeError(sess, "patch draft not found"); │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │510 } │ │511 } else { │ │512 if (!std.mem.eql(u8, target.repo.event.name, forker_repo.name)) return writeError(sess, "patch draft belongs to another repo"); │ │511 - const target_path = try evt.repoPath(allocator, handler.users_dir, fork_record.event.repo_user_id, fork_record.event.repo_id); │ │513 + const target_path = try evt.repoPath(allocator, handler.server.users_dir, fork_record.event.repo_user_id, fork_record.event.repo_id);│ │514 defer allocator.free(target_path); │ │515 const author: evt.CommitAuthor = .{ .name = user.event.name, .email = user.event.email }; │ │516 const timestamp: u64 = @intCast(std.Io.Timestamp.now(io, .real).toSeconds()); │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │519 var target_repo = rp.Repo(.xit, repo.self_repo_opts).open(io, allocator, .{ .path = target_path }) catch │ │520 return writeError(sess, "repo not found or has the wrong hash"); │ │521 defer target_repo.deinit(io, allocator); │ │520 - try push.receiveFork(repo.self_repo_opts, io, allocator, repo, &target_repo, handler.users_dir, &route.id, author, timestamp, reader, writer, handler.err, sess);│ │522 + try push.receiveFork(repo.self_repo_opts, io, allocator, repo, &target_repo, handler.server, &route.id, author, timestamp, reader, writer, handler.err, sess); │ │523 }, │ │524 } │ │525 } │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ───╮ │src/test.zig│ ╰────────────╯ ╭────────────────────────────────────────────╮ │1 comptime { │ │2 _ = @import("test/event.zig"); │ │3 _ = @import("test/event/admin.zig"); │ │4 + _ = @import("test/event/notify.zig");│ │5 _ = @import("test/event/patch.zig"); │ │6 _ = @import("test/ssh.zig"); │ │7 _ = @import("test/ui.zig"); │ ╰────────────────────────────────────────────╯ ╭ changed ───────────────╮ │src/test/event/patch.zig│ ╰────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │242 pch.refreshMergeability(opts, io, allocator, &repo, path, id); │ │243 │ │244 // both merge styles use the stored revision, without fork data │ │245 - try pch.merge(opts, io, allocator, path, &repo, .{ .id = id_hex, .revision = selection, .author = author, .timestamp = 100 }); │ │245 + try pch.merge(opts, io, allocator, .{ .users_dir = path }, &repo, .{ .id = id_hex, .revision = selection, .author = author, .timestamp = 100 });│ │246 const merged = (try evt.readFromRepo(evt.Patch, .xit, opts, io, allocator, &arena, &repo, &id)) orelse return error.NotFound; │ │247 const merged_status = switch (merged.event.status) { │ │248 .merged => |value| value, │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────╮ │982 .timestamp = 3, │ │983 }); │ │984 defer allocator.free(unpushed_path); │ │985 - try pch.publish(repo_opts, io, allocator, users_dir, &admin, &target, .{ │ │985 + try pch.publish(repo_opts, io, allocator, .{ .users_dir = users_dir }, &admin, &target, .{│ │986 .id = unpushed_id_hex, │ │987 .user_id = user_id, │ │988 .repo_id = repo_id, │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1024 // │ │1025 │ │1026 const before_publish = try target.core.db.rootCursor().count(); │ │1027 - try pch.publish(repo_opts, io, allocator, users_dir, &admin, &target, .{ │ │1027 + try pch.publish(repo_opts, io, allocator, .{ .users_dir = users_dir }, &admin, &target, .{│ │1028 .id = patch_id_hex, │ │1029 .user_id = user_id, │ │1030 .repo_id = repo_id, │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯