╭ changed ──────────╮ │src/event/Issue.zig│ ╰───────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────╮ │ 5 │ │ 6 title: []const u8, │ │ 7 description: []const u8, │ │ 8 -tags: []const u8, // comma-separated │ │ 8 +tags: []const u8, // space-separated │ │ 9 status: Status = .open, │ │10 created_ts: u64 = 0, // the commit timestamp of the event that first created this issue│ │11 │ ╰───────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────╮ │22 │ │23 pub const tag_max_len = 64; │ │24 │ │25 -// a "tag,status" key names a tag's per-status issue set │ │25 +// a "tag status" key names a tag's per-status issue set (tags can't contain │ │26 +// spaces, so the pair is unambiguous) │ │27 pub const TagStatusKey = [tag_max_len + 1 + Status.longest_len]u8; │ │28 │ │29 pub fn tagStatusKey(buffer: *TagStatusKey, tag: []const u8, status: Status) ![]const u8 {│ ╰─────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────╮ │29 - return std.fmt.bufPrint(buffer, "{s},{s}", .{ tag, @tagName(status) });│ │30 + return std.fmt.bufPrint(buffer, "{s} {s}", .{ tag, @tagName(status) });│ │31 } │ │32 │ │33 pub fn tagIterator(tags: []const u8) std.mem.SplitIterator(u8, .scalar) { │ ╰───────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────╮ │33 - return std.mem.splitScalar(u8, tags, ','); │ │34 + return std.mem.splitScalar(u8, tags, ' '); │ │35 } │ │36 │ │37 // `created_ts` comes from the commit timestamp, not the event│ ╰──────────────────────────────────────────────────────────────────╯ ╭ changed ─────────╮ │src/test/event.zig│ ╰──────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │50 .issue = .{ │ │51 .title = "Login form clears password on validation error", │ │52 .description = "Submitting an invalid email address resets the password field. Preserve the field value and show an inline validation message.",│ │53 - .tags = "bug,priority-high,ui", │ │53 + .tags = "bug priority-high ui", │ │54 }, │ │55 }, │ │56 }, │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │61 .issue = .{ │ │62 .title = "Login form clears password on validation error", │ │63 .description = "Submitting an invalid email address resets the password field and removes typed input. Preserve the field value and show an inline validation message.",│ │64 - .tags = "bug,priority-low,ui", │ │64 + .tags = "bug priority-low ui", │ │65 }, │ │66 }, │ │67 }, │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │71 .issue = .{ │ │72 .title = "Search results ignore archived project filter", │ │73 .description = "Filtering search results to active projects still returns issues from archived projects. Apply the archived flag before ranking results.",│ │74 - .tags = "bug,search,backend", │ │74 + .tags = "bug search backend", │ │75 }, │ │76 }, │ │77 }, │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │81 .issue = .{ │ │82 .title = "Issue list does not persist selected sort order", │ │83 .description = "Changing the issue list sort order is lost after refresh. Store the selected sort field and direction with the user's view preferences.",│ │84 - .tags = "enhancement,frontend,preferences", │ │84 + .tags = "enhancement frontend preferences", │ │85 }, │ │86 }, │ │87 }, │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────╮ │146 .issue = .{ │ │147 .title = "Double clicking causes the form to submit twice", │ │148 .description = "When I double click the post button I see duplicate posts.",│ │149 - .tags = "bug,priority-high,ui", │ │149 + .tags = "bug priority-high ui", │ │150 }, │ │151 }, │ │152 }, │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │313 .issue = .{ │ │314 .title = "Login form clears password on validation error", │ │315 .description = "Submitting an invalid email address resets the password field. Preserve the field value and show an inline validation message.",│ │316 - .tags = "bug,priority-high,ui", │ │316 + .tags = "bug priority-high ui", │ │317 }, │ │318 }, │ │319 }, │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯