)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"70a008800c5ab2d539dc668caaac68d7dfebfe9a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ea4f59ae_1df50fca","updated":"2023-06-07 20:02:19.000000000","message":"I\u0027ll split this up in a subsequent patch, but that won\u0027t meaningfully change the code.","commit_id":"170b2ee7f7d31adaed53a6fafafb0be8fe888e28"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"909a75caf499737c9cdba7e4dd28f4de5c0f49e1","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"542b6bd5_ba5f46ba","updated":"2023-06-07 10:20:02.000000000","message":"Perhaps consider splitting this up into subpackages? That\u0027s a lot of only tangentially-related logic in one single namespace, and it makes it a bit difficult to review.","commit_id":"170b2ee7f7d31adaed53a6fafafb0be8fe888e28"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"cb16bb12a347650eaef4c5a6d14c1b535613c32a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"17fd13c3_b6ce77b2","in_reply_to":"542b6bd5_ba5f46ba","updated":"2023-06-13 13:23:51.000000000","message":"Let\u0027s get this merged now as it\u0027s good enough and it\u0027s blocking.","commit_id":"170b2ee7f7d31adaed53a6fafafb0be8fe888e28"}],"metropolis/pkg/kmod/manager.go":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"909a75caf499737c9cdba7e4dd28f4de5c0f49e1","unresolved":true,"context_lines":[{"line_number":22,"context_line":"// instance should be kept alive. It currently does not support unloading"},{"line_number":23,"context_line":"// modules, but that can be added to the existing design if deemed necessary."},{"line_number":24,"context_line":"type Manager struct {"},{"line_number":25,"context_line":"\t// Path relative to which paths in the metadata should be interpreted to."},{"line_number":26,"context_line":"\tmodulesPath string"},{"line_number":27,"context_line":"\tmeta        *kmodpb.Meta"},{"line_number":28,"context_line":"\t// Extra map to quickly find module indexes from names"}],"source_content_type":"text/x-go","patch_set":1,"id":"637ff91b_bacfc15a","line":25,"range":{"start_line":25,"start_character":4,"end_line":25,"end_character":74},"updated":"2023-06-07 10:20:02.000000000","message":"Parse error","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c5e9e78a37e4780e627cea55766bd2a8d4f6c710","unresolved":false,"context_lines":[{"line_number":22,"context_line":"// instance should be kept alive. It currently does not support unloading"},{"line_number":23,"context_line":"// modules, but that can be added to the existing design if deemed necessary."},{"line_number":24,"context_line":"type Manager struct {"},{"line_number":25,"context_line":"\t// Path relative to which paths in the metadata should be interpreted to."},{"line_number":26,"context_line":"\tmodulesPath string"},{"line_number":27,"context_line":"\tmeta        *kmodpb.Meta"},{"line_number":28,"context_line":"\t// Extra map to quickly find module indexes from names"}],"source_content_type":"text/x-go","patch_set":1,"id":"116f1ad9_529ec308","line":25,"range":{"start_line":25,"start_character":4,"end_line":25,"end_character":74},"in_reply_to":"637ff91b_bacfc15a","updated":"2023-06-12 17:07:08.000000000","message":"Done","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"}],"metropolis/pkg/kmod/meta.go":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"909a75caf499737c9cdba7e4dd28f4de5c0f49e1","unresolved":true,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"// MakeMeta creates a metadata structure for a directory of kernel modules as"},{"line_number":16,"context_line":"// well as a builtins modinfo file."},{"line_number":17,"context_line":"func MakeMeta(builtinModinfoPath, modulesPath string) (*kmodpb.Meta, error) {"},{"line_number":18,"context_line":"\tmodIndices :\u003d make(map[string]uint32)"},{"line_number":19,"context_line":"\tmodInfoMap :\u003d make(map[string]ModuleInfo)"},{"line_number":20,"context_line":"\tvar meta *kmodpb.Meta"}],"source_content_type":"text/x-go","patch_set":2,"id":"cd4b4f2f_bff4f369","line":17,"range":{"start_line":17,"start_character":5,"end_line":17,"end_character":13},"updated":"2023-06-07 10:20:02.000000000","message":"Do we actually need this?","commit_id":"170b2ee7f7d31adaed53a6fafafb0be8fe888e28"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"70a008800c5ab2d539dc668caaac68d7dfebfe9a","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"// MakeMeta creates a metadata structure for a directory of kernel modules as"},{"line_number":16,"context_line":"// well as a builtins modinfo file."},{"line_number":17,"context_line":"func MakeMeta(builtinModinfoPath, modulesPath string) (*kmodpb.Meta, error) {"},{"line_number":18,"context_line":"\tmodIndices :\u003d make(map[string]uint32)"},{"line_number":19,"context_line":"\tmodInfoMap :\u003d make(map[string]ModuleInfo)"},{"line_number":20,"context_line":"\tvar meta *kmodpb.Meta"}],"source_content_type":"text/x-go","patch_set":2,"id":"69ba839d_940e6bc8","line":17,"range":{"start_line":17,"start_character":5,"end_line":17,"end_character":13},"in_reply_to":"cd4b4f2f_bff4f369","updated":"2023-06-07 20:02:19.000000000","message":"Actually no, we don\u0027t.","commit_id":"170b2ee7f7d31adaed53a6fafafb0be8fe888e28"}],"metropolis/pkg/kmod/modinfo.go":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"909a75caf499737c9cdba7e4dd28f4de5c0f49e1","unresolved":true,"context_lines":[{"line_number":64,"context_line":"\tvar out OptionalDependencies"},{"line_number":65,"context_line":"\tfor _, s :\u003d range i[\"softdep\"] {"},{"line_number":66,"context_line":"\t\ttokens :\u003d strings.Fields(s)"},{"line_number":67,"context_line":"\t\tvar mode int"},{"line_number":68,"context_line":"\t\tconst ("},{"line_number":69,"context_line":"\t\t\tMODE_IDLE \u003d 0"},{"line_number":70,"context_line":"\t\t\tMODE_PRE  \u003d 1"}],"source_content_type":"text/x-go","patch_set":2,"id":"478ee809_ba01198b","line":67,"range":{"start_line":67,"start_character":2,"end_line":67,"end_character":14},"updated":"2023-06-07 10:20:02.000000000","message":"nit: `mode :\u003d MODE_IDLE` below the consts? Also maybe `state` instead of `mode` to hint that this is a state machine.","commit_id":"170b2ee7f7d31adaed53a6fafafb0be8fe888e28"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"70a008800c5ab2d539dc668caaac68d7dfebfe9a","unresolved":false,"context_lines":[{"line_number":64,"context_line":"\tvar out OptionalDependencies"},{"line_number":65,"context_line":"\tfor _, s :\u003d range i[\"softdep\"] {"},{"line_number":66,"context_line":"\t\ttokens :\u003d strings.Fields(s)"},{"line_number":67,"context_line":"\t\tvar mode int"},{"line_number":68,"context_line":"\t\tconst ("},{"line_number":69,"context_line":"\t\t\tMODE_IDLE \u003d 0"},{"line_number":70,"context_line":"\t\t\tMODE_PRE  \u003d 1"}],"source_content_type":"text/x-go","patch_set":2,"id":"d1162fa4_dad7259c","line":67,"range":{"start_line":67,"start_character":2,"end_line":67,"end_character":14},"in_reply_to":"478ee809_ba01198b","updated":"2023-06-07 20:02:19.000000000","message":"Done","commit_id":"170b2ee7f7d31adaed53a6fafafb0be8fe888e28"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"909a75caf499737c9cdba7e4dd28f4de5c0f49e1","unresolved":true,"context_lines":[{"line_number":178,"context_line":"\t\tif !ok {"},{"line_number":179,"context_line":"\t\t\tcontinue"},{"line_number":180,"context_line":"\t\t}"},{"line_number":181,"context_line":"\t\tif string(modName) !\u003d currModule.Name() {"},{"line_number":182,"context_line":"\t\t\tif currModule.Name() !\u003d \"\" {"},{"line_number":183,"context_line":"\t\t\t\tout \u003d append(out, currModule)"},{"line_number":184,"context_line":"\t\t\t}"}],"source_content_type":"text/x-go","patch_set":2,"id":"b9a2034e_8ea9c4bf","line":181,"range":{"start_line":181,"start_character":2,"end_line":181,"end_character":43},"updated":"2023-06-07 10:20:02.000000000","message":"This will break if we have an unsorted modinfo file. Perhaps we should sort it just in case?","commit_id":"170b2ee7f7d31adaed53a6fafafb0be8fe888e28"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"834008c2b1f461ae3580925420c7a4f0f347d991","unresolved":false,"context_lines":[{"line_number":178,"context_line":"\t\tif !ok {"},{"line_number":179,"context_line":"\t\t\tcontinue"},{"line_number":180,"context_line":"\t\t}"},{"line_number":181,"context_line":"\t\tif string(modName) !\u003d currModule.Name() {"},{"line_number":182,"context_line":"\t\t\tif currModule.Name() !\u003d \"\" {"},{"line_number":183,"context_line":"\t\t\t\tout \u003d append(out, currModule)"},{"line_number":184,"context_line":"\t\t\t}"}],"source_content_type":"text/x-go","patch_set":2,"id":"26cd111c_f8ad3498","line":181,"range":{"start_line":181,"start_character":2,"end_line":181,"end_character":43},"in_reply_to":"0ee88de1_e0483d5c","updated":"2023-06-12 09:17:33.000000000","message":"Done","commit_id":"170b2ee7f7d31adaed53a6fafafb0be8fe888e28"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"70a008800c5ab2d539dc668caaac68d7dfebfe9a","unresolved":true,"context_lines":[{"line_number":178,"context_line":"\t\tif !ok {"},{"line_number":179,"context_line":"\t\t\tcontinue"},{"line_number":180,"context_line":"\t\t}"},{"line_number":181,"context_line":"\t\tif string(modName) !\u003d currModule.Name() {"},{"line_number":182,"context_line":"\t\t\tif currModule.Name() !\u003d \"\" {"},{"line_number":183,"context_line":"\t\t\t\tout \u003d append(out, currModule)"},{"line_number":184,"context_line":"\t\t\t}"}],"source_content_type":"text/x-go","patch_set":2,"id":"0ee88de1_e0483d5c","line":181,"range":{"start_line":181,"start_character":2,"end_line":181,"end_character":43},"in_reply_to":"b9a2034e_8ea9c4bf","updated":"2023-06-07 20:02:19.000000000","message":"It would only break if the k/v pairs from the same module are not adjacent, not if the modules aren\u0027t sorted. Sorting would require dropping the streaming read. Considering that the kernel generates this by going though its own metadata, I don\u0027t think this is likely to happen. I added an additional sanity check to error out if this were to ever happen.","commit_id":"170b2ee7f7d31adaed53a6fafafb0be8fe888e28"}],"metropolis/pkg/kmod/radix.go":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"909a75caf499737c9cdba7e4dd28f4de5c0f49e1","unresolved":true,"context_lines":[{"line_number":17,"context_line":"\tfor idx :\u003d range matches {"},{"line_number":18,"context_line":"\t\tmods \u003d append(mods, meta.Modules[idx])"},{"line_number":19,"context_line":"\t}"},{"line_number":20,"context_line":"\treturn"},{"line_number":21,"context_line":"}"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"func lookupModulesRec(n *kmodpb.RadixNode, needle string, matches map[uint32]bool) {"}],"source_content_type":"text/x-go","patch_set":1,"id":"b0331f25_f66b8409","line":20,"range":{"start_line":20,"start_character":1,"end_line":20,"end_character":7},"updated":"2023-06-07 10:20:02.000000000","message":"Sort the result.","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"70a008800c5ab2d539dc668caaac68d7dfebfe9a","unresolved":false,"context_lines":[{"line_number":17,"context_line":"\tfor idx :\u003d range matches {"},{"line_number":18,"context_line":"\t\tmods \u003d append(mods, meta.Modules[idx])"},{"line_number":19,"context_line":"\t}"},{"line_number":20,"context_line":"\treturn"},{"line_number":21,"context_line":"}"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"func lookupModulesRec(n *kmodpb.RadixNode, needle string, matches map[uint32]bool) {"}],"source_content_type":"text/x-go","patch_set":1,"id":"2f0793b7_b346c3e8","line":20,"range":{"start_line":20,"start_character":1,"end_line":20,"end_character":7},"in_reply_to":"b0331f25_f66b8409","updated":"2023-06-07 20:02:19.000000000","message":"Done","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"909a75caf499737c9cdba7e4dd28f4de5c0f49e1","unresolved":true,"context_lines":[{"line_number":24,"context_line":"\tfor _, c :\u003d range n.Children {"},{"line_number":25,"context_line":"\t\tswitch c.Type {"},{"line_number":26,"context_line":"\t\tcase kmodpb.RadixNode_LITERAL:"},{"line_number":27,"context_line":"\t\t\tif len(needle) \u003c len(c.Literal) {"},{"line_number":28,"context_line":"\t\t\t\tcontinue"},{"line_number":29,"context_line":"\t\t\t}"},{"line_number":30,"context_line":"\t\t\tif c.Literal \u003d\u003d needle[:len(c.Literal)] {"},{"line_number":31,"context_line":"\t\t\t\tlookupModulesRec(c, needle[len(c.Literal):], matches)"},{"line_number":32,"context_line":"\t\t\t}"},{"line_number":33,"context_line":"\t\tcase kmodpb.RadixNode_WILDCARD:"},{"line_number":34,"context_line":"\t\t\tfor i :\u003d 0; i \u003c\u003d len(needle); i++ {"},{"line_number":35,"context_line":"\t\t\t\tlookupModulesRec(c, needle[i:], matches)"}],"source_content_type":"text/x-go","patch_set":1,"id":"1ff326d9_1fdd377f","line":32,"range":{"start_line":27,"start_character":3,"end_line":32,"end_character":4},"updated":"2023-06-07 10:20:02.000000000","message":"```suggestion\n\t\t\tif after, ok :\u003d strings.CutPrefix(needle, c.Literal); ok {\n\t\t\t\tlookupModulesRec(c, after, matches)\n\t\t\t}\n```","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"834008c2b1f461ae3580925420c7a4f0f347d991","unresolved":false,"context_lines":[{"line_number":24,"context_line":"\tfor _, c :\u003d range n.Children {"},{"line_number":25,"context_line":"\t\tswitch c.Type {"},{"line_number":26,"context_line":"\t\tcase kmodpb.RadixNode_LITERAL:"},{"line_number":27,"context_line":"\t\t\tif len(needle) \u003c len(c.Literal) {"},{"line_number":28,"context_line":"\t\t\t\tcontinue"},{"line_number":29,"context_line":"\t\t\t}"},{"line_number":30,"context_line":"\t\t\tif c.Literal \u003d\u003d needle[:len(c.Literal)] {"},{"line_number":31,"context_line":"\t\t\t\tlookupModulesRec(c, needle[len(c.Literal):], matches)"},{"line_number":32,"context_line":"\t\t\t}"},{"line_number":33,"context_line":"\t\tcase kmodpb.RadixNode_WILDCARD:"},{"line_number":34,"context_line":"\t\t\tfor i :\u003d 0; i \u003c\u003d len(needle); i++ {"},{"line_number":35,"context_line":"\t\t\t\tlookupModulesRec(c, needle[i:], matches)"}],"source_content_type":"text/x-go","patch_set":1,"id":"e758c2c9_c418c871","line":32,"range":{"start_line":27,"start_character":3,"end_line":32,"end_character":4},"in_reply_to":"1b30c619_199809d9","updated":"2023-06-12 09:17:33.000000000","message":"Ack","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"70a008800c5ab2d539dc668caaac68d7dfebfe9a","unresolved":true,"context_lines":[{"line_number":24,"context_line":"\tfor _, c :\u003d range n.Children {"},{"line_number":25,"context_line":"\t\tswitch c.Type {"},{"line_number":26,"context_line":"\t\tcase kmodpb.RadixNode_LITERAL:"},{"line_number":27,"context_line":"\t\t\tif len(needle) \u003c len(c.Literal) {"},{"line_number":28,"context_line":"\t\t\t\tcontinue"},{"line_number":29,"context_line":"\t\t\t}"},{"line_number":30,"context_line":"\t\t\tif c.Literal \u003d\u003d needle[:len(c.Literal)] {"},{"line_number":31,"context_line":"\t\t\t\tlookupModulesRec(c, needle[len(c.Literal):], matches)"},{"line_number":32,"context_line":"\t\t\t}"},{"line_number":33,"context_line":"\t\tcase kmodpb.RadixNode_WILDCARD:"},{"line_number":34,"context_line":"\t\t\tfor i :\u003d 0; i \u003c\u003d len(needle); i++ {"},{"line_number":35,"context_line":"\t\t\t\tlookupModulesRec(c, needle[i:], matches)"}],"source_content_type":"text/x-go","patch_set":1,"id":"1b30c619_199809d9","line":32,"range":{"start_line":27,"start_character":3,"end_line":32,"end_character":4},"in_reply_to":"1ff326d9_1fdd377f","updated":"2023-06-07 20:02:19.000000000","message":"Sadly that method is 1.20+, we\u0027re still on 1.18.","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"909a75caf499737c9cdba7e4dd28f4de5c0f49e1","unresolved":true,"context_lines":[{"line_number":56,"context_line":"\treturn"},{"line_number":57,"context_line":"}"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"func AddPattern(root *kmodpb.RadixNode, pattern string, moduleIndex uint32) error {"},{"line_number":60,"context_line":"\tpp, err :\u003d parsePattern(pattern)"},{"line_number":61,"context_line":"\tif err !\u003d nil {"},{"line_number":62,"context_line":"\t\treturn fmt.Errorf(\"error parsing pattern %q: %w\", pattern, err)"}],"source_content_type":"text/x-go","patch_set":1,"id":"07fd85ff_47a780f8","line":59,"updated":"2023-06-07 10:20:02.000000000","message":"Exported function, add godoc.","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"70a008800c5ab2d539dc668caaac68d7dfebfe9a","unresolved":false,"context_lines":[{"line_number":56,"context_line":"\treturn"},{"line_number":57,"context_line":"}"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"func AddPattern(root *kmodpb.RadixNode, pattern string, moduleIndex uint32) error {"},{"line_number":60,"context_line":"\tpp, err :\u003d parsePattern(pattern)"},{"line_number":61,"context_line":"\tif err !\u003d nil {"},{"line_number":62,"context_line":"\t\treturn fmt.Errorf(\"error parsing pattern %q: %w\", pattern, err)"}],"source_content_type":"text/x-go","patch_set":1,"id":"97bcc7f3_b00ca426","line":59,"in_reply_to":"07fd85ff_47a780f8","updated":"2023-06-07 20:02:19.000000000","message":"Done","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"909a75caf499737c9cdba7e4dd28f4de5c0f49e1","unresolved":true,"context_lines":[{"line_number":64,"context_line":"\tif len(pp) \u003e 0 {"},{"line_number":65,"context_line":"\t\tpp[len(pp)-1].ModuleIndex \u003d []uint32{moduleIndex}"},{"line_number":66,"context_line":"\t} else {"},{"line_number":67,"context_line":"\t\troot.ModuleIndex \u003d append(root.ModuleIndex, moduleIndex)"},{"line_number":68,"context_line":"\t}"},{"line_number":69,"context_line":"\treturn addPatternRec(root, pp, nil)"},{"line_number":70,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":1,"id":"9a2d3c0e_608bccaf","line":67,"range":{"start_line":67,"start_character":2,"end_line":67,"end_character":58},"updated":"2023-06-07 10:20:02.000000000","message":"Why would we ever have a pattern that parses into an empty list?","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"8e642aef4ba4d2b1b9a162c36df94162e4bca3a4","unresolved":false,"context_lines":[{"line_number":64,"context_line":"\tif len(pp) \u003e 0 {"},{"line_number":65,"context_line":"\t\tpp[len(pp)-1].ModuleIndex \u003d []uint32{moduleIndex}"},{"line_number":66,"context_line":"\t} else {"},{"line_number":67,"context_line":"\t\troot.ModuleIndex \u003d append(root.ModuleIndex, moduleIndex)"},{"line_number":68,"context_line":"\t}"},{"line_number":69,"context_line":"\treturn addPatternRec(root, pp, nil)"},{"line_number":70,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":1,"id":"56c800a5_9aaf949f","line":67,"range":{"start_line":67,"start_character":2,"end_line":67,"end_character":58},"in_reply_to":"0559a9dd_400e17eb","updated":"2023-06-12 16:24:13.000000000","message":"Done","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"70a008800c5ab2d539dc668caaac68d7dfebfe9a","unresolved":true,"context_lines":[{"line_number":64,"context_line":"\tif len(pp) \u003e 0 {"},{"line_number":65,"context_line":"\t\tpp[len(pp)-1].ModuleIndex \u003d []uint32{moduleIndex}"},{"line_number":66,"context_line":"\t} else {"},{"line_number":67,"context_line":"\t\troot.ModuleIndex \u003d append(root.ModuleIndex, moduleIndex)"},{"line_number":68,"context_line":"\t}"},{"line_number":69,"context_line":"\treturn addPatternRec(root, pp, nil)"},{"line_number":70,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":1,"id":"d76e4fd0_d220d531","line":67,"range":{"start_line":67,"start_character":2,"end_line":67,"end_character":58},"in_reply_to":"9a2d3c0e_608bccaf","updated":"2023-06-07 20:02:19.000000000","message":"This was found by the fuzzer, instead of carving it out of the fuzzer I decided to implement the behavior here.","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"834008c2b1f461ae3580925420c7a4f0f347d991","unresolved":true,"context_lines":[{"line_number":64,"context_line":"\tif len(pp) \u003e 0 {"},{"line_number":65,"context_line":"\t\tpp[len(pp)-1].ModuleIndex \u003d []uint32{moduleIndex}"},{"line_number":66,"context_line":"\t} else {"},{"line_number":67,"context_line":"\t\troot.ModuleIndex \u003d append(root.ModuleIndex, moduleIndex)"},{"line_number":68,"context_line":"\t}"},{"line_number":69,"context_line":"\treturn addPatternRec(root, pp, nil)"},{"line_number":70,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":1,"id":"0559a9dd_400e17eb","line":67,"range":{"start_line":67,"start_character":2,"end_line":67,"end_character":58},"in_reply_to":"d76e4fd0_d220d531","updated":"2023-06-12 09:17:33.000000000","message":"Mention this in a comment and we\u0027re good to go then.","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"909a75caf499737c9cdba7e4dd28f4de5c0f49e1","unresolved":true,"context_lines":[{"line_number":70,"context_line":"}"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"// addPatternRec recursively adds a new pattern to the radix tree."},{"line_number":73,"context_line":"func addPatternRec(n *kmodpb.RadixNode, parts []*kmodpb.RadixNode, currPartOverride *kmodpb.RadixNode) error {"},{"line_number":74,"context_line":"\tif len(parts) \u003d\u003d 0 {"},{"line_number":75,"context_line":"\t\treturn nil"},{"line_number":76,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":1,"id":"088b5ac1_638070c6","line":73,"range":{"start_line":73,"start_character":67,"end_line":73,"end_character":83},"updated":"2023-06-07 10:20:02.000000000","message":"Document currPartOverride.","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"70a008800c5ab2d539dc668caaac68d7dfebfe9a","unresolved":false,"context_lines":[{"line_number":70,"context_line":"}"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"// addPatternRec recursively adds a new pattern to the radix tree."},{"line_number":73,"context_line":"func addPatternRec(n *kmodpb.RadixNode, parts []*kmodpb.RadixNode, currPartOverride *kmodpb.RadixNode) error {"},{"line_number":74,"context_line":"\tif len(parts) \u003d\u003d 0 {"},{"line_number":75,"context_line":"\t\treturn nil"},{"line_number":76,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":1,"id":"08e7ef85_3e425a50","line":73,"range":{"start_line":73,"start_character":67,"end_line":73,"end_character":83},"in_reply_to":"088b5ac1_638070c6","updated":"2023-06-07 20:02:19.000000000","message":"Done","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"909a75caf499737c9cdba7e4dd28f4de5c0f49e1","unresolved":true,"context_lines":[{"line_number":179,"context_line":"\tcase kmodpb.RadixNode_BYTE_RANGE:"},{"line_number":180,"context_line":"\t\tfmt.Printf(\"[%c-%c]: \", rune(r.StartByte), rune(r.EndByte))"},{"line_number":181,"context_line":"\tdefault:"},{"line_number":182,"context_line":"\t\tlog.Fatalf(\"Unknown tree type %T\\n\", r)"},{"line_number":183,"context_line":"\t}"},{"line_number":184,"context_line":"\tif len(r.Children) \u003d\u003d 1 {"},{"line_number":185,"context_line":"\t\tprintTree(r.Children[0], indent, true)"}],"source_content_type":"text/x-go","patch_set":1,"id":"8c6cd4d8_a093bcb3","line":182,"range":{"start_line":182,"start_character":22,"end_line":182,"end_character":26},"updated":"2023-06-07 10:20:02.000000000","message":"```suggestion\n\t\tlog.Fatalf(\"Unknown node type %T\\n\", r)\n```\n\nAlso might be worth mentioning/reiterating in a godoc somewhere that this parser (or even entire system) is not designed to handle malicious input (eg. due to the above panic).","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"70a008800c5ab2d539dc668caaac68d7dfebfe9a","unresolved":true,"context_lines":[{"line_number":179,"context_line":"\tcase kmodpb.RadixNode_BYTE_RANGE:"},{"line_number":180,"context_line":"\t\tfmt.Printf(\"[%c-%c]: \", rune(r.StartByte), rune(r.EndByte))"},{"line_number":181,"context_line":"\tdefault:"},{"line_number":182,"context_line":"\t\tlog.Fatalf(\"Unknown tree type %T\\n\", r)"},{"line_number":183,"context_line":"\t}"},{"line_number":184,"context_line":"\tif len(r.Children) \u003d\u003d 1 {"},{"line_number":185,"context_line":"\t\tprintTree(r.Children[0], indent, true)"}],"source_content_type":"text/x-go","patch_set":1,"id":"afd2a3ea_d0a5e8ef","line":182,"range":{"start_line":182,"start_character":22,"end_line":182,"end_character":26},"in_reply_to":"8c6cd4d8_a093bcb3","updated":"2023-06-07 20:02:19.000000000","message":"Everything else is fuzzed, it should be safe against malicious input. I added a comment to remind people that PrintTree can exit, it already has a comment saying that it is for diagnostic use only.","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"834008c2b1f461ae3580925420c7a4f0f347d991","unresolved":false,"context_lines":[{"line_number":179,"context_line":"\tcase kmodpb.RadixNode_BYTE_RANGE:"},{"line_number":180,"context_line":"\t\tfmt.Printf(\"[%c-%c]: \", rune(r.StartByte), rune(r.EndByte))"},{"line_number":181,"context_line":"\tdefault:"},{"line_number":182,"context_line":"\t\tlog.Fatalf(\"Unknown tree type %T\\n\", r)"},{"line_number":183,"context_line":"\t}"},{"line_number":184,"context_line":"\tif len(r.Children) \u003d\u003d 1 {"},{"line_number":185,"context_line":"\t\tprintTree(r.Children[0], indent, true)"}],"source_content_type":"text/x-go","patch_set":1,"id":"a7aaa41e_f5cbe5d3","line":182,"range":{"start_line":182,"start_character":22,"end_line":182,"end_character":26},"in_reply_to":"afd2a3ea_d0a5e8ef","updated":"2023-06-12 09:17:33.000000000","message":"Done","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"909a75caf499737c9cdba7e4dd28f4de5c0f49e1","unresolved":true,"context_lines":[{"line_number":86,"context_line":"\t\t}"},{"line_number":87,"context_line":"\t\tswitch c.Type {"},{"line_number":88,"context_line":"\t\tcase kmodpb.RadixNode_LITERAL:"},{"line_number":89,"context_line":"\t\t\tif c.Literal[0] \u003d\u003d currPart.Literal[0] {"},{"line_number":90,"context_line":"\t\t\t\tvar i int"},{"line_number":91,"context_line":"\t\t\t\tfor i \u003c len(c.Literal) \u0026\u0026 i \u003c len(currPart.Literal) \u0026\u0026 c.Literal[i] \u003d\u003d currPart.Literal[i] {"},{"line_number":92,"context_line":"\t\t\t\t\ti++"}],"source_content_type":"text/x-go","patch_set":2,"id":"9a7a88be_05cb7292","line":89,"range":{"start_line":89,"start_character":3,"end_line":89,"end_character":43},"updated":"2023-06-07 10:20:02.000000000","message":"This algorithm may be cleaner to implement by doing this in two passes:\n\n1. First, always build the RadixNode tree using one-character long literal nodes (removes most of lines 90-135 which are annoyingly hairy). This is then a simple trie.\n2. Then, do a second pass where the trie is compressed to a proper radix tree (ie. single-character literal chains are compressed into longer single nodes with longer literal chains).\n\nThis trades off the time to build the tree for a simpler codebase. We start with a space-inefficient simple trie (that is easy and fast to insert into, but blows up memory) and then we do a one-step conversion to a space-efficient radix trie (which is fast to look up and space-efficient, but a pain to insert into) Which I think is useful, as we\u0027re building the tree once, ahead of time.\n\nI don\u0027t have a good reference to link for how to implement the compression outlined in step 2, but I think a pre-order traversal of the tree which first attempts to merge the currently traversed node with its single child (if applicable) would be correct?","commit_id":"170b2ee7f7d31adaed53a6fafafb0be8fe888e28"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c5e9e78a37e4780e627cea55766bd2a8d4f6c710","unresolved":true,"context_lines":[{"line_number":86,"context_line":"\t\t}"},{"line_number":87,"context_line":"\t\tswitch c.Type {"},{"line_number":88,"context_line":"\t\tcase kmodpb.RadixNode_LITERAL:"},{"line_number":89,"context_line":"\t\t\tif c.Literal[0] \u003d\u003d currPart.Literal[0] {"},{"line_number":90,"context_line":"\t\t\t\tvar i int"},{"line_number":91,"context_line":"\t\t\t\tfor i \u003c len(c.Literal) \u0026\u0026 i \u003c len(currPart.Literal) \u0026\u0026 c.Literal[i] \u003d\u003d currPart.Literal[i] {"},{"line_number":92,"context_line":"\t\t\t\t\ti++"}],"source_content_type":"text/x-go","patch_set":2,"id":"c63f7285_fb923114","line":89,"range":{"start_line":89,"start_character":3,"end_line":89,"end_character":43},"in_reply_to":"9a7a88be_05cb7292","updated":"2023-06-12 17:07:08.000000000","message":"While I agree that that code is hairy, the proposed approach would likely result in a lot more code. The memory usage would be high, but acceptable (~150MiB for the intermediate tree). Also while the pure insertion complexity would go down (but this would also need parsePattern to emit single-character literal nodes), the complexity of compressing the tree is likely to be almost as high as just doing nothing. It\u0027s only about ~45 lines of complex code which is likely correct as it has been fuzzed for quite some time.","commit_id":"170b2ee7f7d31adaed53a6fafafb0be8fe888e28"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"cb16bb12a347650eaef4c5a6d14c1b535613c32a","unresolved":false,"context_lines":[{"line_number":86,"context_line":"\t\t}"},{"line_number":87,"context_line":"\t\tswitch c.Type {"},{"line_number":88,"context_line":"\t\tcase kmodpb.RadixNode_LITERAL:"},{"line_number":89,"context_line":"\t\t\tif c.Literal[0] \u003d\u003d currPart.Literal[0] {"},{"line_number":90,"context_line":"\t\t\t\tvar i int"},{"line_number":91,"context_line":"\t\t\t\tfor i \u003c len(c.Literal) \u0026\u0026 i \u003c len(currPart.Literal) \u0026\u0026 c.Literal[i] \u003d\u003d currPart.Literal[i] {"},{"line_number":92,"context_line":"\t\t\t\t\ti++"}],"source_content_type":"text/x-go","patch_set":2,"id":"3cec05fe_7d28aef4","line":89,"range":{"start_line":89,"start_character":3,"end_line":89,"end_character":43},"in_reply_to":"c63f7285_fb923114","updated":"2023-06-13 13:23:51.000000000","message":"Let\u0027s get this merged now as it\u0027s good enough and it\u0027s blocking.","commit_id":"170b2ee7f7d31adaed53a6fafafb0be8fe888e28"}],"metropolis/pkg/kmod/syscall.go":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"909a75caf499737c9cdba7e4dd28f4de5c0f49e1","unresolved":true,"context_lines":[{"line_number":19,"context_line":"\tif err !\u003d nil {"},{"line_number":20,"context_line":"\t\treturn errors.New(\"invalid null byte in params\")"},{"line_number":21,"context_line":"\t}"},{"line_number":22,"context_line":"\tsc.Control(func(fd uintptr) {"},{"line_number":23,"context_line":"\t\t_, _, err \u003d unix.Syscall(unix.SYS_FINIT_MODULE, fd, uintptr(unsafe.Pointer(paramsRaw)), flags)"},{"line_number":24,"context_line":"\t})"},{"line_number":25,"context_line":"\tif err !\u003d unix.Errno(0) {"}],"source_content_type":"text/x-go","patch_set":1,"id":"88768629_3e7cc2f6","line":22,"range":{"start_line":22,"start_character":4,"end_line":22,"end_character":11},"updated":"2023-06-07 10:20:02.000000000","message":"Check return value?","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"70a008800c5ab2d539dc668caaac68d7dfebfe9a","unresolved":false,"context_lines":[{"line_number":19,"context_line":"\tif err !\u003d nil {"},{"line_number":20,"context_line":"\t\treturn errors.New(\"invalid null byte in params\")"},{"line_number":21,"context_line":"\t}"},{"line_number":22,"context_line":"\tsc.Control(func(fd uintptr) {"},{"line_number":23,"context_line":"\t\t_, _, err \u003d unix.Syscall(unix.SYS_FINIT_MODULE, fd, uintptr(unsafe.Pointer(paramsRaw)), flags)"},{"line_number":24,"context_line":"\t})"},{"line_number":25,"context_line":"\tif err !\u003d unix.Errno(0) {"}],"source_content_type":"text/x-go","patch_set":1,"id":"fbecf1b8_eac79774","line":22,"range":{"start_line":22,"start_character":4,"end_line":22,"end_character":11},"in_reply_to":"88768629_3e7cc2f6","updated":"2023-06-07 20:02:19.000000000","message":"Done","commit_id":"2f1c298c595525c7d1603327d379a4af43db5a89"}]}
