╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ──╮ │src/web.zig│ ╰───────────╯ ╭────────────────────────────────────────────────────────╮ │165 + .is_local = host == .local, │ │166 }) catch |err| switch (err) { │ │167 error.NotFound => { │ │168 try request.respond("not found", .{│ ╰────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────╮ │326 fn renderIndexHtml( │ │327 io: std.Io, │ │328 allocator: std.mem.Allocator, │ │303 - admin_repo_path: []const u8, │ │329 + host: Host, │ │330 session_data: ui.Session.Data, │ │331 ) ![]const u8 { │ │332 const template = (findEmbed("/index.html") orelse return error.MissingIndexAsset).body;│ ╰────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │333 │ │308 - // open the admin repo to read live user/repo data. │ │309 - const Repo = rp.Repo(.xit, evt.admin_repo_opts); │ │310 - var repo = try Repo.open(io, allocator, .{ .path = admin_repo_path }); │ │311 - defer repo.deinit(io, allocator); │ │334 var page_arena = std.heap.ArenaAllocator.init(allocator); │ │335 defer page_arena.deinit(); │ │336 + │ │337 + // the remote admin repo must outlive the page build, since the session's │ │338 + // moment reads from it. │ │339 + var repo_maybe: ?rp.Repo(.xit, evt.admin_repo_opts) = null; │ │340 + defer if (repo_maybe) |*repo| repo.deinit(io, allocator); │ │341 │ │315 - var session = try ui.Session.init(&page_arena, &repo, session_data); │ │316 - // give the page builders filesystem access to the on-disk repos (a sibling │ │317 - // "repos" dir next to the admin repo) so the Repo page can read its files. │ │342 + var session = switch (host) { │ │343 + .remote => |remote| blk: { │ │344 + // open the admin repo to read live user/repo data. │ │345 + repo_maybe = try rp.Repo(.xit, evt.admin_repo_opts).open(io, allocator, .{ .path = remote.admin_repo_path }); │ │346 + var session = try ui.Session.init(&page_arena, &repo_maybe.?, session_data); │ │347 + // give the page builders filesystem access to the on-disk repos (a │ │348 + // sibling "repos" dir next to the admin repo) so the Repo page can │ │349 + // read its files. │ │350 + session.repos_dir = try std.fs.path.join(page_arena.allocator(), &.{ std.fs.path.dirname(remote.admin_repo_path) orelse ".", "repos" });│ │351 + break :blk session; │ │352 + }, │ │353 + .local => |local| ui.Session{ │ │354 + .data = session_data, │ │355 + .arena = &page_arena, │ │356 + .page_arena = &page_arena, │ │357 + .local = local, │ │358 + }, │ │359 + }; │ │360 session.io = io; │ │319 - session.repos_dir = try std.fs.path.join(page_arena.allocator(), &.{ std.fs.path.dirname(admin_repo_path) orelse ".", "repos" }); │ │361 │ │362 const snapshot: ui.Snapshot = .{ │ │363 .page = try ui.Page.init(session.page_arena, &session, session.data.current_page), │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯