╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ────────╮ │src/serve_ssh.zig│ ╰─────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │451 inline else => |*repo| try repo.uploadPack(io, allocator, reader, writer, .{ .protocol_version = protocol_version }, &sideband), │ │452 } │ │453 } else { │ │454 - const target = (try evt.readRepoById(io, allocator, &admin_arena, handler.repo_root_path, fork_record.event.repo_user_id[0..evt.event_id_size], fork_record.event.repo_id)) orelse│ │454 + 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)) orelse │ │455 return writeError(sess, "repo not found"); │ │456 if (!std.mem.eql(u8, target.event.name, forker_repo.name)) return writeError(sess, "patch draft belongs to another repo"); │ │457 - const target_id = std.fmt.bytesToHex(fork_record.event.repo_id[0..evt.event_id_size].*, .lower); │ │458 - const target_path = try std.fs.path.join(allocator, &.{ handler.repo_root_path, &target_id }); │ │457 + const target_path = try evt.repoPath(allocator, handler.users_dir, fork_record.event.repo_user_id, fork_record.event.repo_id); │ │458 defer allocator.free(target_path); │ │459 const author: evt.CommitAuthor = .{ .name = user.event.name, .email = user.event.email }; │ │460 const timestamp: u64 = @intCast(std.Io.Timestamp.now(io, .real).toSeconds()); │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────╮ │472 // serve an existing repo at `repo_path`, or return false if none is there│ │473 fn serveIfExists( │ │474 repo_path: []const u8, │ │476 - repo_root_path: []const u8, │ │475 + users_dir: []const u8, │ │476 reader: *std.Io.Reader, │ │477 writer: *std.Io.Writer, │ │478 io: std.Io, │ ╰───────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │494 defer any_repo.deinit(io, allocator); │ │495 │ │496 switch (any_repo) { │ │498 - inline else => |*repo| try servePack(repo.self_repo_opts, repo, repo_root_path, reader, writer, io, allocator, service, protocol_version, author, error_writer, sess),│ │497 + inline else => |*repo| try servePack(repo.self_repo_opts, repo, users_dir, reader, writer, io, allocator, service, protocol_version, author, error_writer, sess), │ │498 } │ │499 return true; │ │500 } │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────╮ │502 fn servePack( │ │503 comptime repo_opts: rp.RepoOpts(.xit),│ │504 repo: *rp.Repo(.xit, repo_opts), │ │506 - repo_root_path: []const u8, │ │505 + users_dir: []const u8, │ │506 reader: *std.Io.Reader, │ │507 writer: *std.Io.Writer, │ │508 io: std.Io, │ ╰───────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │518 var sideband = progress.Sideband{ .writer = writer, .sess = sess }; │ │519 try repo.uploadPack(io, allocator, reader, writer, .{ .protocol_version = protocol_version }, &sideband); │ │520 }, │ │522 - .receive_pack => try push.receivePackAndConsume(repo_opts, io, allocator, repo, reader, writer, .{ .protocol_version = protocol_version }, author, repo_root_path, error_writer, sess),│ │521 + .receive_pack => try push.receivePackAndConsume(repo_opts, io, allocator, repo, reader, writer, .{ .protocol_version = protocol_version }, author, users_dir, error_writer, sess), │ │522 } │ │523 } │ │524 │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────╮ │546 io: std.Io, │ │547 arena: *std.heap.ArenaAllocator,│ │548 admin_repo_path: []const u8, │ │550 - repo_root_path: []const u8, │ │549 + users_dir: []const u8, │ │550 owner_name: []const u8, │ │551 repo_name: []const u8, │ │552 service: GitService, │ ╰─────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │560 defer admin.deinit(io, allocator); │ │561 │ │562 const moment = try evt.currentMoment(evt.admin_repo_opts, &admin); │ │564 - const repo = (try evt.readRepoByOwnerAndName(io, allocator, arena, moment, repo_root_path, owner_name, repo_name)) orelse {│ │563 + const repo = (try evt.readRepoByOwnerAndName(io, allocator, arena, moment, users_dir, owner_name, repo_name)) orelse { │ │564 if (service == .upload_pack) return .not_found; │ │565 const owner = (try evt.User.readByName(io, allocator, admin_repo_path, arena, owner_name)) orelse return .not_found; │ │566 return if (isKeyInAuthorizedKeys(owner.event.ssh_keys, fingerprint)) │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ───────────────╮ │src/test/event/admin.zig│ ╰────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────╮ │311 const temp_path = try temp.dir.realPathFileAlloc(io, ".", allocator); │ │312 defer allocator.free(temp_path); │ │313 │ │314 - const repos_dir = try std.fs.path.join(allocator, &.{ temp_path, "repos" }); │ │315 - defer allocator.free(repos_dir); │ │314 + const users_dir = try std.fs.path.join(allocator, &.{ temp_path, "users" }); │ │315 + defer allocator.free(users_dir); │ │316 const admin_path = try std.fs.path.join(allocator, &.{ temp_path, "admin" });│ │317 defer allocator.free(admin_path); │ │318 │ ╰──────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────╮ │319 var prng = std.Random.DefaultPrng.init(std.testing.random_seed);│ │320 const user_id = evt.EventWithId.randomId(prng.random()); │ │321 const repo_id = evt.EventWithId.randomId(prng.random()); │ │322 - const repo_id_hex = std.fmt.bytesToHex(repo_id, .lower); │ │322 const fork_id = evt.EventWithId.randomId(prng.random()); │ │323 const fork_id_hex = std.fmt.bytesToHex(fork_id, .lower); │ │324 │ ╰─────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────╮ │336 } }, │ │337 }, │ │338 }); │ │340 - const user_repo_path = try evt.userRepoPath(allocator, repos_dir, &user_id);│ │339 + const user_repo_path = try evt.userRepoPath(allocator, users_dir, &user_id);│ │340 defer allocator.free(user_repo_path); │ │341 var user_repo = try evt.initUserRepo(io, allocator, user_repo_path); │ │342 defer user_repo.deinit(io, allocator); │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯