╭ changed ───╮ │src/test.zig│ ╰────────────╯ ╭─────────────────────────────────────╮ │1 comptime { │ │2 _ = @import("test/event.zig");│ │3 _ = @import("test/ssh.zig"); │ │4 + _ = @import("test/ui.zig"); │ │5 } │ │6 │ ╰─────────────────────────────────────╯ ╭ added ────────╮ │src/test/ui.zig│ ╰───────────────╯ ╭ changed ─╮ │src/ui.zig│ ╰──────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │361 // tab's data); a files-directory or commits-page change alters it. │ │362 const RepoContent = struct { identity: []const u8, files_ref_kind: ?RefKindOrOid, files_ref_value: []const u8, files_dir: []const u8, commits_start: []const u8, commits_after: usize, refs_kind: RefKind, refs_after: usize };│ │363 │ │364 - fn repoContent(r: RoutablePage) ?RepoContent { │ │365 - const name = switch (r) { │ │366 - .repo, .repo_settings, .repo_auth => |n| n.slice(), │ │367 - .repo_commits => |c| c.name.slice(), │ │368 - .repo_refs => |r2| r2.name.slice(), │ │364 + // `r` is borrowed by pointer: the returned slices point into its inline │ │365 + // route string, so it must outlive the RepoContent (passing by value would │ │366 + // leave them dangling into a freed copy). │ │367 + fn repoContent(r: *const RoutablePage) ?RepoContent { │ │368 + const name = switch (r.*) { │ │369 + .repo, .repo_settings, .repo_auth => |*n| n.slice(), │ │370 + .repo_commits => |*c| c.name.slice(), │ │371 + .repo_refs => |*r2| r2.name.slice(), │ │372 else => return null, │ │373 }; │ │374 const rf = RepoFiles.parse(name) orelse return null; │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────╮ │375 // a 0 offset means no refs pagination, so canonicalize the column to │ │376 // branch then — otherwise the base /refs route would look like a content│ │377 // change relative to the same page mirrored with kind=tag. │ │375 - const refs_after = switch (r) { │ │378 + const refs_after = switch (r.*) { │ │379 .repo_refs => |r2| r2.after, │ │380 else => 0, │ │381 }; │ ╰──────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────╮ │379 - const is_files = std.meta.activeTag(r) == .repo; │ │382 + const is_files = std.meta.activeTag(r.*) == .repo; │ │383 return .{ │ │384 .identity = rf.identity, │ │385 .files_ref_kind = if (is_files) rf.ref_kind else null,│ ╰───────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │386 .files_ref_value = if (is_files) rf.ref_value else "", │ │387 .files_dir = if (is_files) rf.dir else "", │ │385 - .commits_start = if (std.meta.activeTag(r) == .repo_commits) repoCommitsStart(name) else "", │ │386 - .commits_after = switch (r) { │ │388 + .commits_start = if (std.meta.activeTag(r.*) == .repo_commits) repoCommitsStart(name) else "",│ │389 + .commits_after = switch (r.*) { │ │390 .repo_commits => |c| c.after, │ │391 else => 0, │ │392 }, │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────╮ │390 - .refs_kind = switch (r) { │ │393 + .refs_kind = switch (r.*) { │ │394 .repo_refs => |r2| if (refs_after == 0) .branch else r2.kind,│ │395 else => .branch, │ │396 }, │ ╰──────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────╮ │400 │ │401 // true when `a` and `b` are both repo routes that render different content│ │402 pub fn repoPageChanged(a: RoutablePage, b: RoutablePage) bool { │ │400 - const ca = repoContent(a) orelse return false; │ │401 - const cb = repoContent(b) orelse return false; │ │403 + const ca = repoContent(&a) orelse return false; │ │404 + const cb = repoContent(&b) orelse return false; │ │405 return !std.mem.eql(u8, ca.identity, cb.identity) or │ │406 ca.files_ref_kind != cb.files_ref_kind or │ │407 !std.mem.eql(u8, ca.files_ref_value, cb.files_ref_value) or │ ╰────────────────────────────────────────────────────────────────────────────────────╯