)]}'
{"/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":"956fa66a24cc9f38ac63120242cde98e130a92c1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"37b684f0_c8de2fe8","updated":"2021-10-25 18:46:38.000000000","message":"First pass, I have a few more things but that\u0027s for a bit later","commit_id":"9ad35ae33adf5ce6ec01878820c2db630eeb50c8"}],"metropolis/node/installer/main.go":[{"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":"956fa66a24cc9f38ac63120242cde98e130a92c1","unresolved":true,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"// mountPseudoFS mounts efivarfs, devtmpfs and sysfs, used by the installer in"},{"line_number":38,"context_line":"// the block device discovery stage. It may return an error."},{"line_number":39,"context_line":"func mountPseudoFS() error {"},{"line_number":40,"context_line":"\t// Do the same for sysfs."},{"line_number":41,"context_line":"\tif err :\u003d unix.Mkdir(\"/sys\", 0700); err !\u003d nil {"},{"line_number":42,"context_line":"\t\treturn fmt.Errorf(\"couldn\u0027t create the sysfs mountpoint: %w\", err)"}],"source_content_type":"text/x-go","patch_set":2,"id":"d37dda28_88dc3a4e","line":39,"updated":"2021-10-25 18:46:38.000000000","message":"Can we not do this with a table-driven setup like in the Metropolis init?","commit_id":"9ad35ae33adf5ce6ec01878820c2db630eeb50c8"},{"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":"dfd0d44db00e67a82cc5629d9395c74cd40a80df","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"// mountPseudoFS mounts efivarfs, devtmpfs and sysfs, used by the installer in"},{"line_number":38,"context_line":"// the block device discovery stage. It may return an error."},{"line_number":39,"context_line":"func mountPseudoFS() error {"},{"line_number":40,"context_line":"\t// Do the same for sysfs."},{"line_number":41,"context_line":"\tif err :\u003d unix.Mkdir(\"/sys\", 0700); err !\u003d nil {"},{"line_number":42,"context_line":"\t\treturn fmt.Errorf(\"couldn\u0027t create the sysfs mountpoint: %w\", err)"}],"source_content_type":"text/x-go","patch_set":2,"id":"34c88bad_498ccc0c","line":39,"in_reply_to":"d37dda28_88dc3a4e","updated":"2021-11-06 15:27:55.000000000","message":"Ack","commit_id":"9ad35ae33adf5ce6ec01878820c2db630eeb50c8"},{"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":"956fa66a24cc9f38ac63120242cde98e130a92c1","unresolved":true,"context_lines":[{"line_number":172,"context_line":"\tif err !\u003d nil {"},{"line_number":173,"context_line":"\t\treturn \"\", fmt.Errorf(\"couldn\u0027t read the LoaderDevicePartUUID file at %q: %w\", espUuidPath, err)"},{"line_number":174,"context_line":"\t}"},{"line_number":175,"context_line":"\t// Extract the UUID from the read data. Start with extracting the payload"},{"line_number":176,"context_line":"\t// bytes."},{"line_number":177,"context_line":"\tespUuid8 :\u003d efiVar[4 : len(efiVar)-2]"},{"line_number":178,"context_line":"\t// Ensure proper endianness."}],"source_content_type":"text/x-go","patch_set":2,"id":"7196c343_62509cd8","line":175,"updated":"2021-10-25 18:46:38.000000000","message":"I get what this is doing, but this is IMO far too much magic.\n\nI\u0027d put the encoding definition together with some comments as a package-level thing here or even in a separate package.\n```\n// efiUnicode defines the Unicode encoding used by UEFI which is UCS-2 Little Endian. For BMP characters UTF-16 is equivalent to UCS-2. Others are not defined anyways so use the most sensible representation (UTF-16). See the UEFI Spec 2.9, Sections 33.2.6 and 1.8.1.\nvar efiUnicode \u003d unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM)\n```\n\nThen this whole thing can then be simplified (and documented) like this:\n```\n// Skip attributes, see @linux//Documentation/filesystems:efivarfs.rst for format\nefiVarData :\u003d efiVar[4:]\nespUUIDNullTerminated, err :\u003d efiUnicode.NewDecoder().Bytes(efiVarData)\nreturn string(bytes.TrimSuffix(espUUIDNullTerminated, \"\\0x00\"))\n```","commit_id":"9ad35ae33adf5ce6ec01878820c2db630eeb50c8"},{"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":"dfd0d44db00e67a82cc5629d9395c74cd40a80df","unresolved":false,"context_lines":[{"line_number":172,"context_line":"\tif err !\u003d nil {"},{"line_number":173,"context_line":"\t\treturn \"\", fmt.Errorf(\"couldn\u0027t read the LoaderDevicePartUUID file at %q: %w\", espUuidPath, err)"},{"line_number":174,"context_line":"\t}"},{"line_number":175,"context_line":"\t// Extract the UUID from the read data. Start with extracting the payload"},{"line_number":176,"context_line":"\t// bytes."},{"line_number":177,"context_line":"\tespUuid8 :\u003d efiVar[4 : len(efiVar)-2]"},{"line_number":178,"context_line":"\t// Ensure proper endianness."}],"source_content_type":"text/x-go","patch_set":2,"id":"c8f245fc_95581be2","line":175,"in_reply_to":"7196c343_62509cd8","updated":"2021-11-06 15:27:55.000000000","message":"Ack","commit_id":"9ad35ae33adf5ce6ec01878820c2db630eeb50c8"},{"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":"956fa66a24cc9f38ac63120242cde98e130a92c1","unresolved":true,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":"\t// Reboot."},{"line_number":320,"context_line":"\tlog.Print(\"Installation completed. Rebooting.\")"},{"line_number":321,"context_line":"\tunix.Reboot(unix.LINUX_REBOOT_CMD_RESTART)"},{"line_number":322,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":2,"id":"45c6d88a_65747aff","line":321,"range":{"start_line":321,"start_character":18,"end_line":321,"end_character":42},"updated":"2021-10-25 18:46:38.000000000","message":"This needs a unix.Sync() before, otherwise this can be unsafe.","commit_id":"9ad35ae33adf5ce6ec01878820c2db630eeb50c8"},{"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":"dfd0d44db00e67a82cc5629d9395c74cd40a80df","unresolved":true,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":"\t// Reboot."},{"line_number":320,"context_line":"\tlog.Print(\"Installation completed. Rebooting.\")"},{"line_number":321,"context_line":"\tunix.Reboot(unix.LINUX_REBOOT_CMD_RESTART)"},{"line_number":322,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":2,"id":"4a4cd23c_b21bb7c7","line":321,"range":{"start_line":321,"start_character":18,"end_line":321,"end_character":42},"in_reply_to":"45c6d88a_65747aff","updated":"2021-11-06 15:27:55.000000000","message":"Not necessarily as long as we\u0027re only mounting pseudo and read only file systems, right? I\u0027ve added it anyway.","commit_id":"9ad35ae33adf5ce6ec01878820c2db630eeb50c8"},{"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":"703abb6f139055fa1891a5ed08d13f1065f4dc05","unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":"\t// Reboot."},{"line_number":320,"context_line":"\tlog.Print(\"Installation completed. Rebooting.\")"},{"line_number":321,"context_line":"\tunix.Reboot(unix.LINUX_REBOOT_CMD_RESTART)"},{"line_number":322,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":2,"id":"54bd635c_fdf2b7ae","line":321,"range":{"start_line":321,"start_character":18,"end_line":321,"end_character":42},"in_reply_to":"4a4cd23c_b21bb7c7","updated":"2021-11-06 15:28:07.000000000","message":"Done","commit_id":"9ad35ae33adf5ce6ec01878820c2db630eeb50c8"},{"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":"3e2511dff6204da079099d71037ef34f79fa54b3","unresolved":true,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"// createPartuuidSymlinks creates partition UUID based symlinks under"},{"line_number":63,"context_line":"// the path /dev/disk/by-partuuid. It may return an error."},{"line_number":64,"context_line":"func createPartuuidSymlinks() error {"},{"line_number":65,"context_line":"\t// Create the directory tree."},{"line_number":66,"context_line":"\tif err :\u003d unix.Mkdir(\"/dev/disk\", 0700); err !\u003d nil \u0026\u0026 !os.IsNotExist(err) {"},{"line_number":67,"context_line":"\t\treturn fmt.Errorf(\"couldn\u0027t create a directory at \\\"/dev/disk\\\": %w\", err)"}],"source_content_type":"text/x-go","patch_set":16,"id":"b5710422_977512c5","line":64,"range":{"start_line":64,"start_character":5,"end_line":64,"end_character":27},"updated":"2021-11-17 16:17:12.000000000","message":"Can\u0027t we just drop that symlink and pass the devname directly? There is a whole bunch of code here whose only responsibility is creating a partuuid directory, parsing data and creating symlinks only to be resolved into a device name again.\n\nYou could make this return the ESP devname and pass that into mountInstallerESP and resolveInstallerBlkdev and drop resolveInstallerPartition entirely. You could even make the lookup be part of mountInstallerESP.","commit_id":"302f4365eaa396e96eb72dad9d64130c6c18eb16"},{"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":"3786b24a293b64defb2743f90acf215bc8a7f40c","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"// createPartuuidSymlinks creates partition UUID based symlinks under"},{"line_number":63,"context_line":"// the path /dev/disk/by-partuuid. It may return an error."},{"line_number":64,"context_line":"func createPartuuidSymlinks() error {"},{"line_number":65,"context_line":"\t// Create the directory tree."},{"line_number":66,"context_line":"\tif err :\u003d unix.Mkdir(\"/dev/disk\", 0700); err !\u003d nil \u0026\u0026 !os.IsNotExist(err) {"},{"line_number":67,"context_line":"\t\treturn fmt.Errorf(\"couldn\u0027t create a directory at \\\"/dev/disk\\\": %w\", err)"}],"source_content_type":"text/x-go","patch_set":16,"id":"edb5c713_40731078","line":64,"range":{"start_line":64,"start_character":5,"end_line":64,"end_character":27},"in_reply_to":"02017b18_bb84ae9b","updated":"2021-11-25 20:53:50.000000000","message":"I moved it to pkg/sysfs after removing everything related to symlinks.","commit_id":"302f4365eaa396e96eb72dad9d64130c6c18eb16"},{"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":"faad1bf801257c178fb8cfc4161356da0e82a621","unresolved":true,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"// createPartuuidSymlinks creates partition UUID based symlinks under"},{"line_number":63,"context_line":"// the path /dev/disk/by-partuuid. It may return an error."},{"line_number":64,"context_line":"func createPartuuidSymlinks() error {"},{"line_number":65,"context_line":"\t// Create the directory tree."},{"line_number":66,"context_line":"\tif err :\u003d unix.Mkdir(\"/dev/disk\", 0700); err !\u003d nil \u0026\u0026 !os.IsNotExist(err) {"},{"line_number":67,"context_line":"\t\treturn fmt.Errorf(\"couldn\u0027t create a directory at \\\"/dev/disk\\\": %w\", err)"}],"source_content_type":"text/x-go","patch_set":16,"id":"ee32fbdd_20d6690f","line":64,"range":{"start_line":64,"start_character":5,"end_line":64,"end_character":27},"in_reply_to":"b5710422_977512c5","updated":"2021-11-19 20:07:42.000000000","message":"I\u0027d like to keep this general-use piece of code and perhaps move it to pkg/ rather than specialize it for the installer, as I don\u0027t feel we\u0027d be gaining anything from doing that.","commit_id":"302f4365eaa396e96eb72dad9d64130c6c18eb16"},{"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":"19e8d52d165a143c3b64700d9b6af16050a531a3","unresolved":true,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"// createPartuuidSymlinks creates partition UUID based symlinks under"},{"line_number":63,"context_line":"// the path /dev/disk/by-partuuid. It may return an error."},{"line_number":64,"context_line":"func createPartuuidSymlinks() error {"},{"line_number":65,"context_line":"\t// Create the directory tree."},{"line_number":66,"context_line":"\tif err :\u003d unix.Mkdir(\"/dev/disk\", 0700); err !\u003d nil \u0026\u0026 !os.IsNotExist(err) {"},{"line_number":67,"context_line":"\t\treturn fmt.Errorf(\"couldn\u0027t create a directory at \\\"/dev/disk\\\": %w\", err)"}],"source_content_type":"text/x-go","patch_set":16,"id":"02017b18_bb84ae9b","line":64,"range":{"start_line":64,"start_character":5,"end_line":64,"end_character":27},"in_reply_to":"ee32fbdd_20d6690f","updated":"2021-11-22 14:21:56.000000000","message":"But even for a general-propose function (which should then live in pkg as you\u0027ve said), its interface IMO not great. It should return a map of UUIDs to device names (or stop after a given UUID has been found and return the device), not create symlinks. The whole symlinks thing comes from udev and I dislike it as it implicitly passes state around in the filesystem. For a general-purpose function in pkg this will also start breaking as soon as we enforce dependency-injected filesystem access with Landlock.","commit_id":"302f4365eaa396e96eb72dad9d64130c6c18eb16"},{"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":"3e2511dff6204da079099d71037ef34f79fa54b3","unresolved":true,"context_lines":[{"line_number":115,"context_line":"}"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"// resolveInstallerBlkdev transforms the ESP UUID into a path pointing to a"},{"line_number":118,"context_line":"// block device containing the installer partition, eg \"/dev/sda\", based on"},{"line_number":119,"context_line":"// information available in sysfs. It returns a correct path, or an error."},{"line_number":120,"context_line":"func resolveInstallerBlkdev(espUuid string) (string, error) {"},{"line_number":121,"context_line":"\t// Get the installer partition path based on the supplied espUuid. The path"}],"source_content_type":"text/x-go","patch_set":16,"id":"d71e13ee_4e03daa5","line":118,"range":{"start_line":118,"start_character":56,"end_line":118,"end_character":66},"updated":"2021-11-17 16:17:12.000000000","message":"That\u0027s no longer correct, right? This would return \"sda\" in the same example as far as I can see.","commit_id":"302f4365eaa396e96eb72dad9d64130c6c18eb16"},{"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":"faad1bf801257c178fb8cfc4161356da0e82a621","unresolved":false,"context_lines":[{"line_number":115,"context_line":"}"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"// resolveInstallerBlkdev transforms the ESP UUID into a path pointing to a"},{"line_number":118,"context_line":"// block device containing the installer partition, eg \"/dev/sda\", based on"},{"line_number":119,"context_line":"// information available in sysfs. It returns a correct path, or an error."},{"line_number":120,"context_line":"func resolveInstallerBlkdev(espUuid string) (string, error) {"},{"line_number":121,"context_line":"\t// Get the installer partition path based on the supplied espUuid. The path"}],"source_content_type":"text/x-go","patch_set":16,"id":"a36f79e1_6de88cee","line":118,"range":{"start_line":118,"start_character":56,"end_line":118,"end_character":66},"in_reply_to":"d71e13ee_4e03daa5","updated":"2021-11-19 20:07:42.000000000","message":"Done","commit_id":"302f4365eaa396e96eb72dad9d64130c6c18eb16"},{"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":"3e2511dff6204da079099d71037ef34f79fa54b3","unresolved":true,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":"// readPartitionTable causes the kernel to re-read the partition table present"},{"line_number":221,"context_line":"// in the block device at blkdevPath. It may return an error."},{"line_number":222,"context_line":"func readPartitionTable(blkdevPath string) error {"},{"line_number":223,"context_line":"\tdev, err :\u003d os.Open(blkdevPath)"},{"line_number":224,"context_line":"\tif err !\u003d nil {"},{"line_number":225,"context_line":"\t\treturn fmt.Errorf(\"couldn\u0027t open the block device at %q: %w\", blkdevPath, err)"}],"source_content_type":"text/x-go","patch_set":16,"id":"e75f921d_0a5e0c34","line":222,"range":{"start_line":222,"start_character":5,"end_line":222,"end_character":23},"updated":"2021-11-17 16:17:12.000000000","message":"rereadPartitionTable?","commit_id":"302f4365eaa396e96eb72dad9d64130c6c18eb16"},{"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":"15be4a3e3b199f4ed798c9c6cbcf53ae09c6c543","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":"// readPartitionTable causes the kernel to re-read the partition table present"},{"line_number":221,"context_line":"// in the block device at blkdevPath. It may return an error."},{"line_number":222,"context_line":"func readPartitionTable(blkdevPath string) error {"},{"line_number":223,"context_line":"\tdev, err :\u003d os.Open(blkdevPath)"},{"line_number":224,"context_line":"\tif err !\u003d nil {"},{"line_number":225,"context_line":"\t\treturn fmt.Errorf(\"couldn\u0027t open the block device at %q: %w\", blkdevPath, err)"}],"source_content_type":"text/x-go","patch_set":16,"id":"bc36bb55_74a18fcc","line":222,"range":{"start_line":222,"start_character":5,"end_line":222,"end_character":23},"in_reply_to":"14fd198c_aaff4d83","updated":"2021-11-25 19:26:13.000000000","message":"OK, I\u0027m convinced.","commit_id":"302f4365eaa396e96eb72dad9d64130c6c18eb16"},{"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":"19e8d52d165a143c3b64700d9b6af16050a531a3","unresolved":true,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":"// readPartitionTable causes the kernel to re-read the partition table present"},{"line_number":221,"context_line":"// in the block device at blkdevPath. It may return an error."},{"line_number":222,"context_line":"func readPartitionTable(blkdevPath string) error {"},{"line_number":223,"context_line":"\tdev, err :\u003d os.Open(blkdevPath)"},{"line_number":224,"context_line":"\tif err !\u003d nil {"},{"line_number":225,"context_line":"\t\treturn fmt.Errorf(\"couldn\u0027t open the block device at %q: %w\", blkdevPath, err)"}],"source_content_type":"text/x-go","patch_set":16,"id":"14fd198c_aaff4d83","line":222,"range":{"start_line":222,"start_character":5,"end_line":222,"end_character":23},"in_reply_to":"28557e02_8ead4a12","updated":"2021-11-22 14:21:56.000000000","message":"But if you look at the official documentation for BLKRRPART they also use the \"reread\" term. Having a function called \"readPartitionTable\" is IMO confusing as the kernel always reads the partition table the first time it sees a block device. Just if you manually modify it you need to tell it to reread it.","commit_id":"302f4365eaa396e96eb72dad9d64130c6c18eb16"},{"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":"faad1bf801257c178fb8cfc4161356da0e82a621","unresolved":true,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":"// readPartitionTable causes the kernel to re-read the partition table present"},{"line_number":221,"context_line":"// in the block device at blkdevPath. It may return an error."},{"line_number":222,"context_line":"func readPartitionTable(blkdevPath string) error {"},{"line_number":223,"context_line":"\tdev, err :\u003d os.Open(blkdevPath)"},{"line_number":224,"context_line":"\tif err !\u003d nil {"},{"line_number":225,"context_line":"\t\treturn fmt.Errorf(\"couldn\u0027t open the block device at %q: %w\", blkdevPath, err)"}],"source_content_type":"text/x-go","patch_set":16,"id":"28557e02_8ead4a12","line":222,"range":{"start_line":222,"start_character":5,"end_line":222,"end_character":23},"in_reply_to":"e75f921d_0a5e0c34","updated":"2021-11-19 20:07:42.000000000","message":"I thought about it, but found it too confusing. I\u0027d rather remove the \u0027re-read\u0027 from the comment, as that depends entirely on the call context.","commit_id":"302f4365eaa396e96eb72dad9d64130c6c18eb16"},{"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":"3e2511dff6204da079099d71037ef34f79fa54b3","unresolved":true,"context_lines":[{"line_number":242,"context_line":"func initializeSystemPartition(image io.Reader, targetBlkdev string) error {"},{"line_number":243,"context_line":"\t// It\u0027s always the second partition, right after the ESP. Construct the block"},{"line_number":244,"context_line":"\t// device path accordingly."},{"line_number":245,"context_line":"\tpartPath :\u003d targetBlkdev + \"2\""},{"line_number":246,"context_line":"\t// Check that partPath points at an actual block device."},{"line_number":247,"context_line":"\tinfo, err :\u003d os.Stat(partPath)"},{"line_number":248,"context_line":"\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":16,"id":"4b601f5f_dca35ad3","line":245,"range":{"start_line":245,"start_character":13,"end_line":245,"end_character":25},"updated":"2021-11-17 16:17:12.000000000","message":"This doesn\u0027t work for NVMe. Example: /dev/nvme1n1\u0027s second partition is at /dev/nvme1n1p2. In the short term I would just open the block device and seek to the first LBA of the partition. Long-term this should be replaced with a GPT package.","commit_id":"302f4365eaa396e96eb72dad9d64130c6c18eb16"},{"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":"faad1bf801257c178fb8cfc4161356da0e82a621","unresolved":false,"context_lines":[{"line_number":242,"context_line":"func initializeSystemPartition(image io.Reader, targetBlkdev string) error {"},{"line_number":243,"context_line":"\t// It\u0027s always the second partition, right after the ESP. Construct the block"},{"line_number":244,"context_line":"\t// device path accordingly."},{"line_number":245,"context_line":"\tpartPath :\u003d targetBlkdev + \"2\""},{"line_number":246,"context_line":"\t// Check that partPath points at an actual block device."},{"line_number":247,"context_line":"\tinfo, err :\u003d os.Stat(partPath)"},{"line_number":248,"context_line":"\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":16,"id":"510a2826_71cceb32","line":245,"range":{"start_line":245,"start_character":13,"end_line":245,"end_character":25},"in_reply_to":"4b601f5f_dca35ad3","updated":"2021-11-19 20:07:42.000000000","message":"I\u0027ll try to get the partition path from sysfs.","commit_id":"302f4365eaa396e96eb72dad9d64130c6c18eb16"},{"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":"3e2511dff6204da079099d71037ef34f79fa54b3","unresolved":true,"context_lines":[{"line_number":262,"context_line":"\tif err !\u003d nil {"},{"line_number":263,"context_line":"\t\treturn fmt.Errorf(\"couldn\u0027t probe the size of %q: %w\", partPath, err)"},{"line_number":264,"context_line":"\t}"},{"line_number":265,"context_line":"\tsrc :\u003d io.LimitReader(image, int64(size))"},{"line_number":266,"context_line":"\t// Copy the system partition contents. Use a bigger buffer to optimize disk"},{"line_number":267,"context_line":"\t// writes."},{"line_number":268,"context_line":"\tbuf :\u003d make([]byte, mib)"}],"source_content_type":"text/x-go","patch_set":16,"id":"2b0f8eae_25de40e6","line":265,"range":{"start_line":265,"start_character":11,"end_line":265,"end_character":22},"updated":"2021-11-17 16:17:12.000000000","message":"I\u0027m pretty sure this is doesn\u0027t do anything currently. But even if this should be a hard error and not just cut off. Also should probably be validated before even attempting to write to this.","commit_id":"302f4365eaa396e96eb72dad9d64130c6c18eb16"},{"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":"faad1bf801257c178fb8cfc4161356da0e82a621","unresolved":false,"context_lines":[{"line_number":262,"context_line":"\tif err !\u003d nil {"},{"line_number":263,"context_line":"\t\treturn fmt.Errorf(\"couldn\u0027t probe the size of %q: %w\", partPath, err)"},{"line_number":264,"context_line":"\t}"},{"line_number":265,"context_line":"\tsrc :\u003d io.LimitReader(image, int64(size))"},{"line_number":266,"context_line":"\t// Copy the system partition contents. Use a bigger buffer to optimize disk"},{"line_number":267,"context_line":"\t// writes."},{"line_number":268,"context_line":"\tbuf :\u003d make([]byte, mib)"}],"source_content_type":"text/x-go","patch_set":16,"id":"9001ade8_2cd99b55","line":265,"range":{"start_line":265,"start_character":11,"end_line":265,"end_character":22},"in_reply_to":"2b0f8eae_25de40e6","updated":"2021-11-19 20:07:42.000000000","message":"Yeah, I should\u0027ve removed this. I wrote it this way to be able to pad the image easily and have used it once in a benchmark. The target device\u0027s size is validated in main.","commit_id":"302f4365eaa396e96eb72dad9d64130c6c18eb16"},{"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":"19e8d52d165a143c3b64700d9b6af16050a531a3","unresolved":true,"context_lines":[{"line_number":236,"context_line":"}"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"// partitionName returns the name of a block device associated with the"},{"line_number":239,"context_line":"// partition at index in the containing block device dev, eg \"nvme0n1pN\" for"},{"line_number":240,"context_line":"// \"nvme0n1\" or \"sdaN\" for \"sda\", based on information available in sysfs. It"},{"line_number":241,"context_line":"// returns a correct name, or an error."},{"line_number":242,"context_line":"func partitionName(dev string, index int) (string, error) {"}],"source_content_type":"text/x-go","patch_set":19,"id":"bf5507ee_0b0b4c0e","line":239,"range":{"start_line":239,"start_character":58,"end_line":239,"end_character":60},"updated":"2021-11-22 14:21:56.000000000","message":"e.g.","commit_id":"0e6793a85932da6dea37e62cc76521be1540148e"},{"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":"c94b244f624a982f062bb72d6af7f0e482b12504","unresolved":false,"context_lines":[{"line_number":236,"context_line":"}"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"// partitionName returns the name of a block device associated with the"},{"line_number":239,"context_line":"// partition at index in the containing block device dev, eg \"nvme0n1pN\" for"},{"line_number":240,"context_line":"// \"nvme0n1\" or \"sdaN\" for \"sda\", based on information available in sysfs. It"},{"line_number":241,"context_line":"// returns a correct name, or an error."},{"line_number":242,"context_line":"func partitionName(dev string, index int) (string, error) {"}],"source_content_type":"text/x-go","patch_set":19,"id":"bad85c38_8b60fee2","line":239,"range":{"start_line":239,"start_character":58,"end_line":239,"end_character":60},"in_reply_to":"930f8d61_e36846d7","updated":"2021-11-29 14:57:59.000000000","message":"Ack","commit_id":"0e6793a85932da6dea37e62cc76521be1540148e"},{"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":"15be4a3e3b199f4ed798c9c6cbcf53ae09c6c543","unresolved":true,"context_lines":[{"line_number":236,"context_line":"}"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"// partitionName returns the name of a block device associated with the"},{"line_number":239,"context_line":"// partition at index in the containing block device dev, eg \"nvme0n1pN\" for"},{"line_number":240,"context_line":"// \"nvme0n1\" or \"sdaN\" for \"sda\", based on information available in sysfs. It"},{"line_number":241,"context_line":"// returns a correct name, or an error."},{"line_number":242,"context_line":"func partitionName(dev string, index int) (string, error) {"}],"source_content_type":"text/x-go","patch_set":19,"id":"930f8d61_e36846d7","line":239,"range":{"start_line":239,"start_character":58,"end_line":239,"end_character":60},"in_reply_to":"bf5507ee_0b0b4c0e","updated":"2021-11-25 19:26:13.000000000","message":"https://en.wikipedia.org/wiki/List_of_Latin_phrases_(E)#cite_note-27","commit_id":"0e6793a85932da6dea37e62cc76521be1540148e"},{"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":"19e8d52d165a143c3b64700d9b6af16050a531a3","unresolved":true,"context_lines":[{"line_number":247,"context_line":"\t}"},{"line_number":248,"context_line":"\tfor _, info :\u003d range dir {"},{"line_number":249,"context_line":"\t\tppath :\u003d filepath.Join(dp, info.Name())"},{"line_number":250,"context_line":"\t\tinfo, err :\u003d os.Stat(ppath)"},{"line_number":251,"context_line":"\t\tif err !\u003d nil {"},{"line_number":252,"context_line":"\t\t\treturn \"\", err"},{"line_number":253,"context_line":"\t\t}"},{"line_number":254,"context_line":"\t\t// Skip non-directories"},{"line_number":255,"context_line":"\t\tif info.Mode()\u0026os.ModeDir \u003d\u003d 0 {"},{"line_number":256,"context_line":"\t\t\tcontinue"},{"line_number":257,"context_line":"\t\t}"},{"line_number":258,"context_line":"\t\t// Check whether the directory contains a file named \u0027partition\u0027. If that\u0027s"},{"line_number":259,"context_line":"\t\t// the case, read the partition index from it and compare it with the one"},{"line_number":260,"context_line":"\t\t// supplied as a function parameter. If they\u0027re equal, return the directory"},{"line_number":261,"context_line":"\t\t// name."}],"source_content_type":"text/x-go","patch_set":19,"id":"0a05a7db_6dc5e1d4","line":258,"range":{"start_line":250,"start_character":0,"end_line":258,"end_character":0},"updated":"2021-11-22 14:21:56.000000000","message":"You should be able to just do:\n  if !info.IsDir() {\n    continue\n  }","commit_id":"0e6793a85932da6dea37e62cc76521be1540148e"},{"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":"1199f057ee58fd710229a0855387d4f24818a229","unresolved":false,"context_lines":[{"line_number":247,"context_line":"\t}"},{"line_number":248,"context_line":"\tfor _, info :\u003d range dir {"},{"line_number":249,"context_line":"\t\tppath :\u003d filepath.Join(dp, info.Name())"},{"line_number":250,"context_line":"\t\tinfo, err :\u003d os.Stat(ppath)"},{"line_number":251,"context_line":"\t\tif err !\u003d nil {"},{"line_number":252,"context_line":"\t\t\treturn \"\", err"},{"line_number":253,"context_line":"\t\t}"},{"line_number":254,"context_line":"\t\t// Skip non-directories"},{"line_number":255,"context_line":"\t\tif info.Mode()\u0026os.ModeDir \u003d\u003d 0 {"},{"line_number":256,"context_line":"\t\t\tcontinue"},{"line_number":257,"context_line":"\t\t}"},{"line_number":258,"context_line":"\t\t// Check whether the directory contains a file named \u0027partition\u0027. If that\u0027s"},{"line_number":259,"context_line":"\t\t// the case, read the partition index from it and compare it with the one"},{"line_number":260,"context_line":"\t\t// supplied as a function parameter. If they\u0027re equal, return the directory"},{"line_number":261,"context_line":"\t\t// name."}],"source_content_type":"text/x-go","patch_set":19,"id":"c712e549_f3a8b830","line":258,"range":{"start_line":250,"start_character":0,"end_line":258,"end_character":0},"in_reply_to":"03aba3d7_2f4d1d96","updated":"2021-11-29 23:55:11.000000000","message":"Done","commit_id":"0e6793a85932da6dea37e62cc76521be1540148e"},{"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":"15be4a3e3b199f4ed798c9c6cbcf53ae09c6c543","unresolved":false,"context_lines":[{"line_number":247,"context_line":"\t}"},{"line_number":248,"context_line":"\tfor _, info :\u003d range dir {"},{"line_number":249,"context_line":"\t\tppath :\u003d filepath.Join(dp, info.Name())"},{"line_number":250,"context_line":"\t\tinfo, err :\u003d os.Stat(ppath)"},{"line_number":251,"context_line":"\t\tif err !\u003d nil {"},{"line_number":252,"context_line":"\t\t\treturn \"\", err"},{"line_number":253,"context_line":"\t\t}"},{"line_number":254,"context_line":"\t\t// Skip non-directories"},{"line_number":255,"context_line":"\t\tif info.Mode()\u0026os.ModeDir \u003d\u003d 0 {"},{"line_number":256,"context_line":"\t\t\tcontinue"},{"line_number":257,"context_line":"\t\t}"},{"line_number":258,"context_line":"\t\t// Check whether the directory contains a file named \u0027partition\u0027. If that\u0027s"},{"line_number":259,"context_line":"\t\t// the case, read the partition index from it and compare it with the one"},{"line_number":260,"context_line":"\t\t// supplied as a function parameter. If they\u0027re equal, return the directory"},{"line_number":261,"context_line":"\t\t// name."}],"source_content_type":"text/x-go","patch_set":19,"id":"73635d47_80ca2ab1","line":258,"range":{"start_line":250,"start_character":0,"end_line":258,"end_character":0},"in_reply_to":"0a05a7db_6dc5e1d4","updated":"2021-11-25 19:26:13.000000000","message":"Done","commit_id":"0e6793a85932da6dea37e62cc76521be1540148e"},{"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":"c94b244f624a982f062bb72d6af7f0e482b12504","unresolved":true,"context_lines":[{"line_number":247,"context_line":"\t}"},{"line_number":248,"context_line":"\tfor _, info :\u003d range dir {"},{"line_number":249,"context_line":"\t\tppath :\u003d filepath.Join(dp, info.Name())"},{"line_number":250,"context_line":"\t\tinfo, err :\u003d os.Stat(ppath)"},{"line_number":251,"context_line":"\t\tif err !\u003d nil {"},{"line_number":252,"context_line":"\t\t\treturn \"\", err"},{"line_number":253,"context_line":"\t\t}"},{"line_number":254,"context_line":"\t\t// Skip non-directories"},{"line_number":255,"context_line":"\t\tif info.Mode()\u0026os.ModeDir \u003d\u003d 0 {"},{"line_number":256,"context_line":"\t\t\tcontinue"},{"line_number":257,"context_line":"\t\t}"},{"line_number":258,"context_line":"\t\t// Check whether the directory contains a file named \u0027partition\u0027. If that\u0027s"},{"line_number":259,"context_line":"\t\t// the case, read the partition index from it and compare it with the one"},{"line_number":260,"context_line":"\t\t// supplied as a function parameter. If they\u0027re equal, return the directory"},{"line_number":261,"context_line":"\t\t// name."}],"source_content_type":"text/x-go","patch_set":19,"id":"03aba3d7_2f4d1d96","line":258,"range":{"start_line":250,"start_character":0,"end_line":258,"end_character":0},"in_reply_to":"73635d47_80ca2ab1","updated":"2021-11-29 14:57:59.000000000","message":"I should have been a bit more explicit: You don\u0027t need to os.Stat() the path at all, ReadDir returns that information already. Also once you drop the stat code you can inline the ppath definition below as it\u0027s the only user left.","commit_id":"0e6793a85932da6dea37e62cc76521be1540148e"},{"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":"19e8d52d165a143c3b64700d9b6af16050a531a3","unresolved":true,"context_lines":[{"line_number":267,"context_line":"\t\t\treturn \"\", err"},{"line_number":268,"context_line":"\t\t}"},{"line_number":269,"context_line":"\t\tvar pi int"},{"line_number":270,"context_line":"\t\t// istr holds a zero-terminated ASCII-encoded decimal number."},{"line_number":271,"context_line":"\t\tif _, err :\u003d fmt.Sscanf(string(istr[:]), \"%d\", \u0026pi); err !\u003d nil {"},{"line_number":272,"context_line":"\t\t\treturn \"\", fmt.Errorf(\"couldn\u0027t parse the partition index\")"},{"line_number":273,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":19,"id":"58769c78_cba9b0aa","line":270,"range":{"start_line":270,"start_character":18,"end_line":270,"end_character":33},"updated":"2021-11-22 14:21:56.000000000","message":"This file is newline-terminated, not zero-terminated.","commit_id":"0e6793a85932da6dea37e62cc76521be1540148e"},{"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":"15be4a3e3b199f4ed798c9c6cbcf53ae09c6c543","unresolved":false,"context_lines":[{"line_number":267,"context_line":"\t\t\treturn \"\", err"},{"line_number":268,"context_line":"\t\t}"},{"line_number":269,"context_line":"\t\tvar pi int"},{"line_number":270,"context_line":"\t\t// istr holds a zero-terminated ASCII-encoded decimal number."},{"line_number":271,"context_line":"\t\tif _, err :\u003d fmt.Sscanf(string(istr[:]), \"%d\", \u0026pi); err !\u003d nil {"},{"line_number":272,"context_line":"\t\t\treturn \"\", fmt.Errorf(\"couldn\u0027t parse the partition index\")"},{"line_number":273,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":19,"id":"c8900126_8bcdbcb8","line":270,"range":{"start_line":270,"start_character":18,"end_line":270,"end_character":33},"in_reply_to":"58769c78_cba9b0aa","updated":"2021-11-25 19:26:13.000000000","message":"Done","commit_id":"0e6793a85932da6dea37e62cc76521be1540148e"},{"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":"19e8d52d165a143c3b64700d9b6af16050a531a3","unresolved":true,"context_lines":[{"line_number":268,"context_line":"\t\t}"},{"line_number":269,"context_line":"\t\tvar pi int"},{"line_number":270,"context_line":"\t\t// istr holds a zero-terminated ASCII-encoded decimal number."},{"line_number":271,"context_line":"\t\tif _, err :\u003d fmt.Sscanf(string(istr[:]), \"%d\", \u0026pi); err !\u003d nil {"},{"line_number":272,"context_line":"\t\t\treturn \"\", fmt.Errorf(\"couldn\u0027t parse the partition index\")"},{"line_number":273,"context_line":"\t\t}"},{"line_number":274,"context_line":"\t\tif pi \u003d\u003d index {"},{"line_number":275,"context_line":"\t\t\treturn info.Name(), nil"},{"line_number":276,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":19,"id":"10a1cf1d_c02a2158","line":273,"range":{"start_line":271,"start_character":1,"end_line":273,"end_character":3},"updated":"2021-11-22 14:21:56.000000000","message":"You could drop the separate `var pi int` and make this simpler:\n  pi, err :\u003d strconv.Atoi(strings.TrimSuffix(string(istr), \"\\n\"))\n  if err !\u003d nil {\n    return \"\", fmt.Errorf(\"failed to parse partition index: %w\", err)\n  }","commit_id":"0e6793a85932da6dea37e62cc76521be1540148e"},{"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":"15be4a3e3b199f4ed798c9c6cbcf53ae09c6c543","unresolved":false,"context_lines":[{"line_number":268,"context_line":"\t\t}"},{"line_number":269,"context_line":"\t\tvar pi int"},{"line_number":270,"context_line":"\t\t// istr holds a zero-terminated ASCII-encoded decimal number."},{"line_number":271,"context_line":"\t\tif _, err :\u003d fmt.Sscanf(string(istr[:]), \"%d\", \u0026pi); err !\u003d nil {"},{"line_number":272,"context_line":"\t\t\treturn \"\", fmt.Errorf(\"couldn\u0027t parse the partition index\")"},{"line_number":273,"context_line":"\t\t}"},{"line_number":274,"context_line":"\t\tif pi \u003d\u003d index {"},{"line_number":275,"context_line":"\t\t\treturn info.Name(), nil"},{"line_number":276,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":19,"id":"a4d30799_8831d6ad","line":273,"range":{"start_line":271,"start_character":1,"end_line":273,"end_character":3},"in_reply_to":"10a1cf1d_c02a2158","updated":"2021-11-25 19:26:13.000000000","message":"Done","commit_id":"0e6793a85932da6dea37e62cc76521be1540148e"},{"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":"c94b244f624a982f062bb72d6af7f0e482b12504","unresolved":true,"context_lines":[{"line_number":62,"context_line":"// mountInstallerESP mounts the filesystem the installer was loaded from (based"},{"line_number":63,"context_line":"// on its associated partition UUID) under \"/installer\". It may return an error."},{"line_number":64,"context_line":"func mountInstallerESP() error {"},{"line_number":65,"context_line":"\t// Read the installer ESP UUID from efivarfs."},{"line_number":66,"context_line":"\tespUuid, err :\u003d efivarfs.ReadLoaderDevicePartUUID()"},{"line_number":67,"context_line":"\tif err !\u003d nil {"},{"line_number":68,"context_line":"\t\treturn fmt.Errorf(\"while reading the installer ESP UUID: %w\", err)"},{"line_number":69,"context_line":"\t}"},{"line_number":70,"context_line":"\t// Look up the installer partition based on espUuid."},{"line_number":71,"context_line":"\tespDev, err :\u003d sysfs.DeviceByPartUuid(espUuid)"},{"line_number":72,"context_line":"\tif err !\u003d nil {"},{"line_number":73,"context_line":"\t\treturn fmt.Errorf(\"while resolving the installer device handle: %w\", err)"},{"line_number":74,"context_line":"\t}"},{"line_number":75,"context_line":"\tespPath :\u003d filepath.Join(\"/dev\", espDev)"},{"line_number":76,"context_line":"\t// Create the mountpoint."},{"line_number":77,"context_line":"\tif err :\u003d unix.Mkdir(\"/installer\", 0700); err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":20,"id":"97bc3c8d_f43c87d1","line":74,"range":{"start_line":65,"start_character":1,"end_line":74,"end_character":2},"updated":"2021-11-29 14:57:59.000000000","message":"Please move this into main() and pass the espDev down into this and probeBlkdevs.","commit_id":"691d44b03d0844573ec9cfaf9d74893d68067e2c"},{"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":"1199f057ee58fd710229a0855387d4f24818a229","unresolved":false,"context_lines":[{"line_number":62,"context_line":"// mountInstallerESP mounts the filesystem the installer was loaded from (based"},{"line_number":63,"context_line":"// on its associated partition UUID) under \"/installer\". It may return an error."},{"line_number":64,"context_line":"func mountInstallerESP() error {"},{"line_number":65,"context_line":"\t// Read the installer ESP UUID from efivarfs."},{"line_number":66,"context_line":"\tespUuid, err :\u003d efivarfs.ReadLoaderDevicePartUUID()"},{"line_number":67,"context_line":"\tif err !\u003d nil {"},{"line_number":68,"context_line":"\t\treturn fmt.Errorf(\"while reading the installer ESP UUID: %w\", err)"},{"line_number":69,"context_line":"\t}"},{"line_number":70,"context_line":"\t// Look up the installer partition based on espUuid."},{"line_number":71,"context_line":"\tespDev, err :\u003d sysfs.DeviceByPartUuid(espUuid)"},{"line_number":72,"context_line":"\tif err !\u003d nil {"},{"line_number":73,"context_line":"\t\treturn fmt.Errorf(\"while resolving the installer device handle: %w\", err)"},{"line_number":74,"context_line":"\t}"},{"line_number":75,"context_line":"\tespPath :\u003d filepath.Join(\"/dev\", espDev)"},{"line_number":76,"context_line":"\t// Create the mountpoint."},{"line_number":77,"context_line":"\tif err :\u003d unix.Mkdir(\"/installer\", 0700); err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":20,"id":"64d4b8e7_723a2597","line":74,"range":{"start_line":65,"start_character":1,"end_line":74,"end_character":2},"in_reply_to":"97bc3c8d_f43c87d1","updated":"2021-11-29 23:55:11.000000000","message":"Done","commit_id":"691d44b03d0844573ec9cfaf9d74893d68067e2c"},{"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":"c94b244f624a982f062bb72d6af7f0e482b12504","unresolved":true,"context_lines":[{"line_number":87,"context_line":"// probeBlkdevs returns block devices suitable for hosting a Metropolis"},{"line_number":88,"context_line":"// installation, limited by the size expressed in bytes. It returns either a"},{"line_number":89,"context_line":"// slice containing device handles (eg sda, sdb), or an error."},{"line_number":90,"context_line":"func probeBlkdevs(minSize uint64) ([]string, error) {"},{"line_number":91,"context_line":"\t// Look up the block device the installer\u0027s booted from based on its"},{"line_number":92,"context_line":"\t// partition UUID."},{"line_number":93,"context_line":"\tespUuid, err :\u003d efivarfs.ReadLoaderDevicePartUUID()"}],"source_content_type":"text/x-go","patch_set":20,"id":"472f63dc_87f7cb16","line":90,"range":{"start_line":90,"start_character":5,"end_line":90,"end_character":17},"updated":"2021-11-29 14:57:59.000000000","message":"findInstallableBlockDevices? The comment is fine but I\u0027d still like to also have descriptive function names.","commit_id":"691d44b03d0844573ec9cfaf9d74893d68067e2c"},{"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":"1199f057ee58fd710229a0855387d4f24818a229","unresolved":false,"context_lines":[{"line_number":87,"context_line":"// probeBlkdevs returns block devices suitable for hosting a Metropolis"},{"line_number":88,"context_line":"// installation, limited by the size expressed in bytes. It returns either a"},{"line_number":89,"context_line":"// slice containing device handles (eg sda, sdb), or an error."},{"line_number":90,"context_line":"func probeBlkdevs(minSize uint64) ([]string, error) {"},{"line_number":91,"context_line":"\t// Look up the block device the installer\u0027s booted from based on its"},{"line_number":92,"context_line":"\t// partition UUID."},{"line_number":93,"context_line":"\tespUuid, err :\u003d efivarfs.ReadLoaderDevicePartUUID()"}],"source_content_type":"text/x-go","patch_set":20,"id":"9788ab97_7d4fa1a6","line":90,"range":{"start_line":90,"start_character":5,"end_line":90,"end_character":17},"in_reply_to":"472f63dc_87f7cb16","updated":"2021-11-29 23:55:11.000000000","message":"Done","commit_id":"691d44b03d0844573ec9cfaf9d74893d68067e2c"}],"metropolis/pkg/sysfs/block.go":[{"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":"c94b244f624a982f062bb72d6af7f0e482b12504","unresolved":true,"context_lines":[{"line_number":24,"context_line":")"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"// PartUuidMap returns a mapping between partition UUIDs and block device"},{"line_number":27,"context_line":"// names based on information exposed by uevent. It assumes sysfs is already"},{"line_number":28,"context_line":"// mounted at /sys. UUID keys of the returned map are represented as lowercase"},{"line_number":29,"context_line":"// strings. It returns either a complete map, or an error."},{"line_number":30,"context_line":"func PartUuidMap() (map[string]string, error) {"},{"line_number":31,"context_line":"\tm :\u003d make(map[string]string)"}],"source_content_type":"text/x-go","patch_set":20,"id":"83cb1233_974a8bd8","line":28,"range":{"start_line":27,"start_character":49,"end_line":28,"end_character":19},"updated":"2021-11-29 14:57:59.000000000","message":"Can we move this to package-level docs? This is the sysfs package after all, it\u0027s generally expected that all functionality in here depends on sysfs being mounted.","commit_id":"691d44b03d0844573ec9cfaf9d74893d68067e2c"},{"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":"1199f057ee58fd710229a0855387d4f24818a229","unresolved":false,"context_lines":[{"line_number":24,"context_line":")"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"// PartUuidMap returns a mapping between partition UUIDs and block device"},{"line_number":27,"context_line":"// names based on information exposed by uevent. It assumes sysfs is already"},{"line_number":28,"context_line":"// mounted at /sys. UUID keys of the returned map are represented as lowercase"},{"line_number":29,"context_line":"// strings. It returns either a complete map, or an error."},{"line_number":30,"context_line":"func PartUuidMap() (map[string]string, error) {"},{"line_number":31,"context_line":"\tm :\u003d make(map[string]string)"}],"source_content_type":"text/x-go","patch_set":20,"id":"11a09e2c_e0ddf103","line":28,"range":{"start_line":27,"start_character":49,"end_line":28,"end_character":19},"in_reply_to":"83cb1233_974a8bd8","updated":"2021-11-29 23:55:11.000000000","message":"Done","commit_id":"691d44b03d0844573ec9cfaf9d74893d68067e2c"},{"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":"c94b244f624a982f062bb72d6af7f0e482b12504","unresolved":true,"context_lines":[{"line_number":26,"context_line":"// PartUuidMap returns a mapping between partition UUIDs and block device"},{"line_number":27,"context_line":"// names based on information exposed by uevent. It assumes sysfs is already"},{"line_number":28,"context_line":"// mounted at /sys. UUID keys of the returned map are represented as lowercase"},{"line_number":29,"context_line":"// strings. It returns either a complete map, or an error."},{"line_number":30,"context_line":"func PartUuidMap() (map[string]string, error) {"},{"line_number":31,"context_line":"\tm :\u003d make(map[string]string)"},{"line_number":32,"context_line":"\t// Get a list of block device symlinks from sysfs."}],"source_content_type":"text/x-go","patch_set":20,"id":"d1d0e96a_9228fd37","line":29,"range":{"start_line":29,"start_character":12,"end_line":29,"end_character":58},"updated":"2021-11-29 14:57:59.000000000","message":"Can we drop all of these? This is by convention in Go. Only mention return values if they deviate from this convention (i.e. a function returns useful partial data if it encounters some specific errors).","commit_id":"691d44b03d0844573ec9cfaf9d74893d68067e2c"},{"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":"1199f057ee58fd710229a0855387d4f24818a229","unresolved":false,"context_lines":[{"line_number":26,"context_line":"// PartUuidMap returns a mapping between partition UUIDs and block device"},{"line_number":27,"context_line":"// names based on information exposed by uevent. It assumes sysfs is already"},{"line_number":28,"context_line":"// mounted at /sys. UUID keys of the returned map are represented as lowercase"},{"line_number":29,"context_line":"// strings. It returns either a complete map, or an error."},{"line_number":30,"context_line":"func PartUuidMap() (map[string]string, error) {"},{"line_number":31,"context_line":"\tm :\u003d make(map[string]string)"},{"line_number":32,"context_line":"\t// Get a list of block device symlinks from sysfs."}],"source_content_type":"text/x-go","patch_set":20,"id":"71d38f97_380f3438","line":29,"range":{"start_line":29,"start_character":12,"end_line":29,"end_character":58},"in_reply_to":"d1d0e96a_9228fd37","updated":"2021-11-29 23:55:11.000000000","message":"I\u0027m glad to hear that. For a while I thought it was part of our coding standard to state it explicitly. Could you point me to a document describing that convention, though?","commit_id":"691d44b03d0844573ec9cfaf9d74893d68067e2c"},{"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":"c94b244f624a982f062bb72d6af7f0e482b12504","unresolved":true,"context_lines":[{"line_number":27,"context_line":"// names based on information exposed by uevent. It assumes sysfs is already"},{"line_number":28,"context_line":"// mounted at /sys. UUID keys of the returned map are represented as lowercase"},{"line_number":29,"context_line":"// strings. It returns either a complete map, or an error."},{"line_number":30,"context_line":"func PartUuidMap() (map[string]string, error) {"},{"line_number":31,"context_line":"\tm :\u003d make(map[string]string)"},{"line_number":32,"context_line":"\t// Get a list of block device symlinks from sysfs."},{"line_number":33,"context_line":"\tconst blkDirPath \u003d \"/sys/class/block\""}],"source_content_type":"text/x-go","patch_set":20,"id":"bead6d07_2aed294d","line":30,"range":{"start_line":30,"start_character":5,"end_line":30,"end_character":16},"updated":"2021-11-29 14:57:59.000000000","message":"Could you rename this to PartUUIDMap? See https://github.com/golang/go/wiki/CodeReviewComments#initialisms.\nSame for all other mentions of UUID in function names.","commit_id":"691d44b03d0844573ec9cfaf9d74893d68067e2c"},{"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":"1199f057ee58fd710229a0855387d4f24818a229","unresolved":false,"context_lines":[{"line_number":27,"context_line":"// names based on information exposed by uevent. It assumes sysfs is already"},{"line_number":28,"context_line":"// mounted at /sys. UUID keys of the returned map are represented as lowercase"},{"line_number":29,"context_line":"// strings. It returns either a complete map, or an error."},{"line_number":30,"context_line":"func PartUuidMap() (map[string]string, error) {"},{"line_number":31,"context_line":"\tm :\u003d make(map[string]string)"},{"line_number":32,"context_line":"\t// Get a list of block device symlinks from sysfs."},{"line_number":33,"context_line":"\tconst blkDirPath \u003d \"/sys/class/block\""}],"source_content_type":"text/x-go","patch_set":20,"id":"83b1e57f_4412ce07","line":30,"range":{"start_line":30,"start_character":5,"end_line":30,"end_character":16},"in_reply_to":"bead6d07_2aed294d","updated":"2021-11-29 23:55:11.000000000","message":"Done","commit_id":"691d44b03d0844573ec9cfaf9d74893d68067e2c"},{"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":"c94b244f624a982f062bb72d6af7f0e482b12504","unresolved":true,"context_lines":[{"line_number":44,"context_line":"\t\tif err !\u003d nil {"},{"line_number":45,"context_line":"\t\t\treturn m, fmt.Errorf(\"while reading uevents: %w\", err)"},{"line_number":46,"context_line":"\t\t}"},{"line_number":47,"context_line":"\t\t// Check that keys required to create a symlink are present in the map."},{"line_number":48,"context_line":"\t\tif uuid, name :\u003d kv[\"PARTUUID\"], kv[\"DEVNAME\"]; uuid !\u003d \"\" \u0026\u0026 name !\u003d \"\" {"},{"line_number":49,"context_line":"\t\t\tm[uuid] \u003d name"},{"line_number":50,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":20,"id":"d3842a3f_1998b0ec","line":47,"range":{"start_line":47,"start_character":40,"end_line":47,"end_character":49},"updated":"2021-11-29 14:57:59.000000000","message":"Leftover from copy/pasting","commit_id":"691d44b03d0844573ec9cfaf9d74893d68067e2c"},{"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":"1199f057ee58fd710229a0855387d4f24818a229","unresolved":false,"context_lines":[{"line_number":44,"context_line":"\t\tif err !\u003d nil {"},{"line_number":45,"context_line":"\t\t\treturn m, fmt.Errorf(\"while reading uevents: %w\", err)"},{"line_number":46,"context_line":"\t\t}"},{"line_number":47,"context_line":"\t\t// Check that keys required to create a symlink are present in the map."},{"line_number":48,"context_line":"\t\tif uuid, name :\u003d kv[\"PARTUUID\"], kv[\"DEVNAME\"]; uuid !\u003d \"\" \u0026\u0026 name !\u003d \"\" {"},{"line_number":49,"context_line":"\t\t\tm[uuid] \u003d name"},{"line_number":50,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":20,"id":"36fd4cb9_beccb44f","line":47,"range":{"start_line":47,"start_character":40,"end_line":47,"end_character":49},"in_reply_to":"d3842a3f_1998b0ec","updated":"2021-11-29 23:55:11.000000000","message":"Done","commit_id":"691d44b03d0844573ec9cfaf9d74893d68067e2c"}]}
