╭ changed ──────╮ │src/ui/Fork.zig│ ╰───────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────╮ │34 │ │35 pub fn init(arena: *std.heap.ArenaAllocator, session: *ui.Session, route: ui.RoutablePage) !Self {│ │36 const io = session.io orelse return error.NotFound; │ │37 - const repos_dir = session.repos_dir orelse return error.NotFound; │ │37 + const users_dir = session.users_dir orelse return error.NotFound; │ │38 const haxy_moment = session.haxy_moment orelse return error.NoMoment; │ │39 const route_fork = route.forkRoute() orelse return error.UnexpectedRoute; │ │40 // the route's identity names the forker and the target repo │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │42 const id = evt.parseEventId(route_fork.id.slice()) catch return error.NotFound; │ │43 const gpa = arena.child_allocator; │ │44 const forker_id = (try evt.User.readIdByName(evt.AdminDB, evt.admin_repo_opts.hash, haxy_moment, identity.owner)) orelse return error.NotFound;│ │45 - const fork_record = (try evt.readForkById(io, gpa, arena, repos_dir, &forker_id, &id)) orelse return error.NotFound; │ │45 + const fork_record = (try evt.readForkById(io, gpa, arena, users_dir, &forker_id, &id)) orelse return error.NotFound; │ │46 if (fork_record.removed) return error.NotFound; │ │47 if (fork_record.event.repo_id.len != evt.event_id_size) return error.NotFound; │ │48 var target_id: [evt.event_id_size]u8 = undefined; │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │49 @memcpy(&target_id, fork_record.event.repo_id); │ │50 const owner_id = fork_record.event.repo_user_id[0..evt.event_id_size]; │ │51 │ │52 - const target_record = (try evt.readRepoById(io, gpa, arena, repos_dir, owner_id, fork_record.event.repo_id)) orelse return error.NotFound;│ │52 + const target_record = (try evt.readRepoById(io, gpa, arena, users_dir, owner_id, fork_record.event.repo_id)) orelse return error.NotFound;│ │53 // a draft is as readable as the repo it targets │ │54 if (evt.Repo.roleOf(target_record, session.userId()) == .none) return error.NotFound; │ │55 const owner = (try evt.User.readById(evt.AdminDB, evt.admin_repo_opts.hash, haxy_moment, arena, owner_id)) orelse return error.NotFound; │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │58 const aa = arena.allocator(); │ │59 const target_identity = try std.fmt.allocPrint(aa, "{s}/{s}", .{ owner.event.name, target_record.event.name }); │ │60 const id_hex = std.fmt.bytesToHex(id, .lower); │ │61 - const fork_path = try fork.forkPath(aa, repos_dir, &id_hex); │ │61 + const fork_path = try fork.forkPath(aa, users_dir, &forker_id, &id); │ │62 var fork_repo = try rp.Repo(.xit, .{}).open(io, arena.child_allocator, .{ .path = fork_path, .require_repo_root = true });│ │63 defer fork_repo.deinit(io, arena.child_allocator); │ │64 const fork_moment = try evt.currentMoment(.{}, &fork_repo); │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │71 @memcpy(&commits_base_oid, revision.record.event.base_oid); │ │72 } │ │73 │ │74 - const target_id_hex = std.fmt.bytesToHex(target_id, .lower); │ │75 - const target_path = try std.fs.path.join(aa, &.{ repos_dir, &target_id_hex }); │ │74 + const target_path = try evt.repoPath(aa, users_dir, owner_id, &target_id); │ │75 const target_source = ui.RepoSource{ .path = target_path, .repo_kind = .xit }; │ │76 var target_repo_maybe: ?rp.Repo(.xit, .{}) = if (!target_record.removed) │ │77 rp.Repo(.xit, .{}).open(io, arena.child_allocator, target_source.localInitOpts()) catch null│ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────╯