)]}'
{"pkg/bootstrap/isogen/command.go":[{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"a36eb4964149a4f41331543ee305e0d0608c2bec","unresolved":false,"context_lines":[{"line_number":173,"context_line":"\t\t\t[]string{},"},{"line_number":174,"context_line":"\t\t\tnil,"},{"line_number":175,"context_line":"\t\t\tvols,"},{"line_number":176,"context_line":"\t\t\t[]string{"},{"line_number":177,"context_line":"\t\t\t\tfmt.Sprintf(\"BUILDER_CONFIG\u003d%s\", builderCfgLocation),"},{"line_number":178,"context_line":"\t\t\t\tfmt.Sprintf(\"http_proxy\u003d%s\", os.Getenv(\"http_proxy\")),"},{"line_number":179,"context_line":"\t\t\t\tfmt.Sprintf(\"https_proxy\u003d%s\", os.Getenv(\"https_proxy\")),"},{"line_number":180,"context_line":"\t\t\t\tfmt.Sprintf(\"HTTP_PROXY\u003d%s\", os.Getenv(\"HTTP_PROXY\")),"},{"line_number":181,"context_line":"\t\t\t\tfmt.Sprintf(\"HTTPS_PROXY\u003d%s\", os.Getenv(\"HTTPS_PROXY\")),"},{"line_number":182,"context_line":"\t\t\t\tfmt.Sprintf(\"NO_PROXY\u003d%s\", os.Getenv(\"NO_PROXY\")),"},{"line_number":183,"context_line":"\t\t\t},"},{"line_number":184,"context_line":"\t\t\ttrue,"},{"line_number":185,"context_line":"\t\t\tdebug,"},{"line_number":186,"context_line":"\t\t); err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_c9cf9327","line":183,"range":{"start_line":176,"start_character":0,"end_line":183,"end_character":5},"updated":"2020-08-12 13:50:49.000000000","message":"this can be moved to variable to improve readability","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"91a3d774302b5e2c6b9b46555a292a91c3201d1b","unresolved":false,"context_lines":[{"line_number":173,"context_line":"\t\t\t[]string{},"},{"line_number":174,"context_line":"\t\t\tnil,"},{"line_number":175,"context_line":"\t\t\tvols,"},{"line_number":176,"context_line":"\t\t\t[]string{"},{"line_number":177,"context_line":"\t\t\t\tfmt.Sprintf(\"BUILDER_CONFIG\u003d%s\", builderCfgLocation),"},{"line_number":178,"context_line":"\t\t\t\tfmt.Sprintf(\"http_proxy\u003d%s\", os.Getenv(\"http_proxy\")),"},{"line_number":179,"context_line":"\t\t\t\tfmt.Sprintf(\"https_proxy\u003d%s\", os.Getenv(\"https_proxy\")),"},{"line_number":180,"context_line":"\t\t\t\tfmt.Sprintf(\"HTTP_PROXY\u003d%s\", os.Getenv(\"HTTP_PROXY\")),"},{"line_number":181,"context_line":"\t\t\t\tfmt.Sprintf(\"HTTPS_PROXY\u003d%s\", os.Getenv(\"HTTPS_PROXY\")),"},{"line_number":182,"context_line":"\t\t\t\tfmt.Sprintf(\"NO_PROXY\u003d%s\", os.Getenv(\"NO_PROXY\")),"},{"line_number":183,"context_line":"\t\t\t},"},{"line_number":184,"context_line":"\t\t\ttrue,"},{"line_number":185,"context_line":"\t\t\tdebug,"},{"line_number":186,"context_line":"\t\t); err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_07ed908a","line":183,"range":{"start_line":176,"start_character":0,"end_line":183,"end_character":5},"in_reply_to":"9f560f44_c9cf9327","updated":"2020-08-20 01:00:44.000000000","message":"Done","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"a36eb4964149a4f41331543ee305e0d0608c2bec","unresolved":false,"context_lines":[{"line_number":221,"context_line":"func showProgress(reader io.ReadCloser) {"},{"line_number":222,"context_line":"\treFindActions :\u003d regexp.MustCompile(reInstallActions)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"\tvar bar *pb.ProgressBar"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"\tscanner :\u003d bufio.NewScanner(reader)"},{"line_number":227,"context_line":"\tscanner.Split(bufio.ScanLines)"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_6c877563","line":224,"range":{"start_line":224,"start_character":1,"end_line":224,"end_character":24},"updated":"2020-08-12 13:50:49.000000000","message":"bar :\u003d pb.ProgressBarTemplate(progressBarTemplate)\n\n^ this will remove necessity of \u0027bar !\u003d nil\u0027 check","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"a36eb4964149a4f41331543ee305e0d0608c2bec","unresolved":false,"context_lines":[{"line_number":232,"context_line":"\t\tswitch {"},{"line_number":233,"context_line":"\t\tcase strings.Contains(curLine, \"Retrieving Packages\") ||"},{"line_number":234,"context_line":"\t\t\tstrings.Contains(curLine, \"newly installed\"):"},{"line_number":235,"context_line":"\t\t\tfinalizePb(bar, \"Completed\")"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"\t\t\tpkgCount :\u003d calculatePkgCount(scanner, curLine)"},{"line_number":238,"context_line":"\t\t\tif pkgCount \u003e 0 {"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_ccca01a0","line":235,"range":{"start_line":235,"start_character":3,"end_line":235,"end_character":31},"updated":"2020-08-12 13:50:49.000000000","message":"this is weird why we need this? are we expecting line \"Retrieving Packages\" multiple times?","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"91a3d774302b5e2c6b9b46555a292a91c3201d1b","unresolved":false,"context_lines":[{"line_number":232,"context_line":"\t\tswitch {"},{"line_number":233,"context_line":"\t\tcase strings.Contains(curLine, \"Retrieving Packages\") ||"},{"line_number":234,"context_line":"\t\t\tstrings.Contains(curLine, \"newly installed\"):"},{"line_number":235,"context_line":"\t\t\tfinalizePb(bar, \"Completed\")"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"\t\t\tpkgCount :\u003d calculatePkgCount(scanner, curLine)"},{"line_number":238,"context_line":"\t\t\tif pkgCount \u003e 0 {"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_04b3e54e","line":235,"range":{"start_line":235,"start_character":3,"end_line":235,"end_character":31},"in_reply_to":"9f560f44_ccca01a0","updated":"2020-08-20 01:00:44.000000000","message":"Yes we are. We need to finalize last progress bar in case if next phase of installation occurred.","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"a36eb4964149a4f41331543ee305e0d0608c2bec","unresolved":false,"context_lines":[{"line_number":236,"context_line":""},{"line_number":237,"context_line":"\t\t\tpkgCount :\u003d calculatePkgCount(scanner, curLine)"},{"line_number":238,"context_line":"\t\t\tif pkgCount \u003e 0 {"},{"line_number":239,"context_line":"\t\t\t\tbar \u003d pb.ProgressBarTemplate(progressBarTemplate).Start(pkgCount * multiplier)"},{"line_number":240,"context_line":"\t\t\t\tbar.SetWriter(log.Writer())"},{"line_number":241,"context_line":"\t\t\t\tsetPbPrefix(bar, \"Installing required packages\")"},{"line_number":242,"context_line":"\t\t\t}"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_cc7cc174","line":239,"range":{"start_line":239,"start_character":10,"end_line":239,"end_character":53},"updated":"2020-08-12 13:50:49.000000000","message":"can be moved to line 224","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"91a3d774302b5e2c6b9b46555a292a91c3201d1b","unresolved":false,"context_lines":[{"line_number":236,"context_line":""},{"line_number":237,"context_line":"\t\t\tpkgCount :\u003d calculatePkgCount(scanner, curLine)"},{"line_number":238,"context_line":"\t\t\tif pkgCount \u003e 0 {"},{"line_number":239,"context_line":"\t\t\t\tbar \u003d pb.ProgressBarTemplate(progressBarTemplate).Start(pkgCount * multiplier)"},{"line_number":240,"context_line":"\t\t\t\tbar.SetWriter(log.Writer())"},{"line_number":241,"context_line":"\t\t\t\tsetPbPrefix(bar, \"Installing required packages\")"},{"line_number":242,"context_line":"\t\t\t}"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_649aa1c5","line":239,"range":{"start_line":239,"start_character":10,"end_line":239,"end_character":53},"in_reply_to":"9f560f44_cc7cc174","updated":"2020-08-20 01:00:44.000000000","message":"No it can\u0027t, we initializing progress bar on demand and only if we have something to estimate, in this case if number of packages to install greater than 0. Number of progress bars also could vary from 0 to 3 during iso generation.","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"a36eb4964149a4f41331543ee305e0d0608c2bec","unresolved":false,"context_lines":[{"line_number":256,"context_line":"\t\t}"},{"line_number":257,"context_line":"\t}"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"\tfinalizePb(bar, \"An unexpected error occurred while log parsing\")"},{"line_number":260,"context_line":"}"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"func finalizePb(bar *pb.ProgressBar, msg string) {"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_8c35a9ab","line":259,"range":{"start_line":259,"start_character":1,"end_line":259,"end_character":66},"updated":"2020-08-12 13:50:49.000000000","message":"since there is no explicit return statement this seems always print error message which which is confusing from a user stand point","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"91a3d774302b5e2c6b9b46555a292a91c3201d1b","unresolved":false,"context_lines":[{"line_number":256,"context_line":"\t\t}"},{"line_number":257,"context_line":"\t}"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"\tfinalizePb(bar, \"An unexpected error occurred while log parsing\")"},{"line_number":260,"context_line":"}"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"func finalizePb(bar *pb.ProgressBar, msg string) {"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_84ced5b1","line":259,"range":{"start_line":259,"start_character":1,"end_line":259,"end_character":66},"in_reply_to":"9f560f44_8c35a9ab","updated":"2020-08-20 01:00:44.000000000","message":"Look at the code at line 263. The progress bar will be finalized with this message only if there is a progress bar which is not finished yet for some reason (i.e. installation of packages was started, but log or installation process was interrupted. If everything finished well - no action will be actually performed here.","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"a36eb4964149a4f41331543ee305e0d0608c2bec","unresolved":false,"context_lines":[{"line_number":289,"context_line":"\tmatches :\u003d reFindNumbers.FindAllString(curLine, -1)"},{"line_number":290,"context_line":"\tif matches \u003d\u003d nil {"},{"line_number":291,"context_line":"\t\t// There is no numbers is line about base packages, counting them manually to get estimates"},{"line_number":292,"context_line":"\t\tfmt.Print(\"Retrieving base packages \")"},{"line_number":293,"context_line":"\t\tfor scanner.Scan() {"},{"line_number":294,"context_line":"\t\t\tcurLine \u003d scanner.Text()"},{"line_number":295,"context_line":"\t\t\tif strings.Contains(curLine, \"Retrieving\") {"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_6f3127a3","line":292,"range":{"start_line":292,"start_character":0,"end_line":292,"end_character":40},"updated":"2020-08-12 13:50:49.000000000","message":"let\u0027s use airshipctl/log package","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"91a3d774302b5e2c6b9b46555a292a91c3201d1b","unresolved":false,"context_lines":[{"line_number":289,"context_line":"\tmatches :\u003d reFindNumbers.FindAllString(curLine, -1)"},{"line_number":290,"context_line":"\tif matches \u003d\u003d nil {"},{"line_number":291,"context_line":"\t\t// There is no numbers is line about base packages, counting them manually to get estimates"},{"line_number":292,"context_line":"\t\tfmt.Print(\"Retrieving base packages \")"},{"line_number":293,"context_line":"\t\tfor scanner.Scan() {"},{"line_number":294,"context_line":"\t\t\tcurLine \u003d scanner.Text()"},{"line_number":295,"context_line":"\t\t\tif strings.Contains(curLine, \"Retrieving\") {"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_845c15ee","line":292,"range":{"start_line":292,"start_character":0,"end_line":292,"end_character":40},"in_reply_to":"9f560f44_6f3127a3","updated":"2020-08-20 01:00:44.000000000","message":"We can\u0027t use log module here since it adds prefix and it can\u0027t provide functionality to print without newline in the end. In this particular case we need to print without prefix and newline, moreover progress bar could be be classified as logs.","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"a36eb4964149a4f41331543ee305e0d0608c2bec","unresolved":false,"context_lines":[{"line_number":294,"context_line":"\t\t\tcurLine \u003d scanner.Text()"},{"line_number":295,"context_line":"\t\t\tif strings.Contains(curLine, \"Retrieving\") {"},{"line_number":296,"context_line":"\t\t\t\tpkgCount++"},{"line_number":297,"context_line":"\t\t\t\tfmt.Print(\".\")"},{"line_number":298,"context_line":"\t\t\t}"},{"line_number":299,"context_line":"\t\t\tif strings.Contains(curLine, \"Chosen extractor\") {"},{"line_number":300,"context_line":"\t\t\t\tfmt.Println(\" Done\")"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_4f1a6317","line":297,"range":{"start_line":297,"start_character":4,"end_line":297,"end_character":18},"updated":"2020-08-12 13:50:49.000000000","message":"ditto","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"91a3d774302b5e2c6b9b46555a292a91c3201d1b","unresolved":false,"context_lines":[{"line_number":294,"context_line":"\t\t\tcurLine \u003d scanner.Text()"},{"line_number":295,"context_line":"\t\t\tif strings.Contains(curLine, \"Retrieving\") {"},{"line_number":296,"context_line":"\t\t\t\tpkgCount++"},{"line_number":297,"context_line":"\t\t\t\tfmt.Print(\".\")"},{"line_number":298,"context_line":"\t\t\t}"},{"line_number":299,"context_line":"\t\t\tif strings.Contains(curLine, \"Chosen extractor\") {"},{"line_number":300,"context_line":"\t\t\t\tfmt.Println(\" Done\")"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_246d4998","line":297,"range":{"start_line":297,"start_character":4,"end_line":297,"end_character":18},"in_reply_to":"9f560f44_4f1a6317","updated":"2020-08-20 01:00:44.000000000","message":"Read above comment ^","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"a36eb4964149a4f41331543ee305e0d0608c2bec","unresolved":false,"context_lines":[{"line_number":297,"context_line":"\t\t\t\tfmt.Print(\".\")"},{"line_number":298,"context_line":"\t\t\t}"},{"line_number":299,"context_line":"\t\t\tif strings.Contains(curLine, \"Chosen extractor\") {"},{"line_number":300,"context_line":"\t\t\t\tfmt.Println(\" Done\")"},{"line_number":301,"context_line":"\t\t\t\tbreak"},{"line_number":302,"context_line":"\t\t\t}"},{"line_number":303,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_afe05ffc","line":300,"range":{"start_line":300,"start_character":4,"end_line":300,"end_character":24},"updated":"2020-08-12 13:50:49.000000000","message":"ditto","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"91a3d774302b5e2c6b9b46555a292a91c3201d1b","unresolved":false,"context_lines":[{"line_number":297,"context_line":"\t\t\t\tfmt.Print(\".\")"},{"line_number":298,"context_line":"\t\t\t}"},{"line_number":299,"context_line":"\t\t\tif strings.Contains(curLine, \"Chosen extractor\") {"},{"line_number":300,"context_line":"\t\t\t\tfmt.Println(\" Done\")"},{"line_number":301,"context_line":"\t\t\t\tbreak"},{"line_number":302,"context_line":"\t\t\t}"},{"line_number":303,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_8411b507","line":300,"range":{"start_line":300,"start_character":4,"end_line":300,"end_character":24},"in_reply_to":"9f560f44_afe05ffc","updated":"2020-08-20 01:00:44.000000000","message":"Read the comment above ^","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"a36eb4964149a4f41331543ee305e0d0608c2bec","unresolved":false,"context_lines":[{"line_number":298,"context_line":"\t\t\t}"},{"line_number":299,"context_line":"\t\t\tif strings.Contains(curLine, \"Chosen extractor\") {"},{"line_number":300,"context_line":"\t\t\t\tfmt.Println(\" Done\")"},{"line_number":301,"context_line":"\t\t\t\tbreak"},{"line_number":302,"context_line":"\t\t\t}"},{"line_number":303,"context_line":"\t\t}"},{"line_number":304,"context_line":"\t} else if len(matches) \u003e\u003d 2 {"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_8f9f5b64","line":301,"range":{"start_line":301,"start_character":4,"end_line":301,"end_character":9},"updated":"2020-08-12 13:50:49.000000000","message":"Follow early return paradigm use \u0027return pkgCount\u0027 instead of \u0027break\u0027","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"91a3d774302b5e2c6b9b46555a292a91c3201d1b","unresolved":false,"context_lines":[{"line_number":298,"context_line":"\t\t\t}"},{"line_number":299,"context_line":"\t\t\tif strings.Contains(curLine, \"Chosen extractor\") {"},{"line_number":300,"context_line":"\t\t\t\tfmt.Println(\" Done\")"},{"line_number":301,"context_line":"\t\t\t\tbreak"},{"line_number":302,"context_line":"\t\t\t}"},{"line_number":303,"context_line":"\t\t}"},{"line_number":304,"context_line":"\t} else if len(matches) \u003e\u003d 2 {"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_877b60bc","line":301,"range":{"start_line":301,"start_character":4,"end_line":301,"end_character":9},"in_reply_to":"9f560f44_8f9f5b64","updated":"2020-08-20 01:00:44.000000000","message":"Done","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"a36eb4964149a4f41331543ee305e0d0608c2bec","unresolved":false,"context_lines":[{"line_number":301,"context_line":"\t\t\t\tbreak"},{"line_number":302,"context_line":"\t\t\t}"},{"line_number":303,"context_line":"\t\t}"},{"line_number":304,"context_line":"\t} else if len(matches) \u003e\u003d 2 {"},{"line_number":305,"context_line":"\t\tfor _, v :\u003d range matches[0:2] {"},{"line_number":306,"context_line":"\t\t\tj, err :\u003d strconv.Atoi(v)"},{"line_number":307,"context_line":"\t\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_cf82f300","line":304,"range":{"start_line":304,"start_character":1,"end_line":304,"end_character":30},"updated":"2020-08-12 13:50:49.000000000","message":"no need to use \u0027else if\u0027 here if break on line 301 is replaced with return\nif len(matches) \u003e\u003d 2 {...}","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"91a3d774302b5e2c6b9b46555a292a91c3201d1b","unresolved":false,"context_lines":[{"line_number":301,"context_line":"\t\t\t\tbreak"},{"line_number":302,"context_line":"\t\t\t}"},{"line_number":303,"context_line":"\t\t}"},{"line_number":304,"context_line":"\t} else if len(matches) \u003e\u003d 2 {"},{"line_number":305,"context_line":"\t\tfor _, v :\u003d range matches[0:2] {"},{"line_number":306,"context_line":"\t\t\tj, err :\u003d strconv.Atoi(v)"},{"line_number":307,"context_line":"\t\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_a780248d","line":304,"range":{"start_line":304,"start_character":1,"end_line":304,"end_character":30},"in_reply_to":"9f560f44_cf82f300","updated":"2020-08-20 01:00:44.000000000","message":"Done","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":32135,"name":"srinivasa muly","email":"msrinivasareddy@gmail.com","username":"muly"},"change_message_id":"ca073756eaae248eda30e2aa01e192dce2f6902c","unresolved":false,"context_lines":[{"line_number":102,"context_line":"\t\treturn err"},{"line_number":103,"context_line":"\t}"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"\terr \u003d generateBootstrapIso(docBundle, builder, doc, imageConfiguration, log.DebugEnabled(), s.Progress)"},{"line_number":106,"context_line":"\tif err !\u003d nil {"},{"line_number":107,"context_line":"\t\treturn err"},{"line_number":108,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":12,"id":"9f560f44_a0648522","line":105,"updated":"2020-09-04 19:24:22.000000000","message":"can you please update the unit tests to cover this change?","commit_id":"968abc66dab726e5fc51d5df2c61574d4010f75e"},{"author":{"_account_id":32135,"name":"srinivasa muly","email":"msrinivasareddy@gmail.com","username":"muly"},"change_message_id":"ca073756eaae248eda30e2aa01e192dce2f6902c","unresolved":false,"context_lines":[{"line_number":210,"context_line":"\t\t} else {"},{"line_number":211,"context_line":"\t\t\tswitch {"},{"line_number":212,"context_line":"\t\t\tcase progress:"},{"line_number":213,"context_line":"\t\t\t\tshowProgress(cLogs)"},{"line_number":214,"context_line":"\t\t\tcase debug:"},{"line_number":215,"context_line":"\t\t\t\tlog.Print(\"start reading container logs\")"},{"line_number":216,"context_line":"\t\t\t\t// either container log output or progress bar will be shown"}],"source_content_type":"text/x-go","patch_set":12,"id":"9f560f44_e03cbde2","line":213,"updated":"2020-09-04 19:24:22.000000000","message":"could you pls cover this line aswell?","commit_id":"968abc66dab726e5fc51d5df2c61574d4010f75e"},{"author":{"_account_id":32135,"name":"srinivasa muly","email":"msrinivasareddy@gmail.com","username":"muly"},"change_message_id":"5f5dede39fef0819bd518804746eb0dde84bac12","unresolved":false,"context_lines":[{"line_number":236,"context_line":"\treturn nil"},{"line_number":237,"context_line":"}"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"func showProgress(reader io.ReadCloser) {"},{"line_number":240,"context_line":"\treFindActions :\u003d regexp.MustCompile(reInstallActions)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"\tvar bar *pb.ProgressBar"}],"source_content_type":"text/x-go","patch_set":12,"id":"9f560f44_d606ac85","line":239,"updated":"2020-09-19 21:05:29.000000000","message":"can you please add unit tests for this function and the rest of the below functions?","commit_id":"968abc66dab726e5fc51d5df2c61574d4010f75e"}],"pkg/container/container.go":[{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"4429eba37c0bd74485b0f941ed19cc38a52e7123","unresolved":false,"context_lines":[{"line_number":24,"context_line":"// defines methods that must be implemented for CRE (e.g. docker, containerd or CRI-O)"},{"line_number":25,"context_line":"type Container interface {"},{"line_number":26,"context_line":"\tImagePull() error"},{"line_number":27,"context_line":"\tRunCommand([]string, io.Reader, []string, []string, bool, bool) error"},{"line_number":28,"context_line":"\tRunCommandOutput([]string, io.Reader, []string, []string) (io.ReadCloser, error)"},{"line_number":29,"context_line":"\tRmContainer() error"},{"line_number":30,"context_line":"\tGetID() string"}],"source_content_type":"text/x-go","patch_set":4,"id":"9f560f44_e901133a","line":27,"range":{"start_line":27,"start_character":59,"end_line":27,"end_character":63},"updated":"2020-08-05 14:51:44.000000000","message":"Container interface is designed to be a generic wrapper around container runtime client. Main purpose of this wrapper is to run generic command inside of a container. Progress is not supposed to be a part of a container interface. Progress logic should be on top if this interface and should not be compiled into it.","commit_id":"da3e9f22af37fbe08e4a1d44e8e7a83296118e7e"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"f8b65c27bab3126bed8713182ea0266db994322b","unresolved":false,"context_lines":[{"line_number":24,"context_line":"// defines methods that must be implemented for CRE (e.g. docker, containerd or CRI-O)"},{"line_number":25,"context_line":"type Container interface {"},{"line_number":26,"context_line":"\tImagePull() error"},{"line_number":27,"context_line":"\tRunCommand([]string, io.Reader, []string, []string, bool, bool) error"},{"line_number":28,"context_line":"\tRunCommandOutput([]string, io.Reader, []string, []string) (io.ReadCloser, error)"},{"line_number":29,"context_line":"\tRmContainer() error"},{"line_number":30,"context_line":"\tGetID() string"}],"source_content_type":"text/x-go","patch_set":4,"id":"9f560f44_5d7b5df3","line":27,"range":{"start_line":27,"start_character":59,"end_line":27,"end_character":63},"in_reply_to":"9f560f44_e901133a","updated":"2020-08-10 10:08:58.000000000","message":"Done","commit_id":"da3e9f22af37fbe08e4a1d44e8e7a83296118e7e"},{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"a36eb4964149a4f41331543ee305e0d0608c2bec","unresolved":false,"context_lines":[{"line_number":24,"context_line":"// defines methods that must be implemented for CRE (e.g. docker, containerd or CRI-O)"},{"line_number":25,"context_line":"type Container interface {"},{"line_number":26,"context_line":"\tImagePull() error"},{"line_number":27,"context_line":"\tRunCommand([]string, io.Reader, []string, []string, bool, bool) error"},{"line_number":28,"context_line":"\tRunCommandOutput([]string, io.Reader, []string, []string) (io.ReadCloser, error)"},{"line_number":29,"context_line":"\tRmContainer() error"},{"line_number":30,"context_line":"\tGetID() string"},{"line_number":31,"context_line":"\tWaitUntilFinished() error"},{"line_number":32,"context_line":"}"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"// NewContainer returns instance of Container interface implemented by particular driver"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_4fab8374","line":31,"range":{"start_line":27,"start_character":0,"end_line":31,"end_character":26},"updated":"2020-08-12 13:50:49.000000000","message":"I\u0027d propose a bit different interface extension:\n\n1. Remove RunCommandOutput since it\u0027s not used\n2. Remove debug and wait parameters from RunCommand\n3. Add WaitUntilFinished() or just Wait()\n4. Add GetLogs() (io.ReadeCloser,error)\n\nThis will simplify logic in pkg/bootstrap/isogen/command.go\nRunCommand(...debug)\nif progress { showProgress(c.GetLogs()) }\nelse if debug { //print logs to stdout}\nc.Wait()\n\nWhat do you think ?","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"91a3d774302b5e2c6b9b46555a292a91c3201d1b","unresolved":false,"context_lines":[{"line_number":24,"context_line":"// defines methods that must be implemented for CRE (e.g. docker, containerd or CRI-O)"},{"line_number":25,"context_line":"type Container interface {"},{"line_number":26,"context_line":"\tImagePull() error"},{"line_number":27,"context_line":"\tRunCommand([]string, io.Reader, []string, []string, bool, bool) error"},{"line_number":28,"context_line":"\tRunCommandOutput([]string, io.Reader, []string, []string) (io.ReadCloser, error)"},{"line_number":29,"context_line":"\tRmContainer() error"},{"line_number":30,"context_line":"\tGetID() string"},{"line_number":31,"context_line":"\tWaitUntilFinished() error"},{"line_number":32,"context_line":"}"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"// NewContainer returns instance of Container interface implemented by particular driver"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_6f99be77","line":31,"range":{"start_line":27,"start_character":0,"end_line":31,"end_character":26},"in_reply_to":"9f560f44_4fab8374","updated":"2020-08-20 01:00:44.000000000","message":"Done, but it was very complicated since we split run, get logs and wait actions, which were altogether previously inside of RunCommand method.","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"}],"pkg/container/container_docker.go":[{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"4429eba37c0bd74485b0f941ed19cc38a52e7123","unresolved":false,"context_lines":[{"line_number":348,"context_line":"\t)"},{"line_number":349,"context_line":"}"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"func (c *DockerContainer) processContainerLogs(progress bool) {"},{"line_number":352,"context_line":"\treader, err :\u003d c.dockerClient.ContainerLogs(*c.ctx, c.id, types.ContainerLogsOptions{ShowStdout: true, Follow: true})"},{"line_number":353,"context_line":"\tif err !\u003d nil {"},{"line_number":354,"context_line":"\t\tlog.Printf(\"Failed to read container logs %s,\\nNo container logs or showProgress will be shown\", err)"},{"line_number":355,"context_line":"\t} else {"},{"line_number":356,"context_line":"\t\tlog.Print(\"Start reading container logs\")"},{"line_number":357,"context_line":"\t\t// either container log output or progress bar will be shown"},{"line_number":358,"context_line":"\t\tif progress {"},{"line_number":359,"context_line":"\t\t\tshowProgress(reader)"},{"line_number":360,"context_line":"\t\t} else if _, err \u003d io.Copy(log.Writer(), reader); err !\u003d nil {"},{"line_number":361,"context_line":"\t\t\tlog.Debugf(\"Failed to write container logs to log output %s\", err)"},{"line_number":362,"context_line":"\t\t}"},{"line_number":363,"context_line":"\t\tlog.Print(\"Got EOF from container logs\")"},{"line_number":364,"context_line":"\t}"},{"line_number":365,"context_line":"}"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"func showProgress(reader io.ReadCloser) {"},{"line_number":368,"context_line":"\treFindActions :\u003d regexp.MustCompile(reInstallActions)"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"\tvar bar *pb.ProgressBar"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"\tscanner :\u003d bufio.NewScanner(reader)"},{"line_number":373,"context_line":"\tscanner.Split(bufio.ScanLines)"},{"line_number":374,"context_line":"\t// Reading container log line by line"},{"line_number":375,"context_line":"\tfor scanner.Scan() {"},{"line_number":376,"context_line":"\t\tcurLine :\u003d scanner.Text()"},{"line_number":377,"context_line":"\t\t// Trying to find entry points of package installation"},{"line_number":378,"context_line":"\t\tswitch {"},{"line_number":379,"context_line":"\t\tcase strings.Contains(curLine, \"Retrieving Packages\") ||"},{"line_number":380,"context_line":"\t\t\tstrings.Contains(curLine, \"newly installed\"):"},{"line_number":381,"context_line":"\t\t\tfinalizePb(bar, \"Completed\")"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"\t\t\tpkgCount :\u003d calculatePkgCount(scanner, curLine)"},{"line_number":384,"context_line":"\t\t\tif pkgCount \u003e 0 {"},{"line_number":385,"context_line":"\t\t\t\tbar \u003d pb.ProgressBarTemplate(progressBarTemplate).Start(pkgCount * multiplier)"},{"line_number":386,"context_line":"\t\t\t\tbar.SetWriter(log.Writer())"},{"line_number":387,"context_line":"\t\t\t\tsetPbPrefix(bar, \"Installing required packages\")"},{"line_number":388,"context_line":"\t\t\t}"},{"line_number":389,"context_line":"\t\tcase strings.Contains(curLine, \"Base system installed successfully\") ||"},{"line_number":390,"context_line":"\t\t\tstrings.Contains(curLine, \"mksquashfs\"):"},{"line_number":391,"context_line":"\t\t\tfinalizePb(bar, \"Completed\")"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"\t\tcase bar !\u003d nil \u0026\u0026 bar.IsStarted():"},{"line_number":394,"context_line":"\t\t\tif reFindActions.MatchString(curLine) {"},{"line_number":395,"context_line":"\t\t\t\tif bar.Current() \u003c bar.Total() {"},{"line_number":396,"context_line":"\t\t\t\t\tsetPbPrefix(bar, curLine)"},{"line_number":397,"context_line":"\t\t\t\t\tbar.Increment()"},{"line_number":398,"context_line":"\t\t\t\t}"},{"line_number":399,"context_line":"\t\t\t}"},{"line_number":400,"context_line":"\t\tcase strings.Contains(curLine, \"filesystem.squashfs\"):"},{"line_number":401,"context_line":"\t\t\tfmt.Println(curLine)"},{"line_number":402,"context_line":"\t\t}"},{"line_number":403,"context_line":"\t}"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"\tfinalizePb(bar, \"An unexpected error occurred while log parsing\")"},{"line_number":406,"context_line":"}"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"func finalizePb(bar *pb.ProgressBar, msg string) {"},{"line_number":409,"context_line":"\tif bar !\u003d nil \u0026\u0026 bar.IsStarted() {"},{"line_number":410,"context_line":"\t\tbar.SetCurrent(bar.Total())"},{"line_number":411,"context_line":"\t\tsetPbPrefix(bar, msg)"},{"line_number":412,"context_line":"\t\tbar.Finish()"},{"line_number":413,"context_line":"\t}"},{"line_number":414,"context_line":"}"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"func setPbPrefix(bar *pb.ProgressBar, msg string) {"},{"line_number":417,"context_line":"\tterminalWidth, err :\u003d termutil.TerminalWidth()"},{"line_number":418,"context_line":"\tif err !\u003d nil {"},{"line_number":419,"context_line":"\t\tterminalWidth \u003d defaultTerminalWidth"},{"line_number":420,"context_line":"\t}"},{"line_number":421,"context_line":"\thalfWidth :\u003d terminalWidth / 2"},{"line_number":422,"context_line":"\tif len(msg) \u003e halfWidth {"},{"line_number":423,"context_line":"\t\tmsg \u003d fmt.Sprintf(\"%v...\", msg[0:halfWidth-3])"},{"line_number":424,"context_line":"\t} else {"},{"line_number":425,"context_line":"\t\tmsg \u003d fmt.Sprintf(\"%-*v\", halfWidth, msg)"},{"line_number":426,"context_line":"\t}"},{"line_number":427,"context_line":"\tbar.Set(\"prefix\", msg)"},{"line_number":428,"context_line":"}"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"func calculatePkgCount(scanner *bufio.Scanner, curLine string) int {"},{"line_number":431,"context_line":"\treFindNumbers :\u003d regexp.MustCompile(\"[0-9]+\")"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"\t// Trying to count how many packages is going to be installed"},{"line_number":434,"context_line":"\tpkgCount :\u003d 0"},{"line_number":435,"context_line":"\tmatches :\u003d reFindNumbers.FindAllString(curLine, -1)"},{"line_number":436,"context_line":"\tif matches \u003d\u003d nil {"},{"line_number":437,"context_line":"\t\t// There is no numbers is line about base packages, counting them manually to get estimates"},{"line_number":438,"context_line":"\t\tfmt.Print(\"Retrieving base packages \")"},{"line_number":439,"context_line":"\t\tfor scanner.Scan() {"},{"line_number":440,"context_line":"\t\t\tcurLine \u003d scanner.Text()"},{"line_number":441,"context_line":"\t\t\tif strings.Contains(curLine, \"Retrieving\") {"},{"line_number":442,"context_line":"\t\t\t\tpkgCount++"},{"line_number":443,"context_line":"\t\t\t\tfmt.Print(\".\")"},{"line_number":444,"context_line":"\t\t\t}"},{"line_number":445,"context_line":"\t\t\tif strings.Contains(curLine, \"Chosen extractor\") {"},{"line_number":446,"context_line":"\t\t\t\tfmt.Println(\" Done\")"},{"line_number":447,"context_line":"\t\t\t\tbreak"},{"line_number":448,"context_line":"\t\t\t}"},{"line_number":449,"context_line":"\t\t}"},{"line_number":450,"context_line":"\t} else if len(matches) \u003e\u003d 2 {"},{"line_number":451,"context_line":"\t\tfor _, v :\u003d range matches[0:2] {"},{"line_number":452,"context_line":"\t\t\tj, err :\u003d strconv.Atoi(v)"},{"line_number":453,"context_line":"\t\t\tif err !\u003d nil {"},{"line_number":454,"context_line":"\t\t\t\tcontinue"},{"line_number":455,"context_line":"\t\t\t}"},{"line_number":456,"context_line":"\t\t\tpkgCount +\u003d j"},{"line_number":457,"context_line":"\t\t}"},{"line_number":458,"context_line":"\t}"},{"line_number":459,"context_line":"\treturn pkgCount"},{"line_number":460,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":4,"id":"9f560f44_29f82b47","line":460,"range":{"start_line":351,"start_character":0,"end_line":460,"end_character":1},"updated":"2020-08-05 14:51:44.000000000","message":"see comment in https://review.opendev.org/#/c/743078/4/pkg/container/container.go","commit_id":"da3e9f22af37fbe08e4a1d44e8e7a83296118e7e"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"f8b65c27bab3126bed8713182ea0266db994322b","unresolved":false,"context_lines":[{"line_number":348,"context_line":"\t)"},{"line_number":349,"context_line":"}"},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"func (c *DockerContainer) processContainerLogs(progress bool) {"},{"line_number":352,"context_line":"\treader, err :\u003d c.dockerClient.ContainerLogs(*c.ctx, c.id, types.ContainerLogsOptions{ShowStdout: true, Follow: true})"},{"line_number":353,"context_line":"\tif err !\u003d nil {"},{"line_number":354,"context_line":"\t\tlog.Printf(\"Failed to read container logs %s,\\nNo container logs or showProgress will be shown\", err)"},{"line_number":355,"context_line":"\t} else {"},{"line_number":356,"context_line":"\t\tlog.Print(\"Start reading container logs\")"},{"line_number":357,"context_line":"\t\t// either container log output or progress bar will be shown"},{"line_number":358,"context_line":"\t\tif progress {"},{"line_number":359,"context_line":"\t\t\tshowProgress(reader)"},{"line_number":360,"context_line":"\t\t} else if _, err \u003d io.Copy(log.Writer(), reader); err !\u003d nil {"},{"line_number":361,"context_line":"\t\t\tlog.Debugf(\"Failed to write container logs to log output %s\", err)"},{"line_number":362,"context_line":"\t\t}"},{"line_number":363,"context_line":"\t\tlog.Print(\"Got EOF from container logs\")"},{"line_number":364,"context_line":"\t}"},{"line_number":365,"context_line":"}"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"func showProgress(reader io.ReadCloser) {"},{"line_number":368,"context_line":"\treFindActions :\u003d regexp.MustCompile(reInstallActions)"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"\tvar bar *pb.ProgressBar"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"\tscanner :\u003d bufio.NewScanner(reader)"},{"line_number":373,"context_line":"\tscanner.Split(bufio.ScanLines)"},{"line_number":374,"context_line":"\t// Reading container log line by line"},{"line_number":375,"context_line":"\tfor scanner.Scan() {"},{"line_number":376,"context_line":"\t\tcurLine :\u003d scanner.Text()"},{"line_number":377,"context_line":"\t\t// Trying to find entry points of package installation"},{"line_number":378,"context_line":"\t\tswitch {"},{"line_number":379,"context_line":"\t\tcase strings.Contains(curLine, \"Retrieving Packages\") ||"},{"line_number":380,"context_line":"\t\t\tstrings.Contains(curLine, \"newly installed\"):"},{"line_number":381,"context_line":"\t\t\tfinalizePb(bar, \"Completed\")"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"\t\t\tpkgCount :\u003d calculatePkgCount(scanner, curLine)"},{"line_number":384,"context_line":"\t\t\tif pkgCount \u003e 0 {"},{"line_number":385,"context_line":"\t\t\t\tbar \u003d pb.ProgressBarTemplate(progressBarTemplate).Start(pkgCount * multiplier)"},{"line_number":386,"context_line":"\t\t\t\tbar.SetWriter(log.Writer())"},{"line_number":387,"context_line":"\t\t\t\tsetPbPrefix(bar, \"Installing required packages\")"},{"line_number":388,"context_line":"\t\t\t}"},{"line_number":389,"context_line":"\t\tcase strings.Contains(curLine, \"Base system installed successfully\") ||"},{"line_number":390,"context_line":"\t\t\tstrings.Contains(curLine, \"mksquashfs\"):"},{"line_number":391,"context_line":"\t\t\tfinalizePb(bar, \"Completed\")"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"\t\tcase bar !\u003d nil \u0026\u0026 bar.IsStarted():"},{"line_number":394,"context_line":"\t\t\tif reFindActions.MatchString(curLine) {"},{"line_number":395,"context_line":"\t\t\t\tif bar.Current() \u003c bar.Total() {"},{"line_number":396,"context_line":"\t\t\t\t\tsetPbPrefix(bar, curLine)"},{"line_number":397,"context_line":"\t\t\t\t\tbar.Increment()"},{"line_number":398,"context_line":"\t\t\t\t}"},{"line_number":399,"context_line":"\t\t\t}"},{"line_number":400,"context_line":"\t\tcase strings.Contains(curLine, \"filesystem.squashfs\"):"},{"line_number":401,"context_line":"\t\t\tfmt.Println(curLine)"},{"line_number":402,"context_line":"\t\t}"},{"line_number":403,"context_line":"\t}"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"\tfinalizePb(bar, \"An unexpected error occurred while log parsing\")"},{"line_number":406,"context_line":"}"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"func finalizePb(bar *pb.ProgressBar, msg string) {"},{"line_number":409,"context_line":"\tif bar !\u003d nil \u0026\u0026 bar.IsStarted() {"},{"line_number":410,"context_line":"\t\tbar.SetCurrent(bar.Total())"},{"line_number":411,"context_line":"\t\tsetPbPrefix(bar, msg)"},{"line_number":412,"context_line":"\t\tbar.Finish()"},{"line_number":413,"context_line":"\t}"},{"line_number":414,"context_line":"}"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"func setPbPrefix(bar *pb.ProgressBar, msg string) {"},{"line_number":417,"context_line":"\tterminalWidth, err :\u003d termutil.TerminalWidth()"},{"line_number":418,"context_line":"\tif err !\u003d nil {"},{"line_number":419,"context_line":"\t\tterminalWidth \u003d defaultTerminalWidth"},{"line_number":420,"context_line":"\t}"},{"line_number":421,"context_line":"\thalfWidth :\u003d terminalWidth / 2"},{"line_number":422,"context_line":"\tif len(msg) \u003e halfWidth {"},{"line_number":423,"context_line":"\t\tmsg \u003d fmt.Sprintf(\"%v...\", msg[0:halfWidth-3])"},{"line_number":424,"context_line":"\t} else {"},{"line_number":425,"context_line":"\t\tmsg \u003d fmt.Sprintf(\"%-*v\", halfWidth, msg)"},{"line_number":426,"context_line":"\t}"},{"line_number":427,"context_line":"\tbar.Set(\"prefix\", msg)"},{"line_number":428,"context_line":"}"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"func calculatePkgCount(scanner *bufio.Scanner, curLine string) int {"},{"line_number":431,"context_line":"\treFindNumbers :\u003d regexp.MustCompile(\"[0-9]+\")"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"\t// Trying to count how many packages is going to be installed"},{"line_number":434,"context_line":"\tpkgCount :\u003d 0"},{"line_number":435,"context_line":"\tmatches :\u003d reFindNumbers.FindAllString(curLine, -1)"},{"line_number":436,"context_line":"\tif matches \u003d\u003d nil {"},{"line_number":437,"context_line":"\t\t// There is no numbers is line about base packages, counting them manually to get estimates"},{"line_number":438,"context_line":"\t\tfmt.Print(\"Retrieving base packages \")"},{"line_number":439,"context_line":"\t\tfor scanner.Scan() {"},{"line_number":440,"context_line":"\t\t\tcurLine \u003d scanner.Text()"},{"line_number":441,"context_line":"\t\t\tif strings.Contains(curLine, \"Retrieving\") {"},{"line_number":442,"context_line":"\t\t\t\tpkgCount++"},{"line_number":443,"context_line":"\t\t\t\tfmt.Print(\".\")"},{"line_number":444,"context_line":"\t\t\t}"},{"line_number":445,"context_line":"\t\t\tif strings.Contains(curLine, \"Chosen extractor\") {"},{"line_number":446,"context_line":"\t\t\t\tfmt.Println(\" Done\")"},{"line_number":447,"context_line":"\t\t\t\tbreak"},{"line_number":448,"context_line":"\t\t\t}"},{"line_number":449,"context_line":"\t\t}"},{"line_number":450,"context_line":"\t} else if len(matches) \u003e\u003d 2 {"},{"line_number":451,"context_line":"\t\tfor _, v :\u003d range matches[0:2] {"},{"line_number":452,"context_line":"\t\t\tj, err :\u003d strconv.Atoi(v)"},{"line_number":453,"context_line":"\t\t\tif err !\u003d nil {"},{"line_number":454,"context_line":"\t\t\t\tcontinue"},{"line_number":455,"context_line":"\t\t\t}"},{"line_number":456,"context_line":"\t\t\tpkgCount +\u003d j"},{"line_number":457,"context_line":"\t\t}"},{"line_number":458,"context_line":"\t}"},{"line_number":459,"context_line":"\treturn pkgCount"},{"line_number":460,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":4,"id":"9f560f44_3d7e69e3","line":460,"range":{"start_line":351,"start_character":0,"end_line":460,"end_character":1},"in_reply_to":"9f560f44_29f82b47","updated":"2020-08-10 10:08:58.000000000","message":"Done","commit_id":"da3e9f22af37fbe08e4a1d44e8e7a83296118e7e"},{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"a36eb4964149a4f41331543ee305e0d0608c2bec","unresolved":false,"context_lines":[{"line_number":280,"context_line":"\t\treturn err"},{"line_number":281,"context_line":"\t}"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"\tlog.Print(\"Docker container is started, ISO generation is in progress.\\n\" +"},{"line_number":284,"context_line":"\t\t\"The whole process could take up to several minutes, please wait...\")"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"\tif debug {"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_12b70c3c","line":283,"range":{"start_line":283,"start_character":12,"end_line":283,"end_character":13},"updated":"2020-08-12 13:50:49.000000000","message":"lowercase plsease","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"91a3d774302b5e2c6b9b46555a292a91c3201d1b","unresolved":false,"context_lines":[{"line_number":280,"context_line":"\t\treturn err"},{"line_number":281,"context_line":"\t}"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"\tlog.Print(\"Docker container is started, ISO generation is in progress.\\n\" +"},{"line_number":284,"context_line":"\t\t\"The whole process could take up to several minutes, please wait...\")"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"\tif debug {"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_273b74eb","line":283,"range":{"start_line":283,"start_character":12,"end_line":283,"end_character":13},"in_reply_to":"9f560f44_12b70c3c","updated":"2020-08-20 01:00:44.000000000","message":"Done","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"a36eb4964149a4f41331543ee305e0d0608c2bec","unresolved":false,"context_lines":[{"line_number":326,"context_line":"func (c *DockerContainer) processContainerLogs() {"},{"line_number":327,"context_line":"\treader, err :\u003d c.dockerClient.ContainerLogs(*c.ctx, c.id, types.ContainerLogsOptions{ShowStdout: true, Follow: true})"},{"line_number":328,"context_line":"\tif err !\u003d nil {"},{"line_number":329,"context_line":"\t\tlog.Printf(\"Failed to read container logs %s\", err)"},{"line_number":330,"context_line":"\t} else {"},{"line_number":331,"context_line":"\t\tlog.Print(\"Start reading container logs\")"},{"line_number":332,"context_line":"\t\t// either container log output or progress bar will be shown"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_5286a467","line":329,"range":{"start_line":329,"start_character":14,"end_line":329,"end_character":15},"updated":"2020-08-12 13:50:49.000000000","message":"ditto","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"91a3d774302b5e2c6b9b46555a292a91c3201d1b","unresolved":false,"context_lines":[{"line_number":326,"context_line":"func (c *DockerContainer) processContainerLogs() {"},{"line_number":327,"context_line":"\treader, err :\u003d c.dockerClient.ContainerLogs(*c.ctx, c.id, types.ContainerLogsOptions{ShowStdout: true, Follow: true})"},{"line_number":328,"context_line":"\tif err !\u003d nil {"},{"line_number":329,"context_line":"\t\tlog.Printf(\"Failed to read container logs %s\", err)"},{"line_number":330,"context_line":"\t} else {"},{"line_number":331,"context_line":"\t\tlog.Print(\"Start reading container logs\")"},{"line_number":332,"context_line":"\t\t// either container log output or progress bar will be shown"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_073e30d9","line":329,"range":{"start_line":329,"start_character":14,"end_line":329,"end_character":15},"in_reply_to":"9f560f44_5286a467","updated":"2020-08-20 01:00:44.000000000","message":"Done","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"a36eb4964149a4f41331543ee305e0d0608c2bec","unresolved":false,"context_lines":[{"line_number":328,"context_line":"\tif err !\u003d nil {"},{"line_number":329,"context_line":"\t\tlog.Printf(\"Failed to read container logs %s\", err)"},{"line_number":330,"context_line":"\t} else {"},{"line_number":331,"context_line":"\t\tlog.Print(\"Start reading container logs\")"},{"line_number":332,"context_line":"\t\t// either container log output or progress bar will be shown"},{"line_number":333,"context_line":"\t\tif _, err \u003d io.Copy(log.Writer(), reader); err !\u003d nil {"},{"line_number":334,"context_line":"\t\t\tlog.Debugf(\"Failed to write container logs to log output %s\", err)"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_927cbc72","line":331,"range":{"start_line":331,"start_character":13,"end_line":331,"end_character":14},"updated":"2020-08-12 13:50:49.000000000","message":"ditto","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"91a3d774302b5e2c6b9b46555a292a91c3201d1b","unresolved":false,"context_lines":[{"line_number":328,"context_line":"\tif err !\u003d nil {"},{"line_number":329,"context_line":"\t\tlog.Printf(\"Failed to read container logs %s\", err)"},{"line_number":330,"context_line":"\t} else {"},{"line_number":331,"context_line":"\t\tlog.Print(\"Start reading container logs\")"},{"line_number":332,"context_line":"\t\t// either container log output or progress bar will be shown"},{"line_number":333,"context_line":"\t\tif _, err \u003d io.Copy(log.Writer(), reader); err !\u003d nil {"},{"line_number":334,"context_line":"\t\t\tlog.Debugf(\"Failed to write container logs to log output %s\", err)"}],"source_content_type":"text/x-go","patch_set":5,"id":"9f560f44_67244cc7","line":331,"range":{"start_line":331,"start_character":13,"end_line":331,"end_character":14},"in_reply_to":"9f560f44_927cbc72","updated":"2020-08-20 01:00:44.000000000","message":"Done","commit_id":"c6fb2b02501a17a266fbc3e00d667620afe391ca"},{"author":{"_account_id":21991,"name":"Kostyantyn Kalynovskyi","email":"kkalinovskiy@gmail.com","username":"kkalynovskyi"},"change_message_id":"82588a8d822642c90bcd775374361ec51119b2ce","unresolved":false,"context_lines":[{"line_number":278,"context_line":"\t\treturn err"},{"line_number":279,"context_line":"\t}"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"\tlog.Print(\"docker container is started, ISO generation is in progress.\\n\" +"},{"line_number":282,"context_line":"\t\t\"The whole process could take up to several minutes, please wait...\")"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"\treturn nil"}],"source_content_type":"text/x-go","patch_set":6,"id":"9f560f44_8ae400ae","line":281,"range":{"start_line":281,"start_character":40,"end_line":281,"end_character":70},"updated":"2020-08-20 02:58:56.000000000","message":"i think this is a left over from previous previous patch sets,  since not every RunCommand will generate ISO","commit_id":"6f1be52d5ee145b33a93e197dba7632dd2925a26"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"3558f00cf218219e627f44539d8a0938f67d94ce","unresolved":false,"context_lines":[{"line_number":278,"context_line":"\t\treturn err"},{"line_number":279,"context_line":"\t}"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"\tlog.Print(\"docker container is started, ISO generation is in progress.\\n\" +"},{"line_number":282,"context_line":"\t\t\"The whole process could take up to several minutes, please wait...\")"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"\treturn nil"}],"source_content_type":"text/x-go","patch_set":6,"id":"9f560f44_26cd2385","line":281,"range":{"start_line":281,"start_character":40,"end_line":281,"end_character":70},"in_reply_to":"9f560f44_8ae400ae","updated":"2020-08-20 17:24:26.000000000","message":"Done","commit_id":"6f1be52d5ee145b33a93e197dba7632dd2925a26"},{"author":{"_account_id":7185,"name":"Dmitry Ukov","email":"dukov@mirantis.com","username":"dukov"},"change_message_id":"0d3dbd2d6ecba44a578b021290920892eabca398","unresolved":false,"context_lines":[{"line_number":278,"context_line":"\t\treturn err"},{"line_number":279,"context_line":"\t}"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"\tlog.Print(\"docker container is started, ISO generation is in progress.\\n\" +"},{"line_number":282,"context_line":"\t\t\"The whole process could take up to several minutes, please wait...\")"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"\treturn nil"}],"source_content_type":"text/x-go","patch_set":6,"id":"9f560f44_f0b48684","line":281,"range":{"start_line":281,"start_character":40,"end_line":281,"end_character":70},"in_reply_to":"9f560f44_8ae400ae","updated":"2020-08-20 12:24:11.000000000","message":"looks like... we should not be specific to what is happening inside the container","commit_id":"6f1be52d5ee145b33a93e197dba7632dd2925a26"},{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"3558f00cf218219e627f44539d8a0938f67d94ce","unresolved":false,"context_lines":[{"line_number":278,"context_line":"\t\treturn err"},{"line_number":279,"context_line":"\t}"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"\tlog.Print(\"docker container is started, ISO generation is in progress.\\n\" +"},{"line_number":282,"context_line":"\t\t\"The whole process could take up to several minutes, please wait...\")"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"\treturn nil"}],"source_content_type":"text/x-go","patch_set":6,"id":"9f560f44_86c6af67","line":281,"range":{"start_line":281,"start_character":40,"end_line":281,"end_character":70},"in_reply_to":"9f560f44_f0b48684","updated":"2020-08-20 17:24:26.000000000","message":"Done","commit_id":"6f1be52d5ee145b33a93e197dba7632dd2925a26"}]}
