)]}'
{"/PATCHSET_LEVEL":[{"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":"90d9ff030a4df5a47ece9722de688da10c00ed7f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"eac915b2_43c120dd","updated":"2021-11-09 12:14:26.000000000","message":"Throwing this back over the wall as there\u0027s still some unresolved comments, I assume this was a mis-send?","commit_id":"3570688f71f4fc847691215c32f2cf1333c60090"}],"build/fietsje/deps_monogon.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":"5dfd2afccf5159bf82751becfe3d7c42ee7e341b","unresolved":true,"context_lines":[{"line_number":127,"context_line":"\t\t\"github.com/muesli/reflow\","},{"line_number":128,"context_line":"\t)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"\tp.collect(\"github.com/adrg/xdg\", \"v0.4.0\")"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"\t// First generate the repositories starlark rule into memory. This is because"},{"line_number":133,"context_line":"\t// rendering will lock all unlocked dependencies, which might take a while. If a"}],"source_content_type":"text/x-go","patch_set":2,"id":"83abe1aa_13a4eeee","line":130,"range":{"start_line":130,"start_character":0,"end_line":130,"end_character":43},"updated":"2021-11-02 20:07:45.000000000","message":"Add a comment that this is being used by metroctl to resolve XDG directories.","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"d4782938627a914e42fbd4cc0dc6e9ef51e8ce5c","unresolved":false,"context_lines":[{"line_number":127,"context_line":"\t\t\"github.com/muesli/reflow\","},{"line_number":128,"context_line":"\t)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"\tp.collect(\"github.com/adrg/xdg\", \"v0.4.0\")"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"\t// First generate the repositories starlark rule into memory. This is because"},{"line_number":133,"context_line":"\t// rendering will lock all unlocked dependencies, which might take a while. If a"}],"source_content_type":"text/x-go","patch_set":2,"id":"ae4c66ee_ad8dd0d8","line":130,"range":{"start_line":130,"start_character":0,"end_line":130,"end_character":43},"in_reply_to":"83abe1aa_13a4eeee","updated":"2021-11-03 17:12:38.000000000","message":"Done","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"}],"metropolis/cli/metroctl/install.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":"5dfd2afccf5159bf82751becfe3d7c42ee7e341b","unresolved":true,"context_lines":[{"line_number":19,"context_line":"var installCmd \u003d \u0026cobra.Command{"},{"line_number":20,"context_line":"\tUse:     \"install target --installer\u003dinst.efi --bundle\u003dbundle.bin\","},{"line_number":21,"context_line":"\tShort:   \"Generates a Metropolis installer disk or image.\","},{"line_number":22,"context_line":"\tExample: \"metroctl install /dev/sdx --installer\u003dinstaller_x86_64.efi --bundle\u003dmetropolis_dev_x86_64.tar.xz\","},{"line_number":23,"context_line":"\tArgs:    cobra.ExactArgs(1), // One positional argument: the target"},{"line_number":24,"context_line":"\tRun:     doInstall,"},{"line_number":25,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":2,"id":"efd08eaf_0a2cb33c","line":22,"range":{"start_line":22,"start_character":20,"end_line":22,"end_character":27},"updated":"2021-11-02 20:07:45.000000000","message":"Running `metroctl install` to not install, but to generate an installer pendrive, is unexpected. I would be very confused by this as an user.\n\nMaybe this should be called something like `metroctl mkinstaller`?","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"5dfd2afccf5159bf82751becfe3d7c42ee7e341b","unresolved":true,"context_lines":[{"line_number":19,"context_line":"var installCmd \u003d \u0026cobra.Command{"},{"line_number":20,"context_line":"\tUse:     \"install target --installer\u003dinst.efi --bundle\u003dbundle.bin\","},{"line_number":21,"context_line":"\tShort:   \"Generates a Metropolis installer disk or image.\","},{"line_number":22,"context_line":"\tExample: \"metroctl install /dev/sdx --installer\u003dinstaller_x86_64.efi --bundle\u003dmetropolis_dev_x86_64.tar.xz\","},{"line_number":23,"context_line":"\tArgs:    cobra.ExactArgs(1), // One positional argument: the target"},{"line_number":24,"context_line":"\tRun:     doInstall,"},{"line_number":25,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":2,"id":"ff027e6f_07b14a26","line":22,"range":{"start_line":22,"start_character":37,"end_line":22,"end_character":69},"updated":"2021-11-02 20:07:45.000000000","message":"What\u0027s the intended user story for --installer\u003d? How should the user know what to set there (and in --bundle\u003d)? Can we make the user not have to deal with this?","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"78468aef8c30779fb13333fd2a80a1ce1fd05d71","unresolved":true,"context_lines":[{"line_number":19,"context_line":"var installCmd \u003d \u0026cobra.Command{"},{"line_number":20,"context_line":"\tUse:     \"install target --installer\u003dinst.efi --bundle\u003dbundle.bin\","},{"line_number":21,"context_line":"\tShort:   \"Generates a Metropolis installer disk or image.\","},{"line_number":22,"context_line":"\tExample: \"metroctl install /dev/sdx --installer\u003dinstaller_x86_64.efi --bundle\u003dmetropolis_dev_x86_64.tar.xz\","},{"line_number":23,"context_line":"\tArgs:    cobra.ExactArgs(1), // One positional argument: the target"},{"line_number":24,"context_line":"\tRun:     doInstall,"},{"line_number":25,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":2,"id":"2b435e45_91d27a07","line":22,"range":{"start_line":22,"start_character":37,"end_line":22,"end_character":69},"in_reply_to":"095f12f3_d99e3c20","updated":"2021-11-04 14:08:53.000000000","message":"Can\u0027t we embed the installer EFI payloads into metroctl? How large is the x86_64 payload?\n\nAlternatively, I would seriously consider bundling the installer EFI payload into the bundle and extracting it here in the installer generator (keeping it in the bundle that gets copied over to the pendrive).\n\nThis also should require some consideration regarding chain of trust. What\u0027s the plan on that? Does the installer generator verify the bundle? Does the installer payload verify the bundle? Does the installer generator verify the installer payload?","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"54fd044fdd9afc838fa42151a8cc74ed9a8b4173","unresolved":true,"context_lines":[{"line_number":19,"context_line":"var installCmd \u003d \u0026cobra.Command{"},{"line_number":20,"context_line":"\tUse:     \"install target --installer\u003dinst.efi --bundle\u003dbundle.bin\","},{"line_number":21,"context_line":"\tShort:   \"Generates a Metropolis installer disk or image.\","},{"line_number":22,"context_line":"\tExample: \"metroctl install /dev/sdx --installer\u003dinstaller_x86_64.efi --bundle\u003dmetropolis_dev_x86_64.tar.xz\","},{"line_number":23,"context_line":"\tArgs:    cobra.ExactArgs(1), // One positional argument: the target"},{"line_number":24,"context_line":"\tRun:     doInstall,"},{"line_number":25,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":2,"id":"ff784a00_755127f7","line":22,"range":{"start_line":22,"start_character":37,"end_line":22,"end_character":69},"in_reply_to":"2b435e45_91d27a07","updated":"2021-11-04 15:20:41.000000000","message":"The actual installer payload doesn\u0027t exist yet, so I can\u0027t definitely tell. Currently the kernel_efi executable is 15MiB for x86_64. This however doesn\u0027t include an initramfs at all. An educated guess would be around 30MiB by the time we have everything in there. This times the architectures we want to support (currently x86_64, but eventually arm64 and maybe rv64gc) comes to around 100MiB for a metroctl binary. That\u0027s large but not unreasonably so. We could embed the installer.\n\nPutting the installer into the bundle is also possible, but considering bundles are designed in a way where they should be read in full (signature and compression are over the whole bundle), updates reusing them without needing the installer and any dedicated deployments needing the installer as a separate EFI payload anyways I\u0027m still not convinced that that\u0027s a good idea.","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"d4782938627a914e42fbd4cc0dc6e9ef51e8ce5c","unresolved":false,"context_lines":[{"line_number":19,"context_line":"var installCmd \u003d \u0026cobra.Command{"},{"line_number":20,"context_line":"\tUse:     \"install target --installer\u003dinst.efi --bundle\u003dbundle.bin\","},{"line_number":21,"context_line":"\tShort:   \"Generates a Metropolis installer disk or image.\","},{"line_number":22,"context_line":"\tExample: \"metroctl install /dev/sdx --installer\u003dinstaller_x86_64.efi --bundle\u003dmetropolis_dev_x86_64.tar.xz\","},{"line_number":23,"context_line":"\tArgs:    cobra.ExactArgs(1), // One positional argument: the target"},{"line_number":24,"context_line":"\tRun:     doInstall,"},{"line_number":25,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":2,"id":"259706b8_a973749e","line":22,"range":{"start_line":22,"start_character":20,"end_line":22,"end_character":27},"in_reply_to":"624e6fb3_18c9c652","updated":"2021-11-03 17:12:38.000000000","message":"I actually had this as a third-level first, but then dropped it for simplicity. I added it again.","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"94830f77a9f72ac40a02af74810232e116ba987b","unresolved":true,"context_lines":[{"line_number":19,"context_line":"var installCmd \u003d \u0026cobra.Command{"},{"line_number":20,"context_line":"\tUse:     \"install target --installer\u003dinst.efi --bundle\u003dbundle.bin\","},{"line_number":21,"context_line":"\tShort:   \"Generates a Metropolis installer disk or image.\","},{"line_number":22,"context_line":"\tExample: \"metroctl install /dev/sdx --installer\u003dinstaller_x86_64.efi --bundle\u003dmetropolis_dev_x86_64.tar.xz\","},{"line_number":23,"context_line":"\tArgs:    cobra.ExactArgs(1), // One positional argument: the target"},{"line_number":24,"context_line":"\tRun:     doInstall,"},{"line_number":25,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":2,"id":"624e6fb3_18c9c652","line":22,"range":{"start_line":22,"start_character":20,"end_line":22,"end_character":27},"in_reply_to":"efd08eaf_0a2cb33c","updated":"2021-11-02 20:18:33.000000000","message":"... or `metroctl installer genusb`, or something else third-level.","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"d4782938627a914e42fbd4cc0dc6e9ef51e8ce5c","unresolved":true,"context_lines":[{"line_number":19,"context_line":"var installCmd \u003d \u0026cobra.Command{"},{"line_number":20,"context_line":"\tUse:     \"install target --installer\u003dinst.efi --bundle\u003dbundle.bin\","},{"line_number":21,"context_line":"\tShort:   \"Generates a Metropolis installer disk or image.\","},{"line_number":22,"context_line":"\tExample: \"metroctl install /dev/sdx --installer\u003dinstaller_x86_64.efi --bundle\u003dmetropolis_dev_x86_64.tar.xz\","},{"line_number":23,"context_line":"\tArgs:    cobra.ExactArgs(1), // One positional argument: the target"},{"line_number":24,"context_line":"\tRun:     doInstall,"},{"line_number":25,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":2,"id":"095f12f3_d99e3c20","line":22,"range":{"start_line":22,"start_character":37,"end_line":22,"end_character":69},"in_reply_to":"ff027e6f_07b14a26","updated":"2021-11-03 17:12:38.000000000","message":"If we have actual releases somewhere then this depends on two variables: ISA and version. Both netboot and pendrive-based deployment support multi-ISA via EFI so we can reduce this to just version. If no version is specified we can further reduce to latest. But since metroctl has no way of obtaining any of this automatically because it doesn\u0027t exist anwyhere we can\u0027t really do better at the moment.","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"2cf0b1a07a523296429d9680f08d04c427dff2c0","unresolved":false,"context_lines":[{"line_number":19,"context_line":"var installCmd \u003d \u0026cobra.Command{"},{"line_number":20,"context_line":"\tUse:     \"install target --installer\u003dinst.efi --bundle\u003dbundle.bin\","},{"line_number":21,"context_line":"\tShort:   \"Generates a Metropolis installer disk or image.\","},{"line_number":22,"context_line":"\tExample: \"metroctl install /dev/sdx --installer\u003dinstaller_x86_64.efi --bundle\u003dmetropolis_dev_x86_64.tar.xz\","},{"line_number":23,"context_line":"\tArgs:    cobra.ExactArgs(1), // One positional argument: the target"},{"line_number":24,"context_line":"\tRun:     doInstall,"},{"line_number":25,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":2,"id":"f99d6d6d_e578a33e","line":22,"range":{"start_line":22,"start_character":37,"end_line":22,"end_character":69},"in_reply_to":"ff784a00_755127f7","updated":"2021-11-09 19:13:41.000000000","message":"Let\u0027s defer this until we finalize the bundle design and integration with installer EFI runfiles.","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"5dfd2afccf5159bf82751becfe3d7c42ee7e341b","unresolved":true,"context_lines":[{"line_number":28,"context_line":"// directly from the build tree. It is automatically set to true if metroctl is"},{"line_number":29,"context_line":"// running under bazel run. Specifying either one manually still overrides"},{"line_number":30,"context_line":"// the in-tree artifacts."},{"line_number":31,"context_line":"var useInTreeArtifacts \u003d os.Getenv(\"BUILD_WORKSPACE_DIRECTORY\") !\u003d \"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"// TODO: These don\u0027t exist yet but nothing relies on their existence yet."},{"line_number":34,"context_line":"var inTreeInstaller \u003d \"metropolis/node/installer/kernel_efi.efi\""}],"source_content_type":"text/x-go","patch_set":2,"id":"18a69bb0_5c423a19","line":31,"updated":"2021-11-02 20:07:45.000000000","message":"What\u0027s the intended usecase for this?\n\nFor metropolis developers this should use data/runfiles, so that things get automatically rebuilt as necessary. Otherwise this _will_ confuse someone by not rebuilding the installer/bundle as expected when working on something.\n\nI would skip this functionality for now (as it\u0027s not being used anyway per the TODO), and figure out some proper user story for this. One thing that comes to mind is to have the installer and bundle as runfiles that are select()ively added to metroctl data deps based on some build config, and which if present will automatically pre-populate the installer and bundle. This will allow developers to just `bazel run //metropolis/cli/metroctl` with everything rebuilding as expected, while production/public builds of metroctl can be made lean and without the bundle and/or installer EFI payload.","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"d4782938627a914e42fbd4cc0dc6e9ef51e8ce5c","unresolved":true,"context_lines":[{"line_number":28,"context_line":"// directly from the build tree. It is automatically set to true if metroctl is"},{"line_number":29,"context_line":"// running under bazel run. Specifying either one manually still overrides"},{"line_number":30,"context_line":"// the in-tree artifacts."},{"line_number":31,"context_line":"var useInTreeArtifacts \u003d os.Getenv(\"BUILD_WORKSPACE_DIRECTORY\") !\u003d \"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"// TODO: These don\u0027t exist yet but nothing relies on their existence yet."},{"line_number":34,"context_line":"var inTreeInstaller \u003d \"metropolis/node/installer/kernel_efi.efi\""}],"source_content_type":"text/x-go","patch_set":2,"id":"b3601f28_e6b5e67e","line":31,"in_reply_to":"18a69bb0_5c423a19","updated":"2021-11-03 17:12:38.000000000","message":"This will use data/runfiles when the targets actually exist. The idea behind this is exactly that `bazel run //metropolis/cli/metroctl` builds everything necessary for metroctl install to just work.","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"c8460f8c7a22c819c31b8e6c1dfd6138765a80d5","unresolved":true,"context_lines":[{"line_number":28,"context_line":"// directly from the build tree. It is automatically set to true if metroctl is"},{"line_number":29,"context_line":"// running under bazel run. Specifying either one manually still overrides"},{"line_number":30,"context_line":"// the in-tree artifacts."},{"line_number":31,"context_line":"var useInTreeArtifacts \u003d os.Getenv(\"BUILD_WORKSPACE_DIRECTORY\") !\u003d \"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"// TODO: These don\u0027t exist yet but nothing relies on their existence yet."},{"line_number":34,"context_line":"var inTreeInstaller \u003d \"metropolis/node/installer/kernel_efi.efi\""}],"source_content_type":"text/x-go","patch_set":2,"id":"f41c5958_8e274bc1","line":31,"in_reply_to":"3d27afb2_8bf8b205","updated":"2021-11-04 15:36:43.000000000","message":"Yes, please.","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"78468aef8c30779fb13333fd2a80a1ce1fd05d71","unresolved":true,"context_lines":[{"line_number":28,"context_line":"// directly from the build tree. It is automatically set to true if metroctl is"},{"line_number":29,"context_line":"// running under bazel run. Specifying either one manually still overrides"},{"line_number":30,"context_line":"// the in-tree artifacts."},{"line_number":31,"context_line":"var useInTreeArtifacts \u003d os.Getenv(\"BUILD_WORKSPACE_DIRECTORY\") !\u003d \"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"// TODO: These don\u0027t exist yet but nothing relies on their existence yet."},{"line_number":34,"context_line":"var inTreeInstaller \u003d \"metropolis/node/installer/kernel_efi.efi\""}],"source_content_type":"text/x-go","patch_set":2,"id":"b7c33954_1744e30b","line":31,"in_reply_to":"b3601f28_e6b5e67e","updated":"2021-11-04 14:08:53.000000000","message":"Right, but then you have that problem of stale builds.\n\nI really wouldn\u0027t want this to get submitted as is, because that breaks the current contract of our developer UX that you never have to manually build anything other than the thing you\u0027re testing.","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"54fd044fdd9afc838fa42151a8cc74ed9a8b4173","unresolved":true,"context_lines":[{"line_number":28,"context_line":"// directly from the build tree. It is automatically set to true if metroctl is"},{"line_number":29,"context_line":"// running under bazel run. Specifying either one manually still overrides"},{"line_number":30,"context_line":"// the in-tree artifacts."},{"line_number":31,"context_line":"var useInTreeArtifacts \u003d os.Getenv(\"BUILD_WORKSPACE_DIRECTORY\") !\u003d \"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"// TODO: These don\u0027t exist yet but nothing relies on their existence yet."},{"line_number":34,"context_line":"var inTreeInstaller \u003d \"metropolis/node/installer/kernel_efi.efi\""}],"source_content_type":"text/x-go","patch_set":2,"id":"3d27afb2_8bf8b205","line":31,"in_reply_to":"b7c33954_1744e30b","updated":"2021-11-04 15:20:41.000000000","message":"I mean you currently can\u0027t manually build these, that\u0027s the whole reason they aren\u0027t in a data attribute in the first place. But I can split this out and put it into a WIP CL on top of this which will be submitted when the targets this depends on are ready. Does that sound good?","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"14c02155bbb87373aec168779cfcbed69a200bc8","unresolved":false,"context_lines":[{"line_number":28,"context_line":"// directly from the build tree. It is automatically set to true if metroctl is"},{"line_number":29,"context_line":"// running under bazel run. Specifying either one manually still overrides"},{"line_number":30,"context_line":"// the in-tree artifacts."},{"line_number":31,"context_line":"var useInTreeArtifacts \u003d os.Getenv(\"BUILD_WORKSPACE_DIRECTORY\") !\u003d \"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"// TODO: These don\u0027t exist yet but nothing relies on their existence yet."},{"line_number":34,"context_line":"var inTreeInstaller \u003d \"metropolis/node/installer/kernel_efi.efi\""}],"source_content_type":"text/x-go","patch_set":2,"id":"2a9d5803_1efb6fc0","line":31,"in_reply_to":"f41c5958_8e274bc1","updated":"2021-11-08 19:46:39.000000000","message":"Done","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"74afa14c1eda1394e5dda7f72668e139ab1bf522","unresolved":true,"context_lines":[{"line_number":75,"context_line":"\t\tos.Exit(1)"},{"line_number":76,"context_line":"\t}"},{"line_number":77,"context_line":"\tvar ownerPublicKey []byte"},{"line_number":78,"context_line":"\townerPublicKey, err \u003d ioutil.ReadFile(filepath.Join(xdg.ConfigHome, \"metroctl/owner.pub\"))"},{"line_number":79,"context_line":"\tif os.IsNotExist(err) {"},{"line_number":80,"context_line":"\t\tpub, priv, err :\u003d ed25519.GenerateKey(rand.Reader)"},{"line_number":81,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":2,"id":"0d1f8c97_cd3d8f4c","line":78,"range":{"start_line":78,"start_character":70,"end_line":78,"end_character":89},"updated":"2021-11-02 20:14:07.000000000","message":"Why store the pubkey separately at all?","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"d4782938627a914e42fbd4cc0dc6e9ef51e8ce5c","unresolved":false,"context_lines":[{"line_number":75,"context_line":"\t\tos.Exit(1)"},{"line_number":76,"context_line":"\t}"},{"line_number":77,"context_line":"\tvar ownerPublicKey []byte"},{"line_number":78,"context_line":"\townerPublicKey, err \u003d ioutil.ReadFile(filepath.Join(xdg.ConfigHome, \"metroctl/owner.pub\"))"},{"line_number":79,"context_line":"\tif os.IsNotExist(err) {"},{"line_number":80,"context_line":"\t\tpub, priv, err :\u003d ed25519.GenerateKey(rand.Reader)"},{"line_number":81,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":2,"id":"ccd54f07_65f65bea","line":78,"range":{"start_line":78,"start_character":70,"end_line":78,"end_character":89},"in_reply_to":"0d1f8c97_cd3d8f4c","updated":"2021-11-03 17:12:38.000000000","message":"Done","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"e5c34c16ab73378d9e2e58e08a17f3be07f7d5eb","unresolved":true,"context_lines":[{"line_number":82,"context_line":"\t\t\tfmt.Printf(\"failed to generate owner private key: %v\", err)"},{"line_number":83,"context_line":"\t\t\tos.Exit(1)"},{"line_number":84,"context_line":"\t\t}"},{"line_number":85,"context_line":"\t\tif err :\u003d ioutil.WriteFile(filepath.Join(xdg.ConfigHome, \"metroctl/owner.priv\"), priv, 0600); err !\u003d nil {"},{"line_number":86,"context_line":"\t\t\tfmt.Printf(\"failed to store owner private key: %v\", err)"},{"line_number":87,"context_line":"\t\t\tos.Exit(1)"},{"line_number":88,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":2,"id":"aefa4e3a_47a6f887","line":85,"range":{"start_line":85,"start_character":83,"end_line":85,"end_character":87},"updated":"2021-11-02 20:16:52.000000000","message":"Pretty sure we want to ASCII armor this (via encoding/pem for example).","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"74afa14c1eda1394e5dda7f72668e139ab1bf522","unresolved":true,"context_lines":[{"line_number":82,"context_line":"\t\t\tfmt.Printf(\"failed to generate owner private key: %v\", err)"},{"line_number":83,"context_line":"\t\t\tos.Exit(1)"},{"line_number":84,"context_line":"\t\t}"},{"line_number":85,"context_line":"\t\tif err :\u003d ioutil.WriteFile(filepath.Join(xdg.ConfigHome, \"metroctl/owner.priv\"), priv, 0600); err !\u003d nil {"},{"line_number":86,"context_line":"\t\t\tfmt.Printf(\"failed to store owner private key: %v\", err)"},{"line_number":87,"context_line":"\t\t\tos.Exit(1)"},{"line_number":88,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":2,"id":"3ed644ed_85ef2b38","line":85,"range":{"start_line":85,"start_character":12,"end_line":85,"end_character":81},"updated":"2021-11-02 20:14:07.000000000","message":"This will override someone\u0027s existing owner.priv if no owner.pub exists (but an owner.priv does).","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"d4782938627a914e42fbd4cc0dc6e9ef51e8ce5c","unresolved":false,"context_lines":[{"line_number":82,"context_line":"\t\t\tfmt.Printf(\"failed to generate owner private key: %v\", err)"},{"line_number":83,"context_line":"\t\t\tos.Exit(1)"},{"line_number":84,"context_line":"\t\t}"},{"line_number":85,"context_line":"\t\tif err :\u003d ioutil.WriteFile(filepath.Join(xdg.ConfigHome, \"metroctl/owner.priv\"), priv, 0600); err !\u003d nil {"},{"line_number":86,"context_line":"\t\t\tfmt.Printf(\"failed to store owner private key: %v\", err)"},{"line_number":87,"context_line":"\t\t\tos.Exit(1)"},{"line_number":88,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":2,"id":"af4f7154_5d8c9bc9","line":85,"range":{"start_line":85,"start_character":12,"end_line":85,"end_character":81},"in_reply_to":"3ed644ed_85ef2b38","updated":"2021-11-03 17:12:38.000000000","message":"Done","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"d4782938627a914e42fbd4cc0dc6e9ef51e8ce5c","unresolved":false,"context_lines":[{"line_number":82,"context_line":"\t\t\tfmt.Printf(\"failed to generate owner private key: %v\", err)"},{"line_number":83,"context_line":"\t\t\tos.Exit(1)"},{"line_number":84,"context_line":"\t\t}"},{"line_number":85,"context_line":"\t\tif err :\u003d ioutil.WriteFile(filepath.Join(xdg.ConfigHome, \"metroctl/owner.priv\"), priv, 0600); err !\u003d nil {"},{"line_number":86,"context_line":"\t\t\tfmt.Printf(\"failed to store owner private key: %v\", err)"},{"line_number":87,"context_line":"\t\t\tos.Exit(1)"},{"line_number":88,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":2,"id":"2899b4da_80303c1c","line":85,"range":{"start_line":85,"start_character":83,"end_line":85,"end_character":87},"in_reply_to":"aefa4e3a_47a6f887","updated":"2021-11-03 17:12:38.000000000","message":"Done","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"74afa14c1eda1394e5dda7f72668e139ab1bf522","unresolved":true,"context_lines":[{"line_number":117,"context_line":"\t}"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"\tif err :\u003d core.MakeInstallerImage(installerImageArgs); err !\u003d nil {"},{"line_number":120,"context_line":"\t\tfmt.Printf(\"failed to create installer: %v\", err)"},{"line_number":121,"context_line":"\t\tos.Exit(1)"},{"line_number":122,"context_line":"\t}"},{"line_number":123,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":2,"id":"98e88e4e_00fd1660","line":120,"range":{"start_line":120,"start_character":2,"end_line":120,"end_character":13},"updated":"2021-11-02 20:14:07.000000000","message":"Use log.{Printf,Fatalf} (and elsewhere). That way you don\u0027t have to remember newlines at the end :).","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"d4782938627a914e42fbd4cc0dc6e9ef51e8ce5c","unresolved":false,"context_lines":[{"line_number":117,"context_line":"\t}"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"\tif err :\u003d core.MakeInstallerImage(installerImageArgs); err !\u003d nil {"},{"line_number":120,"context_line":"\t\tfmt.Printf(\"failed to create installer: %v\", err)"},{"line_number":121,"context_line":"\t\tos.Exit(1)"},{"line_number":122,"context_line":"\t}"},{"line_number":123,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":2,"id":"044c1186_b09b9828","line":120,"range":{"start_line":120,"start_character":2,"end_line":120,"end_character":13},"in_reply_to":"98e88e4e_00fd1660","updated":"2021-11-03 17:12:38.000000000","message":"Done","commit_id":"04ec3e746974019fdd2ea3618239f8113212e9cf"},{"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":"7c5e47cc92126401adb8495f7d511080519f90cb","unresolved":true,"context_lines":[{"line_number":54,"context_line":"\t}"},{"line_number":55,"context_line":"\tinstallerFile, err :\u003d os.Open(*installer)"},{"line_number":56,"context_line":"\tif err !\u003d nil {"},{"line_number":57,"context_line":"\t\tfmt.Printf(\"failed to open installer: %v\", err)"},{"line_number":58,"context_line":"\t\tos.Exit(1)"},{"line_number":59,"context_line":"\t}"},{"line_number":60,"context_line":"\tinstallerFileStat, err :\u003d installerFile.Stat()"}],"source_content_type":"text/x-go","patch_set":3,"id":"c62807ee_cf4dc77c","line":57,"range":{"start_line":57,"start_character":14,"end_line":57,"end_character":15},"updated":"2021-11-04 14:13:25.000000000","message":"nit: Log entries should start with a capital letter.\n\nAlso, log.Fatalf() (and elsewhere).","commit_id":"7e08595a5334c86128c2633850e2a61bfeb5b55a"},{"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":"85e3c2588b7c1e07a7502cfc504c70f1657f9985","unresolved":false,"context_lines":[{"line_number":54,"context_line":"\t}"},{"line_number":55,"context_line":"\tinstallerFile, err :\u003d os.Open(*installer)"},{"line_number":56,"context_line":"\tif err !\u003d nil {"},{"line_number":57,"context_line":"\t\tfmt.Printf(\"failed to open installer: %v\", err)"},{"line_number":58,"context_line":"\t\tos.Exit(1)"},{"line_number":59,"context_line":"\t}"},{"line_number":60,"context_line":"\tinstallerFileStat, err :\u003d installerFile.Stat()"}],"source_content_type":"text/x-go","patch_set":3,"id":"c3113ab9_de2154b6","line":57,"range":{"start_line":57,"start_character":14,"end_line":57,"end_character":15},"in_reply_to":"c62807ee_cf4dc77c","updated":"2021-11-09 15:49:32.000000000","message":"Done","commit_id":"7e08595a5334c86128c2633850e2a61bfeb5b55a"},{"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":"7c5e47cc92126401adb8495f7d511080519f90cb","unresolved":true,"context_lines":[{"line_number":93,"context_line":"\t\tif err !\u003d nil {"},{"line_number":94,"context_line":"\t\t\tpanic(err)"},{"line_number":95,"context_line":"\t\t}"},{"line_number":96,"context_line":"\t\tpemPriv :\u003d pem.EncodeToMemory(\u0026pem.Block{Type: \"PRIVATE KEY\", Bytes: pkcs8Priv})"},{"line_number":97,"context_line":"\t\tif err :\u003d ioutil.WriteFile(filepath.Join(xdg.ConfigHome, \"metroctl/owner-key.pem\"), pemPriv, 0600); err !\u003d nil {"},{"line_number":98,"context_line":"\t\t\tlog.Fatalf(\"failed to store owner private key: %v\", err)"},{"line_number":99,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"acd7c51d_3f2f8f7b","line":96,"range":{"start_line":96,"start_character":49,"end_line":96,"end_character":62},"updated":"2021-11-04 14:13:25.000000000","message":"How about \"METROPOLIS INITIAL OWNER PRIVATE KEY\" (or something similar)? I think it makes sense to distinguish different classes of private keys by different armoring, so that we can tell the user early they\u0027re doing something wrong.","commit_id":"7e08595a5334c86128c2633850e2a61bfeb5b55a"},{"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":"85e3c2588b7c1e07a7502cfc504c70f1657f9985","unresolved":true,"context_lines":[{"line_number":93,"context_line":"\t\tif err !\u003d nil {"},{"line_number":94,"context_line":"\t\t\tpanic(err)"},{"line_number":95,"context_line":"\t\t}"},{"line_number":96,"context_line":"\t\tpemPriv :\u003d pem.EncodeToMemory(\u0026pem.Block{Type: \"PRIVATE KEY\", Bytes: pkcs8Priv})"},{"line_number":97,"context_line":"\t\tif err :\u003d ioutil.WriteFile(filepath.Join(xdg.ConfigHome, \"metroctl/owner-key.pem\"), pemPriv, 0600); err !\u003d nil {"},{"line_number":98,"context_line":"\t\t\tlog.Fatalf(\"failed to store owner private key: %v\", err)"},{"line_number":99,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"c6f0b598_107c32c7","line":96,"range":{"start_line":96,"start_character":49,"end_line":96,"end_character":62},"in_reply_to":"acd7c51d_3f2f8f7b","updated":"2021-11-09 15:49:32.000000000","message":"The current format is compatible with OpenSSL and other tools (PEM-armored PKCS8 key). We could deviate from this but we\u0027d loose compatibility with everything else.","commit_id":"7e08595a5334c86128c2633850e2a61bfeb5b55a"},{"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":"5eee1205f45333014f5c217075cde2e4f258b84a","unresolved":false,"context_lines":[{"line_number":93,"context_line":"\t\tif err !\u003d nil {"},{"line_number":94,"context_line":"\t\t\tpanic(err)"},{"line_number":95,"context_line":"\t\t}"},{"line_number":96,"context_line":"\t\tpemPriv :\u003d pem.EncodeToMemory(\u0026pem.Block{Type: \"PRIVATE KEY\", Bytes: pkcs8Priv})"},{"line_number":97,"context_line":"\t\tif err :\u003d ioutil.WriteFile(filepath.Join(xdg.ConfigHome, \"metroctl/owner-key.pem\"), pemPriv, 0600); err !\u003d nil {"},{"line_number":98,"context_line":"\t\t\tlog.Fatalf(\"failed to store owner private key: %v\", err)"},{"line_number":99,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"a1b6b7a1_8e053ba0","line":96,"range":{"start_line":96,"start_character":49,"end_line":96,"end_character":62},"in_reply_to":"b83abdf7_2f7f8d4b","updated":"2021-11-16 16:49:28.000000000","message":"Done","commit_id":"7e08595a5334c86128c2633850e2a61bfeb5b55a"},{"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":"2cf0b1a07a523296429d9680f08d04c427dff2c0","unresolved":true,"context_lines":[{"line_number":93,"context_line":"\t\tif err !\u003d nil {"},{"line_number":94,"context_line":"\t\t\tpanic(err)"},{"line_number":95,"context_line":"\t\t}"},{"line_number":96,"context_line":"\t\tpemPriv :\u003d pem.EncodeToMemory(\u0026pem.Block{Type: \"PRIVATE KEY\", Bytes: pkcs8Priv})"},{"line_number":97,"context_line":"\t\tif err :\u003d ioutil.WriteFile(filepath.Join(xdg.ConfigHome, \"metroctl/owner-key.pem\"), pemPriv, 0600); err !\u003d nil {"},{"line_number":98,"context_line":"\t\t\tlog.Fatalf(\"failed to store owner private key: %v\", err)"},{"line_number":99,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"b83abdf7_2f7f8d4b","line":96,"range":{"start_line":96,"start_character":49,"end_line":96,"end_character":62},"in_reply_to":"c6f0b598_107c32c7","updated":"2021-11-09 19:13:41.000000000","message":"I think the custom armoring gives us more benefit than the compatibility with existing tools (is that even a feature in the case of this key?). But I\u0027m ultimately fine with whatever.","commit_id":"7e08595a5334c86128c2633850e2a61bfeb5b55a"},{"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":"7c5e47cc92126401adb8495f7d511080519f90cb","unresolved":true,"context_lines":[{"line_number":106,"context_line":"\t\t\tlog.Fatalf(\"owner-key.pem contains invalid PEM\")"},{"line_number":107,"context_line":"\t\t}"},{"line_number":108,"context_line":"\t\tif block.Type !\u003d \"PRIVATE KEY\" {"},{"line_number":109,"context_line":"\t\t\tlog.Fatalln(\"owner-key.pem contains a PEM block that\u0027s not a PRIVATE KEY\")"},{"line_number":110,"context_line":"\t\t}"},{"line_number":111,"context_line":"\t\townerPrivateKeyRaw, err :\u003d x509.ParsePKCS8PrivateKey(block.Bytes)"},{"line_number":112,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":3,"id":"c5ffc9b4_d566490e","line":109,"range":{"start_line":109,"start_character":64,"end_line":109,"end_character":75},"updated":"2021-11-04 14:13:25.000000000","message":"Please const this out (we\u0027re already at three repetitions - the encode, the decode, and the error message)","commit_id":"7e08595a5334c86128c2633850e2a61bfeb5b55a"},{"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":"85e3c2588b7c1e07a7502cfc504c70f1657f9985","unresolved":false,"context_lines":[{"line_number":106,"context_line":"\t\t\tlog.Fatalf(\"owner-key.pem contains invalid PEM\")"},{"line_number":107,"context_line":"\t\t}"},{"line_number":108,"context_line":"\t\tif block.Type !\u003d \"PRIVATE KEY\" {"},{"line_number":109,"context_line":"\t\t\tlog.Fatalln(\"owner-key.pem contains a PEM block that\u0027s not a PRIVATE KEY\")"},{"line_number":110,"context_line":"\t\t}"},{"line_number":111,"context_line":"\t\townerPrivateKeyRaw, err :\u003d x509.ParsePKCS8PrivateKey(block.Bytes)"},{"line_number":112,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":3,"id":"0d8abc0e_f13a8fef","line":109,"range":{"start_line":109,"start_character":64,"end_line":109,"end_character":75},"in_reply_to":"c5ffc9b4_d566490e","updated":"2021-11-09 15:49:32.000000000","message":"Done","commit_id":"7e08595a5334c86128c2633850e2a61bfeb5b55a"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9ae2ee022253a7776281ad9364fca0c08c188c79","unresolved":true,"context_lines":[{"line_number":14,"context_line":"\t\"github.com/spf13/cobra\""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\t\"source.monogon.dev/metropolis/proto/api\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"\t\"source.monogon.dev/metropolis/cli/metroctl/core\""},{"line_number":19,"context_line":")"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-go","patch_set":14,"id":"3e4c9b34_08d783ca","line":17,"updated":"2021-11-12 15:02:42.000000000","message":"superfluous whitespace?","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"},{"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":"5eee1205f45333014f5c217075cde2e4f258b84a","unresolved":false,"context_lines":[{"line_number":14,"context_line":"\t\"github.com/spf13/cobra\""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\t\"source.monogon.dev/metropolis/proto/api\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"\t\"source.monogon.dev/metropolis/cli/metroctl/core\""},{"line_number":19,"context_line":")"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-go","patch_set":14,"id":"84456f0b_a55d7178","line":17,"in_reply_to":"3e4c9b34_08d783ca","updated":"2021-11-16 16:49:28.000000000","message":"Done","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9ae2ee022253a7776281ad9364fca0c08c188c79","unresolved":true,"context_lines":[{"line_number":18,"context_line":"\t\"source.monogon.dev/metropolis/cli/metroctl/core\""},{"line_number":19,"context_line":")"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"var installCmd \u003d \u0026cobra.Command{"},{"line_number":22,"context_line":"\tShort: \"Contains subcommands to install Metropolis over different mediums.\","},{"line_number":23,"context_line":"\tUse:   \"install\","},{"line_number":24,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":14,"id":"5a699563_6fdf9d63","line":21,"updated":"2021-11-12 15:02:42.000000000","message":"It should be possible to put installCmd and genusbCmd in a list, simplifying init().","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"},{"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":"9e3b36f31b53f2aa84251b220c711fd340d3a05e","unresolved":false,"context_lines":[{"line_number":18,"context_line":"\t\"source.monogon.dev/metropolis/cli/metroctl/core\""},{"line_number":19,"context_line":")"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"var installCmd \u003d \u0026cobra.Command{"},{"line_number":22,"context_line":"\tShort: \"Contains subcommands to install Metropolis over different mediums.\","},{"line_number":23,"context_line":"\tUse:   \"install\","},{"line_number":24,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":14,"id":"7fb8ed80_88be1018","line":21,"in_reply_to":"14cb8549_47a3c474","updated":"2021-11-18 15:51:42.000000000","message":"Ack","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"},{"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":"5eee1205f45333014f5c217075cde2e4f258b84a","unresolved":true,"context_lines":[{"line_number":18,"context_line":"\t\"source.monogon.dev/metropolis/cli/metroctl/core\""},{"line_number":19,"context_line":")"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"var installCmd \u003d \u0026cobra.Command{"},{"line_number":22,"context_line":"\tShort: \"Contains subcommands to install Metropolis over different mediums.\","},{"line_number":23,"context_line":"\tUse:   \"install\","},{"line_number":24,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":14,"id":"d15740eb_e80ccd04","line":21,"in_reply_to":"5a699563_6fdf9d63","updated":"2021-11-16 16:49:28.000000000","message":"Not sure how that would work, mind giving an example?","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"548ce36eab533436c12124bc3df25f5e27256f6c","unresolved":true,"context_lines":[{"line_number":18,"context_line":"\t\"source.monogon.dev/metropolis/cli/metroctl/core\""},{"line_number":19,"context_line":")"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"var installCmd \u003d \u0026cobra.Command{"},{"line_number":22,"context_line":"\tShort: \"Contains subcommands to install Metropolis over different mediums.\","},{"line_number":23,"context_line":"\tUse:   \"install\","},{"line_number":24,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":14,"id":"14cb8549_47a3c474","line":21,"in_reply_to":"d15740eb_e80ccd04","updated":"2021-11-18 12:56:40.000000000","message":"I misunderstood the way Cobra works. All\u0027s good.","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9ae2ee022253a7776281ad9364fca0c08c188c79","unresolved":true,"context_lines":[{"line_number":34,"context_line":"var installer *string"},{"line_number":35,"context_line":"var bundle *string"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"const pemPrivateKeyType \u003d \"PRIVATE KEY\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"func doGenUSB(cmd *cobra.Command, args []string) {"},{"line_number":40,"context_line":"\tinstallerFile, err :\u003d os.Open(*installer)"}],"source_content_type":"text/x-go","patch_set":14,"id":"563c0d5f_bf94d7d0","line":37,"updated":"2021-11-12 15:02:42.000000000","message":"Please include a comment briefly describing reasons for having this constant.","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"},{"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":"5eee1205f45333014f5c217075cde2e4f258b84a","unresolved":false,"context_lines":[{"line_number":34,"context_line":"var installer *string"},{"line_number":35,"context_line":"var bundle *string"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"const pemPrivateKeyType \u003d \"PRIVATE KEY\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"func doGenUSB(cmd *cobra.Command, args []string) {"},{"line_number":40,"context_line":"\tinstallerFile, err :\u003d os.Open(*installer)"}],"source_content_type":"text/x-go","patch_set":14,"id":"b3aabef7_841c76d7","line":37,"in_reply_to":"563c0d5f_bf94d7d0","updated":"2021-11-16 16:49:28.000000000","message":"Done","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9ae2ee022253a7776281ad9364fca0c08c188c79","unresolved":true,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"const pemPrivateKeyType \u003d \"PRIVATE KEY\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"func doGenUSB(cmd *cobra.Command, args []string) {"},{"line_number":40,"context_line":"\tinstallerFile, err :\u003d os.Open(*installer)"},{"line_number":41,"context_line":"\tif err !\u003d nil {"},{"line_number":42,"context_line":"\t\tlog.Fatalf(\"Failed to open installer: %v\", err)"}],"source_content_type":"text/x-go","patch_set":14,"id":"72172467_8151f526","line":39,"updated":"2021-11-12 15:02:42.000000000","message":"Please include comments before each block, briefly explaining intention behind it to a layperson.","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"},{"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":"5eee1205f45333014f5c217075cde2e4f258b84a","unresolved":true,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"const pemPrivateKeyType \u003d \"PRIVATE KEY\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"func doGenUSB(cmd *cobra.Command, args []string) {"},{"line_number":40,"context_line":"\tinstallerFile, err :\u003d os.Open(*installer)"},{"line_number":41,"context_line":"\tif err !\u003d nil {"},{"line_number":42,"context_line":"\t\tlog.Fatalf(\"Failed to open installer: %v\", err)"}],"source_content_type":"text/x-go","patch_set":14,"id":"addb938d_6b834542","line":39,"in_reply_to":"72172467_8151f526","updated":"2021-11-16 16:49:28.000000000","message":"This is an entry point to a command. The documentation is part of the cobra.Command structure a few lines above it. Not sure how valuable it is to keep these separate.","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"8ff4b527417521d79bd6d63c7294a9cabf87724f","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"const pemPrivateKeyType \u003d \"PRIVATE KEY\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"func doGenUSB(cmd *cobra.Command, args []string) {"},{"line_number":40,"context_line":"\tinstallerFile, err :\u003d os.Open(*installer)"},{"line_number":41,"context_line":"\tif err !\u003d nil {"},{"line_number":42,"context_line":"\t\tlog.Fatalf(\"Failed to open installer: %v\", err)"}],"source_content_type":"text/x-go","patch_set":14,"id":"e0ae7167_6c7752e2","line":39,"in_reply_to":"80b5422b_a2146dbc","updated":"2021-11-19 15:47:08.000000000","message":"Done","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"},{"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":"9e3b36f31b53f2aa84251b220c711fd340d3a05e","unresolved":true,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"const pemPrivateKeyType \u003d \"PRIVATE KEY\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"func doGenUSB(cmd *cobra.Command, args []string) {"},{"line_number":40,"context_line":"\tinstallerFile, err :\u003d os.Open(*installer)"},{"line_number":41,"context_line":"\tif err !\u003d nil {"},{"line_number":42,"context_line":"\t\tlog.Fatalf(\"Failed to open installer: %v\", err)"}],"source_content_type":"text/x-go","patch_set":14,"id":"80b5422b_a2146dbc","line":39,"in_reply_to":"9d4a6fb9_173ec342","updated":"2021-11-18 15:51:42.000000000","message":"This is generally the case, yes. But this is a bit of special case as it is a command entry point. Documentation for these should be in the command metadata, not as part of the function because most users of this are going to use it through a CLI, not through an IDE.\nThere is a point to be made that the command itself is underdocumented.","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"548ce36eab533436c12124bc3df25f5e27256f6c","unresolved":true,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"const pemPrivateKeyType \u003d \"PRIVATE KEY\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"func doGenUSB(cmd *cobra.Command, args []string) {"},{"line_number":40,"context_line":"\tinstallerFile, err :\u003d os.Open(*installer)"},{"line_number":41,"context_line":"\tif err !\u003d nil {"},{"line_number":42,"context_line":"\t\tlog.Fatalf(\"Failed to open installer: %v\", err)"}],"source_content_type":"text/x-go","patch_set":14,"id":"9d4a6fb9_173ec342","line":39,"in_reply_to":"addb938d_6b834542","updated":"2021-11-18 12:56:40.000000000","message":"I thought it was part of our coding standards to describe every function in one or two sentences, even if it would appear obvious to the person writing it, with the aim of improving readability and enabling autogenerated or IDE-level documentation.\n\nThat might\u0027ve been something I picked up while iterating my CLs with @serge. If there\u0027s no consensus on that, let\u0027s talk about it next Tuesday. I won\u0027t be sticking to that rule in the meantime.","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9ae2ee022253a7776281ad9364fca0c08c188c79","unresolved":true,"context_lines":[{"line_number":131,"context_line":"\trootCmd.AddCommand(installCmd)"},{"line_number":132,"context_line":"\tinstallCmd.AddCommand(genusbCmd)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"\tbundle \u003d installCmd.Flags().StringP(\"bundle\", \"b\", \"\", \"Metropolis bundle file to use\")"},{"line_number":135,"context_line":"\tinstaller \u003d installCmd.Flags().StringP(\"installer\", \"i\", \"\", \"Metropolis installer file to use\")"},{"line_number":136,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":14,"id":"0387b139_1078e8e5","line":134,"updated":"2021-11-12 15:02:42.000000000","message":"Consider moving this to command implementation. If you choose not to, please put comments over bundle and installer global variables.","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"},{"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":"5eee1205f45333014f5c217075cde2e4f258b84a","unresolved":true,"context_lines":[{"line_number":131,"context_line":"\trootCmd.AddCommand(installCmd)"},{"line_number":132,"context_line":"\tinstallCmd.AddCommand(genusbCmd)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"\tbundle \u003d installCmd.Flags().StringP(\"bundle\", \"b\", \"\", \"Metropolis bundle file to use\")"},{"line_number":135,"context_line":"\tinstaller \u003d installCmd.Flags().StringP(\"installer\", \"i\", \"\", \"Metropolis installer file to use\")"},{"line_number":136,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":14,"id":"6bbcfa6a_1d9fc9a4","line":134,"in_reply_to":"0387b139_1078e8e5","updated":"2021-11-16 16:49:28.000000000","message":"AFAIK this style of flag handling is required by Cobra. Can you point me to an example which works that way?","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"548ce36eab533436c12124bc3df25f5e27256f6c","unresolved":false,"context_lines":[{"line_number":131,"context_line":"\trootCmd.AddCommand(installCmd)"},{"line_number":132,"context_line":"\tinstallCmd.AddCommand(genusbCmd)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"\tbundle \u003d installCmd.Flags().StringP(\"bundle\", \"b\", \"\", \"Metropolis bundle file to use\")"},{"line_number":135,"context_line":"\tinstaller \u003d installCmd.Flags().StringP(\"installer\", \"i\", \"\", \"Metropolis installer file to use\")"},{"line_number":136,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":14,"id":"49866246_a5130515","line":134,"in_reply_to":"6bbcfa6a_1d9fc9a4","updated":"2021-11-18 12:56:40.000000000","message":"Done","commit_id":"a858bf6087215b9a64dd53ae0b9e0b53ae8fd693"}]}
