)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"1560809e2573ee09c541ddb8c84cf09cbcc61f6b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"e9bf66a6_f7c5aee3","updated":"2021-10-28 15:53:52.000000000","message":"The tool is good but have some comments on the wording used.","commit_id":"573b945852c5463a51ab4901927d7b32188b2d5f"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"38f0ee9babbb68b44f045591b9ece169880118c1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"7d7fed0e_10b26eb6","updated":"2022-01-15 20:18:28.000000000","message":"seems --show-detail throw error while fetching the zuul details","commit_id":"da4fe65aaf9ae0cdf41f36966b0645fb41b15c3c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ddf2b8c2f31d835142addfce83a2ef0d3d209b99","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"80746de6_17c7bdcd","updated":"2022-04-21 19:21:03.000000000","message":"I haven\u0027t reviewed the actual code like I normally would, but I did run it and I\u0027m getting legit-looking statistics, so I assume this is okay.","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":11292,"name":"Arne Wiebalck","email":"Arne.Wiebalck@cern.ch","username":"wiebalck"},"change_message_id":"e1c0c48eeb852b51ff09a8208beb9ebde8a30e05","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3334145c_8c17b9e3","updated":"2022-04-21 20:14:41.000000000","message":"Thanks Rico and Ghanshyam! Character set question and suggestion inline.","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3a96855fa00902bb2044788cf9fbff187752a861","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"73d20860_e7c80ca3","updated":"2022-05-13 16:56:09.000000000","message":"overall, lgtm just 1 comment where it throw error.","commit_id":"ef160a10b90df849f82319830e90b04598791b98"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"0ac7164acc7b24c3c084d9b226660dc2cb797653","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"1c0b8947_671326cd","updated":"2022-05-26 17:59:36.000000000","message":"Typo in one of the help strings noted inline, but nothing that couldn\u0027t be handled in a followup.  Did a quick fetch of some stats with various option combinations, and everything seems to work.  Should be a useful tool to have.","commit_id":"201610b82b0d762763096fbb99668cb5358d0945"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0c3d6a8402d44a7906a85e386bcd3d677b44e914","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"c66c3f56_724a4fc9","updated":"2022-05-26 17:50:30.000000000","message":"thanks, lgtm","commit_id":"201610b82b0d762763096fbb99668cb5358d0945"}],"tools/project_health_check.py":[{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"529b3c40c5f15f2576e907c13000e516b1aa7956","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                      \u0027pipeline\u003dgate\u0027,"},{"line_number":49,"context_line":"                      \u0027limit\u003d\u0027+str(fetch_size),"},{"line_number":50,"context_line":"                      \u0027branch\u003d\u0027 + branch]"},{"line_number":51,"context_line":"        return self.query(api\u003d\u0027api/builds\u0027, conditions\u003dconditions)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def fetch_all_repos_success_rate(self, builds):"},{"line_number":54,"context_line":"        success_rates \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"7e75172b_2e2e4da8","line":51,"updated":"2021-09-20 15:46:17.000000000","message":"It might make more sense to base this on buildsets instead of builds. Do you really want to know the failure rate on a per job basis, or just on a per change basis? The latter would not be influenced by the number of jobs a project runs, so might be a better representation of overall challenges merging changes in the gate.","commit_id":"e4158b04a90197e5def2f3ecabb9e28976546b3b"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"f47249d9489b2efe2870b19498295aa6ab672c2f","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                      \u0027pipeline\u003dgate\u0027,"},{"line_number":49,"context_line":"                      \u0027limit\u003d\u0027+str(fetch_size),"},{"line_number":50,"context_line":"                      \u0027branch\u003d\u0027 + branch]"},{"line_number":51,"context_line":"        return self.query(api\u003d\u0027api/builds\u0027, conditions\u003dconditions)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def fetch_all_repos_success_rate(self, builds):"},{"line_number":54,"context_line":"        success_rates \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"28122723_7caf0077","line":51,"in_reply_to":"7e75172b_2e2e4da8","updated":"2021-09-21 06:03:30.000000000","message":"set buildsets as default now, and use --show-detail to get job rate detail from projects","commit_id":"e4158b04a90197e5def2f3ecabb9e28976546b3b"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"529b3c40c5f15f2576e907c13000e516b1aa7956","unresolved":false,"context_lines":[{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    gerrit \u003d Gerrit("},{"line_number":230,"context_line":"        base_url\u003d\u0027https://review.opendev.org/\u0027, query_separator\u003d\u0027+\u0027)"},{"line_number":231,"context_line":"    zuul \u003d Zuul(base_url\u003d\u0027https://zuul.openstack.org/\u0027)"},{"line_number":232,"context_line":"    branchs \u003d args.branchs.split(\u0027,\u0027)"},{"line_number":233,"context_line":"    for branch in branchs:"},{"line_number":234,"context_line":"        if not (branch.startswith(\u0027master\u0027) or branch.startswith(\u0027stable/\u0027)):"}],"source_content_type":"text/x-python","patch_set":1,"id":"c5d59e2d_3de9e9f3","line":231,"updated":"2021-09-20 15:46:17.000000000","message":"Better to use the tenant aware https://zuul.opendev.org/ interface rather than the legacy white-label openstack.org site.","commit_id":"e4158b04a90197e5def2f3ecabb9e28976546b3b"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"f47249d9489b2efe2870b19498295aa6ab672c2f","unresolved":false,"context_lines":[{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    gerrit \u003d Gerrit("},{"line_number":230,"context_line":"        base_url\u003d\u0027https://review.opendev.org/\u0027, query_separator\u003d\u0027+\u0027)"},{"line_number":231,"context_line":"    zuul \u003d Zuul(base_url\u003d\u0027https://zuul.openstack.org/\u0027)"},{"line_number":232,"context_line":"    branchs \u003d args.branchs.split(\u0027,\u0027)"},{"line_number":233,"context_line":"    for branch in branchs:"},{"line_number":234,"context_line":"        if not (branch.startswith(\u0027master\u0027) or branch.startswith(\u0027stable/\u0027)):"}],"source_content_type":"text/x-python","patch_set":1,"id":"0b27e427_a18e117c","line":231,"in_reply_to":"c5d59e2d_3de9e9f3","updated":"2021-09-21 06:03:30.000000000","message":"done","commit_id":"e4158b04a90197e5def2f3ecabb9e28976546b3b"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"529b3c40c5f15f2576e907c13000e516b1aa7956","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    gerrit \u003d Gerrit("},{"line_number":230,"context_line":"        base_url\u003d\u0027https://review.opendev.org/\u0027, query_separator\u003d\u0027+\u0027)"},{"line_number":231,"context_line":"    zuul \u003d Zuul(base_url\u003d\u0027https://zuul.openstack.org/\u0027)"},{"line_number":232,"context_line":"    branchs \u003d args.branchs.split(\u0027,\u0027)"},{"line_number":233,"context_line":"    for branch in branchs:"},{"line_number":234,"context_line":"        if not (branch.startswith(\u0027master\u0027) or branch.startswith(\u0027stable/\u0027)):"},{"line_number":235,"context_line":"            print(\u0027Invalid branch %s\u0027 % branch)"}],"source_content_type":"text/x-python","patch_set":1,"id":"534c8653_0080ca31","line":232,"updated":"2021-09-20 15:46:17.000000000","message":"Consider making the variable name \"branches\" as that\u0027s the plural of \"branch\" in English, \"branchs\" isn\u0027t really a word.","commit_id":"e4158b04a90197e5def2f3ecabb9e28976546b3b"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"f47249d9489b2efe2870b19498295aa6ab672c2f","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    gerrit \u003d Gerrit("},{"line_number":230,"context_line":"        base_url\u003d\u0027https://review.opendev.org/\u0027, query_separator\u003d\u0027+\u0027)"},{"line_number":231,"context_line":"    zuul \u003d Zuul(base_url\u003d\u0027https://zuul.openstack.org/\u0027)"},{"line_number":232,"context_line":"    branchs \u003d args.branchs.split(\u0027,\u0027)"},{"line_number":233,"context_line":"    for branch in branchs:"},{"line_number":234,"context_line":"        if not (branch.startswith(\u0027master\u0027) or branch.startswith(\u0027stable/\u0027)):"},{"line_number":235,"context_line":"            print(\u0027Invalid branch %s\u0027 % branch)"}],"source_content_type":"text/x-python","patch_set":1,"id":"f778ccf9_58d8b6dd","line":232,"in_reply_to":"534c8653_0080ca31","updated":"2021-09-21 06:03:30.000000000","message":"done","commit_id":"e4158b04a90197e5def2f3ecabb9e28976546b3b"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"2c6dd65a76660230823f1791e954a493e173d1de","unresolved":true,"context_lines":[{"line_number":279,"context_line":"    BUILDSET_FETCH_SIZE \u003d 500"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    project_scope \u003d args.projects.split(\u0027,\u0027) if ("},{"line_number":282,"context_line":"        args.projects is not None) else list(projects.keys())[:1]"},{"line_number":283,"context_line":"    count_days \u003d args.days"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def get_repos(project):"}],"source_content_type":"text/x-python","patch_set":3,"id":"c93a7b60_910b06fc","line":282,"range":{"start_line":282,"start_character":61,"end_line":282,"end_character":65},"updated":"2021-09-22 17:12:44.000000000","message":"As you mentioned in commit msg, you want to show data for all the projects by default instead of just first one.\n\nelse list(projects.keys())","commit_id":"96986260df180a0ccdd3fe17228ae2d8f3af09b8"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"868bed2250c41d8c40ea82eae2eb7b4c2713e3f0","unresolved":true,"context_lines":[{"line_number":279,"context_line":"    BUILDSET_FETCH_SIZE \u003d 500"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    project_scope \u003d args.projects.split(\u0027,\u0027) if ("},{"line_number":282,"context_line":"        args.projects is not None) else list(projects.keys())[:1]"},{"line_number":283,"context_line":"    count_days \u003d args.days"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def get_repos(project):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfe60974_0931997c","line":282,"range":{"start_line":282,"start_character":61,"end_line":282,"end_character":65},"in_reply_to":"c93a7b60_910b06fc","updated":"2021-09-23 01:24:34.000000000","message":"Thanks good catch","commit_id":"96986260df180a0ccdd3fe17228ae2d8f3af09b8"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"2c6dd65a76660230823f1791e954a493e173d1de","unresolved":true,"context_lines":[{"line_number":300,"context_line":"            print(\u0027Invalid branch %s\u0027 % branch)"},{"line_number":301,"context_line":"            return"},{"line_number":302,"context_line":"    for project in project_scope:"},{"line_number":303,"context_line":"        print(\u0027*\u0027*50)"},{"line_number":304,"context_line":"        print(\"Start Project %s analysis...\" % project)"},{"line_number":305,"context_line":"        repos \u003d get_repos(project)"},{"line_number":306,"context_line":"        print(\" Includes repositories: %s\" % repos)"}],"source_content_type":"text/x-python","patch_set":3,"id":"f79ff29c_4026c931","line":303,"range":{"start_line":303,"start_character":20,"end_line":303,"end_character":21},"updated":"2021-09-22 17:12:44.000000000","message":"this stuck if invalid project is passed, let\u0027s check for any valid project before quering gerrit.\n\n     if not project in projects:\n         print(\u0027Invalid project %s\u0027% project)\n         return","commit_id":"96986260df180a0ccdd3fe17228ae2d8f3af09b8"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"2c6dd65a76660230823f1791e954a493e173d1de","unresolved":true,"context_lines":[{"line_number":320,"context_line":"                    len(merged_patchs)/len(total_valid_patchs))*100//1"},{"line_number":321,"context_line":"                owners_rates \u003d gerrit.count_owners("},{"line_number":322,"context_line":"                    patchs\u003dtotal_valid_patchs, limit\u003d10)"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"                print(\" *\", \"There are %s ready for\" % len(total_valid_patchs),"},{"line_number":325,"context_line":"                      \"review patches generated within %s days\" % count_days)"},{"line_number":326,"context_line":"                print(\" *\", \"There are\","}],"source_content_type":"text/x-python","patch_set":3,"id":"5272d6bf_77bdcaff","line":323,"range":{"start_line":323,"start_character":0,"end_line":323,"end_character":0},"updated":"2021-09-22 17:12:44.000000000","message":"we can add if project is \u0027Healthy\u0027 or \u0027Not Healthy\u0027 as per the threshold you mentioned in etherpad- https://etherpad.opendev.org/p/health_check\n\nbut ok to do in followup also.","commit_id":"96986260df180a0ccdd3fe17228ae2d8f3af09b8"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"e9201f31a09bf2b7f1895b62b61013e9cdaf720e","unresolved":true,"context_lines":[{"line_number":320,"context_line":"                    len(merged_patchs)/len(total_valid_patchs))*100//1"},{"line_number":321,"context_line":"                owners_rates \u003d gerrit.count_owners("},{"line_number":322,"context_line":"                    patchs\u003dtotal_valid_patchs, limit\u003d10)"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"                print(\" *\", \"There are %s ready for\" % len(total_valid_patchs),"},{"line_number":325,"context_line":"                      \"review patches generated within %s days\" % count_days)"},{"line_number":326,"context_line":"                print(\" *\", \"There are\","}],"source_content_type":"text/x-python","patch_set":3,"id":"5cc54a14_dadf723a","line":323,"range":{"start_line":323,"start_character":0,"end_line":323,"end_character":0},"in_reply_to":"5272d6bf_77bdcaff","updated":"2021-09-22 17:29:54.000000000","message":"Let\u0027s do this as a follow-up where we can discuss the correct threshold and wording of communicating \u0027not healthy\u0027 separately.","commit_id":"96986260df180a0ccdd3fe17228ae2d8f3af09b8"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"868bed2250c41d8c40ea82eae2eb7b4c2713e3f0","unresolved":true,"context_lines":[{"line_number":320,"context_line":"                    len(merged_patchs)/len(total_valid_patchs))*100//1"},{"line_number":321,"context_line":"                owners_rates \u003d gerrit.count_owners("},{"line_number":322,"context_line":"                    patchs\u003dtotal_valid_patchs, limit\u003d10)"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"                print(\" *\", \"There are %s ready for\" % len(total_valid_patchs),"},{"line_number":325,"context_line":"                      \"review patches generated within %s days\" % count_days)"},{"line_number":326,"context_line":"                print(\" *\", \"There are\","}],"source_content_type":"text/x-python","patch_set":3,"id":"1b6732d9_551299a4","line":323,"range":{"start_line":323,"start_character":0,"end_line":323,"end_character":0},"in_reply_to":"5cc54a14_dadf723a","updated":"2021-09-23 01:24:34.000000000","message":"I tend to agree too on we can discuss about what we gonna do with the heatlthy terms before we put it here","commit_id":"96986260df180a0ccdd3fe17228ae2d8f3af09b8"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"2c6dd65a76660230823f1791e954a493e173d1de","unresolved":true,"context_lines":[{"line_number":335,"context_line":"                print(\" * \", \"Here\u0027s top %s owner for patchs\" % TOP_X_OWNER,"},{"line_number":336,"context_line":"                      \"generated within\","},{"line_number":337,"context_line":"                      \"%s days (Name/Account_ID: Percentage):\" % count_days)"},{"line_number":338,"context_line":"                for owner, rate in owners_rates.items():"},{"line_number":339,"context_line":"                    print(\u0027    - \u0027, owner, \u0027: \u0027, rate)"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"            if not args.skip_zuul:"}],"source_content_type":"text/x-python","patch_set":3,"id":"cfb9c3ad_5c4da5ae","line":338,"updated":"2021-09-22 17:12:44.000000000","message":"+1, just for follow up we can add companies info also to know how diverse the contribution/review is.","commit_id":"96986260df180a0ccdd3fe17228ae2d8f3af09b8"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"868bed2250c41d8c40ea82eae2eb7b4c2713e3f0","unresolved":true,"context_lines":[{"line_number":335,"context_line":"                print(\" * \", \"Here\u0027s top %s owner for patchs\" % TOP_X_OWNER,"},{"line_number":336,"context_line":"                      \"generated within\","},{"line_number":337,"context_line":"                      \"%s days (Name/Account_ID: Percentage):\" % count_days)"},{"line_number":338,"context_line":"                for owner, rate in owners_rates.items():"},{"line_number":339,"context_line":"                    print(\u0027    - \u0027, owner, \u0027: \u0027, rate)"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"            if not args.skip_zuul:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9053d0f6_f2132e9d","line":338,"in_reply_to":"cfb9c3ad_5c4da5ae","updated":"2021-09-23 01:24:34.000000000","message":"Yep, it\u0027s not always valid in profile, but we can put some more information here as followup patch","commit_id":"96986260df180a0ccdd3fe17228ae2d8f3af09b8"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"b7909940896098f7b252ceeb582e7d9cc9b78937","unresolved":true,"context_lines":[{"line_number":331,"context_line":"                      \"patches generated within %s days\" % count_days)"},{"line_number":332,"context_line":"                print(\" *\", \"There are %s merged\" % len(merged_patchs),"},{"line_number":333,"context_line":"                      \"patches generated within %s days\" % count_days)"},{"line_number":334,"context_line":"                print(\" *\", \"Unreview patch rate for patches generated within\","},{"line_number":335,"context_line":"                      \"%s days is %s\" % (count_days, unreview_rate), \u0027%\u0027)"},{"line_number":336,"context_line":"                print(\" *\", \"Merged patch rate for patches generated within\","},{"line_number":337,"context_line":"                      \"%s days is %s\" % (count_days, merged_rate), \u0027%\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a88fe67_9883a102","line":334,"range":{"start_line":334,"start_character":29,"end_line":334,"end_character":37},"updated":"2021-09-23 14:25:33.000000000","message":"s/Unreview/Unreviewed","commit_id":"bea4a903ccc99beef195bfd90b5e09b0257e2dcc"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"b7909940896098f7b252ceeb582e7d9cc9b78937","unresolved":true,"context_lines":[{"line_number":335,"context_line":"                      \"%s days is %s\" % (count_days, unreview_rate), \u0027%\u0027)"},{"line_number":336,"context_line":"                print(\" *\", \"Merged patch rate for patches generated within\","},{"line_number":337,"context_line":"                      \"%s days is %s\" % (count_days, merged_rate), \u0027%\u0027)"},{"line_number":338,"context_line":"                print(\" * \", \"Here\u0027s top %s owner for patchs\" % TOP_X_OWNER,"},{"line_number":339,"context_line":"                      \"generated within\","},{"line_number":340,"context_line":"                      \"%s days (Name/Account_ID: Percentage):\" % count_days)"},{"line_number":341,"context_line":"                for owner, rate in owners_rates.items():"}],"source_content_type":"text/x-python","patch_set":4,"id":"c01f5ff3_a8c48f00","line":338,"range":{"start_line":338,"start_character":54,"end_line":338,"end_character":60},"updated":"2021-09-23 14:25:33.000000000","message":"s/patchs/patches","commit_id":"bea4a903ccc99beef195bfd90b5e09b0257e2dcc"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"1560809e2573ee09c541ddb8c84cf09cbcc61f6b","unresolved":true,"context_lines":[{"line_number":236,"context_line":"    )"},{"line_number":237,"context_line":"    parser.add_argument("},{"line_number":238,"context_line":"        \u0027-p\u0027, \u0027--projects\u0027,"},{"line_number":239,"context_line":"        help\u003d\u0027projects to analysis. Seperate with comma\u0027,"},{"line_number":240,"context_line":"    )"},{"line_number":241,"context_line":"    parser.add_argument("},{"line_number":242,"context_line":"        \u0027-d\u0027, \u0027--days\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9d263d85_e5251a4d","line":239,"range":{"start_line":239,"start_character":26,"end_line":239,"end_character":34},"updated":"2021-10-28 15:53:52.000000000","message":"analyze","commit_id":"573b945852c5463a51ab4901927d7b32188b2d5f"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"1560809e2573ee09c541ddb8c84cf09cbcc61f6b","unresolved":true,"context_lines":[{"line_number":246,"context_line":"    parser.add_argument("},{"line_number":247,"context_line":"        \u0027-b\u0027, \u0027--branch\u0027,"},{"line_number":248,"context_line":"        default\u003d\u0027master\u0027,"},{"line_number":249,"context_line":"        help\u003d\u0027All branch to analysis (%(default)s)\u0027,"},{"line_number":250,"context_line":"    )"},{"line_number":251,"context_line":"    parser.add_argument("},{"line_number":252,"context_line":"        \u0027-z\u0027, \u0027--skip-zuul\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9c1b0027_88c279c5","line":249,"range":{"start_line":249,"start_character":14,"end_line":249,"end_character":36},"updated":"2021-10-28 15:53:52.000000000","message":"Branch to analyze on projects","commit_id":"573b945852c5463a51ab4901927d7b32188b2d5f"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"1560809e2573ee09c541ddb8c84cf09cbcc61f6b","unresolved":true,"context_lines":[{"line_number":251,"context_line":"    parser.add_argument("},{"line_number":252,"context_line":"        \u0027-z\u0027, \u0027--skip-zuul\u0027,"},{"line_number":253,"context_line":"        action\u003d\u0027store_true\u0027,"},{"line_number":254,"context_line":"        help\u003d\u0027Show Zuul analysis (%(default)s)\u0027,"},{"line_number":255,"context_line":"    )"},{"line_number":256,"context_line":"    parser.add_argument("},{"line_number":257,"context_line":"        \u0027-g\u0027, \u0027--skip-gerrit\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ac940f64_c9ab6f5c","line":254,"range":{"start_line":254,"start_character":14,"end_line":254,"end_character":18},"updated":"2021-10-28 15:53:52.000000000","message":"Skip","commit_id":"573b945852c5463a51ab4901927d7b32188b2d5f"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"1560809e2573ee09c541ddb8c84cf09cbcc61f6b","unresolved":true,"context_lines":[{"line_number":256,"context_line":"    parser.add_argument("},{"line_number":257,"context_line":"        \u0027-g\u0027, \u0027--skip-gerrit\u0027,"},{"line_number":258,"context_line":"        action\u003d\u0027store_true\u0027,"},{"line_number":259,"context_line":"        help\u003d\u0027Show Gerrit analysis (%(default)s)\u0027,"},{"line_number":260,"context_line":"    )"},{"line_number":261,"context_line":"    parser.add_argument("},{"line_number":262,"context_line":"        \u0027--show-detail\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"eab29d83_480f964d","line":259,"range":{"start_line":259,"start_character":14,"end_line":259,"end_character":18},"updated":"2021-10-28 15:53:52.000000000","message":"Skip","commit_id":"573b945852c5463a51ab4901927d7b32188b2d5f"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"1560809e2573ee09c541ddb8c84cf09cbcc61f6b","unresolved":true,"context_lines":[{"line_number":261,"context_line":"    parser.add_argument("},{"line_number":262,"context_line":"        \u0027--show-detail\u0027,"},{"line_number":263,"context_line":"        action\u003d\u0027store_true\u0027,"},{"line_number":264,"context_line":"        help\u003d\u0027Show Zuul job builds details analysis (%(default)s)\u0027,"},{"line_number":265,"context_line":"    )"},{"line_number":266,"context_line":"    parser.add_argument("},{"line_number":267,"context_line":"        \u0027-v\u0027, \u0027--verbose\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"c4ed3357_22e25d08","line":264,"range":{"start_line":264,"start_character":35,"end_line":264,"end_character":42},"updated":"2021-10-28 15:53:52.000000000","message":"detailed","commit_id":"573b945852c5463a51ab4901927d7b32188b2d5f"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"4bdb65644509ce0f35c8bbe24d2a54b0a5d613b6","unresolved":true,"context_lines":[{"line_number":347,"context_line":"                print(\" Validate Zuul...\")"},{"line_number":348,"context_line":"                if args.show_detail:"},{"line_number":349,"context_line":"                    print(\" Set builds fetch size to %s\" % BUILD_FETCH_SIZE)"},{"line_number":350,"context_line":"                    gate_builds \u003d zuul.get_project_builds("},{"line_number":351,"context_line":"                        repos, fetch_size\u003dBUILD_FETCH_SIZE, branch\u003dbranch)"},{"line_number":352,"context_line":"                    jobs_success_rates \u003d zuul.fetch_all_repos_success_rate("},{"line_number":353,"context_line":"                        gate_builds)"},{"line_number":354,"context_line":"                    for repo in jobs_success_rates:"}],"source_content_type":"text/x-python","patch_set":5,"id":"b27d7961_49d546a9","line":351,"range":{"start_line":350,"start_character":1,"end_line":351,"end_character":74},"updated":"2021-10-28 16:13:31.000000000","message":"I am getting the error here:\n\nTraceback (most recent call last):\n  File \"./tools/project_health_check.py\", line 378, in \u003cmodule\u003e\n    main()\n  File \"./tools/project_health_check.py\", line 350, in main\n    gate_builds \u003d zuul.get_project_builds(\n  File \"./tools/project_health_check.py\", line 57, in get_project_builds\n    results[repo] \u003d self.get_project_builds_for_repo(\n  File \"./tools/project_health_check.py\", line 70, in get_project_builds_for_repo\n    return self.query(api\u003d\u0027api/tenant/%s/builds\u0027, conditions\u003dconditions)\n  File \"./tools/project_health_check.py\", line 34, in query\n    result \u003d request.urlopen(url)\n  File \"/usr/lib/python3.8/urllib/request.py\", line 222, in urlopen\n    return opener.open(url, data, timeout)\n  File \"/usr/lib/python3.8/urllib/request.py\", line 531, in open\n    response \u003d meth(req, response)\n  File \"/usr/lib/python3.8/urllib/request.py\", line 640, in http_response\n    response \u003d self.parent.error(\n  File \"/usr/lib/python3.8/urllib/request.py\", line 569, in error\n    return self._call_chain(*args)\n  File \"/usr/lib/python3.8/urllib/request.py\", line 502, in _call_chain\n    result \u003d func(*args)\n  File \"/usr/lib/python3.8/urllib/request.py\", line 649, in http_error_default\n    raise HTTPError(req.full_url, code, msg, hdrs, fp)\nurllib.error.HTTPError: HTTP Error 400: Bad Request","commit_id":"573b945852c5463a51ab4901927d7b32188b2d5f"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"38f0ee9babbb68b44f045591b9ece169880118c1","unresolved":true,"context_lines":[{"line_number":347,"context_line":"                print(\" Validate Zuul...\")"},{"line_number":348,"context_line":"                if args.show_detail:"},{"line_number":349,"context_line":"                    print(\" Set builds fetch size to %s\" % BUILD_FETCH_SIZE)"},{"line_number":350,"context_line":"                    gate_builds \u003d zuul.get_project_builds("},{"line_number":351,"context_line":"                        repos, fetch_size\u003dBUILD_FETCH_SIZE, branch\u003dbranch)"},{"line_number":352,"context_line":"                    jobs_success_rates \u003d zuul.fetch_all_repos_success_rate("},{"line_number":353,"context_line":"                        gate_builds)"},{"line_number":354,"context_line":"                    for repo in jobs_success_rates:"}],"source_content_type":"text/x-python","patch_set":5,"id":"8c2e7ec3_7bc15980","line":351,"range":{"start_line":350,"start_character":1,"end_line":351,"end_character":74},"in_reply_to":"592bb2c3_92eb4dbf","updated":"2022-01-15 20:18:28.000000000","message":"it gives error with --show-details arg\n\n./tools/project_health_check.py -p heat --show-detail\n\n\n\n**************************************************\nStart Project heat analysis...\n Includes repositories: [\u0027openstack/heat\u0027, \u0027openstack/heat-agents\u0027, \u0027openstack/heat-cfnclient\u0027, \u0027openstack/heat-cfntools\u0027, \u0027openstack/heat-dashboard\u0027, \u0027openstack/heat-specs\u0027, \u0027openstack/heat-tempest-plugin\u0027, \u0027openstack/heat-templates\u0027, \u0027openstack/heat-translator\u0027, \u0027openstack/python-heatclient\u0027, \u0027openstack/tosca-parser\u0027]\n Start analysis branch master...\n Validating Gerrit...\nTraceback (most recent call last):\n  File \"/usr/lib/python3.8/urllib/request.py\", line 1354, in do_open\n    h.request(req.get_method(), req.selector, req.data, headers,\n  File \"/usr/lib/python3.8/http/client.py\", line 1256, in request\n    self._send_request(method, url, body, headers, encode_chunked)\n  File \"/usr/lib/python3.8/http/client.py\", line 1302, in _send_request\n    self.endheaders(body, encode_chunked\u003dencode_chunked)\n  File \"/usr/lib/python3.8/http/client.py\", line 1251, in endheaders\n    self._send_output(message_body, encode_chunked\u003dencode_chunked)\n  File \"/usr/lib/python3.8/http/client.py\", line 1011, in _send_output\n    self.send(msg)\n  File \"/usr/lib/python3.8/http/client.py\", line 951, in send\n    self.connect()\n  File \"/usr/lib/python3.8/http/client.py\", line 1418, in connect\n    super().connect()\n  File \"/usr/lib/python3.8/http/client.py\", line 922, in connect\n    self.sock \u003d self._create_connection(\n  File \"/usr/lib/python3.8/socket.py\", line 808, in create_connection\n    raise err\n  File \"/usr/lib/python3.8/socket.py\", line 796, in create_connection\n    sock.connect(sa)\nOSError: [Errno 101] Network is unreachable\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"./tools/project_health_check.py\", line 378, in \u003cmodule\u003e\n    main()\n  File \"./tools/project_health_check.py\", line 314, in main\n    not_reviewed_patches \u003d gerrit.get_total_not_review(\n  File \"./tools/project_health_check.py\", line 188, in get_total_not_review\n    return self.query(api\u003d\u0027changes/\u0027, conditions\u003dconditions)\n  File \"./tools/project_health_check.py\", line 141, in query\n    result \u003d request.urlopen(url)\n  File \"/usr/lib/python3.8/urllib/request.py\", line 222, in urlopen\n    return opener.open(url, data, timeout)\n  File \"/usr/lib/python3.8/urllib/request.py\", line 525, in open\n    response \u003d self._open(req, data)\n  File \"/usr/lib/python3.8/urllib/request.py\", line 542, in _open\n    result \u003d self._call_chain(self.handle_open, protocol, protocol +\n  File \"/usr/lib/python3.8/urllib/request.py\", line 502, in _call_chain\n    result \u003d func(*args)\n  File \"/usr/lib/python3.8/urllib/request.py\", line 1397, in https_open\n    return self.do_open(http.client.HTTPSConnection, req,\n  File \"/usr/lib/python3.8/urllib/request.py\", line 1357, in do_open\n    raise URLError(err)\nurllib.error.URLError: \u003curlopen error [Errno 101] Network is unreachable\u003e","commit_id":"573b945852c5463a51ab4901927d7b32188b2d5f"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"7c95768134496ad4ccc8d8cc8eab56d2d11f6fad","unresolved":true,"context_lines":[{"line_number":347,"context_line":"                print(\" Validate Zuul...\")"},{"line_number":348,"context_line":"                if args.show_detail:"},{"line_number":349,"context_line":"                    print(\" Set builds fetch size to %s\" % BUILD_FETCH_SIZE)"},{"line_number":350,"context_line":"                    gate_builds \u003d zuul.get_project_builds("},{"line_number":351,"context_line":"                        repos, fetch_size\u003dBUILD_FETCH_SIZE, branch\u003dbranch)"},{"line_number":352,"context_line":"                    jobs_success_rates \u003d zuul.fetch_all_repos_success_rate("},{"line_number":353,"context_line":"                        gate_builds)"},{"line_number":354,"context_line":"                    for repo in jobs_success_rates:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7de0d0f1_288119b3","line":351,"range":{"start_line":350,"start_character":1,"end_line":351,"end_character":74},"in_reply_to":"8c2e7ec3_7bc15980","updated":"2022-04-19 18:47:41.000000000","message":"let\u0027s remove this detail option as i am not sure we will use it or not. rest other info this tool collect are useful to check the stats.","commit_id":"573b945852c5463a51ab4901927d7b32188b2d5f"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"7f6c5c45b35166ccd9001f6c291b8050bdc3d86b","unresolved":true,"context_lines":[{"line_number":347,"context_line":"                print(\" Validate Zuul...\")"},{"line_number":348,"context_line":"                if args.show_detail:"},{"line_number":349,"context_line":"                    print(\" Set builds fetch size to %s\" % BUILD_FETCH_SIZE)"},{"line_number":350,"context_line":"                    gate_builds \u003d zuul.get_project_builds("},{"line_number":351,"context_line":"                        repos, fetch_size\u003dBUILD_FETCH_SIZE, branch\u003dbranch)"},{"line_number":352,"context_line":"                    jobs_success_rates \u003d zuul.fetch_all_repos_success_rate("},{"line_number":353,"context_line":"                        gate_builds)"},{"line_number":354,"context_line":"                    for repo in jobs_success_rates:"}],"source_content_type":"text/x-python","patch_set":5,"id":"592bb2c3_92eb4dbf","line":351,"range":{"start_line":350,"start_character":1,"end_line":351,"end_character":74},"in_reply_to":"b27d7961_49d546a9","updated":"2021-12-02 15:23:48.000000000","message":"What\u0027s your command? \n`./tools/project_health_check.py` or `./tools/project_health_check.py -p heat -b master` works fine for me","commit_id":"573b945852c5463a51ab4901927d7b32188b2d5f"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"1560809e2573ee09c541ddb8c84cf09cbcc61f6b","unresolved":true,"context_lines":[{"line_number":359,"context_line":"                                      rate, \u0027success rate\u0027)"},{"line_number":360,"context_line":"                        else:"},{"line_number":361,"context_line":"                            print(\" * Repo:\","},{"line_number":362,"context_line":"                                  \"%s gate jobs not recently builded\" % repo)"},{"line_number":363,"context_line":"                else:"},{"line_number":364,"context_line":"                    print(\" Set buildsets fetch size to\","},{"line_number":365,"context_line":"                          \"%s\" % BUILDSET_FETCH_SIZE)"}],"source_content_type":"text/x-python","patch_set":5,"id":"eae5e8cf_6ba2f977","line":362,"range":{"start_line":362,"start_character":61,"end_line":362,"end_character":69},"updated":"2021-10-28 15:53:52.000000000","message":"built","commit_id":"573b945852c5463a51ab4901927d7b32188b2d5f"}],"tools/project_stats_check.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5717e0b7e4bffa4585c427b52ae677aa0eab947a","unresolved":true,"context_lines":[{"line_number":23,"context_line":"        if base_url.endswith(\u0027/\u0027):"},{"line_number":24,"context_line":"            self.base_url \u003d base_url"},{"line_number":25,"context_line":"        else:"},{"line_number":26,"context_line":"            self.base_url \u003d \u0027/\u0027 + base_url"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def query(self, api, conditions\u003dNone):"},{"line_number":29,"context_line":"        url \u003d self.base_url + api"}],"source_content_type":"text/x-python","patch_set":8,"id":"8e50fe70_0673179e","line":26,"updated":"2022-04-25 10:51:11.000000000","message":"shouldn\u0027t it be in opposite way, like:\n\n    self.base_url \u003d base_url + \"/\"\n\n?","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"53ac2321487edb7e0f4f8cf8beb2997f0092d4a3","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        if base_url.endswith(\u0027/\u0027):"},{"line_number":24,"context_line":"            self.base_url \u003d base_url"},{"line_number":25,"context_line":"        else:"},{"line_number":26,"context_line":"            self.base_url \u003d \u0027/\u0027 + base_url"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def query(self, api, conditions\u003dNone):"},{"line_number":29,"context_line":"        url \u003d self.base_url + api"}],"source_content_type":"text/x-python","patch_set":8,"id":"ce7b3fd1_69c92cd9","line":26,"in_reply_to":"8e50fe70_0673179e","updated":"2022-05-06 08:30:55.000000000","message":"Done","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5717e0b7e4bffa4585c427b52ae677aa0eab947a","unresolved":true,"context_lines":[{"line_number":55,"context_line":"        not_success \u003d {}"},{"line_number":56,"context_line":"        for buildset in buildsets:"},{"line_number":57,"context_line":"            if type(buildset) !\u003d dict:"},{"line_number":58,"context_line":"                continue"},{"line_number":59,"context_line":"            project \u003d buildset[\u0027project\u0027]"},{"line_number":60,"context_line":"            result \u003d buildset[\u0027result\u0027]"},{"line_number":61,"context_line":"            if result \u003d\u003d \u0027SUCCESS\u0027:"}],"source_content_type":"text/x-python","patch_set":8,"id":"68af1213_11ed6882","line":58,"updated":"2022-04-25 10:51:11.000000000","message":"nit: maybe if self.verbose \u003d\u003d True You could log something here?","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"53ac2321487edb7e0f4f8cf8beb2997f0092d4a3","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        not_success \u003d {}"},{"line_number":56,"context_line":"        for buildset in buildsets:"},{"line_number":57,"context_line":"            if type(buildset) !\u003d dict:"},{"line_number":58,"context_line":"                continue"},{"line_number":59,"context_line":"            project \u003d buildset[\u0027project\u0027]"},{"line_number":60,"context_line":"            result \u003d buildset[\u0027result\u0027]"},{"line_number":61,"context_line":"            if result \u003d\u003d \u0027SUCCESS\u0027:"}],"source_content_type":"text/x-python","patch_set":8,"id":"caa1d895_2d34447b","line":58,"in_reply_to":"68af1213_11ed6882","updated":"2022-05-06 08:30:55.000000000","message":"Done","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5717e0b7e4bffa4585c427b52ae677aa0eab947a","unresolved":true,"context_lines":[{"line_number":115,"context_line":"        # NOT+label:Workflo\u003c\u003d-1+label:Verified\u003e\u003d1+NOT+age:{within}day"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        conditions \u003d [\u0027(status:open\u0027, \u0027OR\u0027, \u0027status:merged)\u0027,"},{"line_number":118,"context_line":"                      \u0027NOT\u0027, \u0027label:Workflo\u003c\u003d-1\u0027,"},{"line_number":119,"context_line":"                      \u0027label:Verified\u003e\u003d1\u0027,"},{"line_number":120,"context_line":"                      \u0027branch:\u0027 + branch,"},{"line_number":121,"context_line":"                      \u0027NOT\u0027, \u0027age:\u0027 + str(within) + \u0027day\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"e0fd09a5_38ff23f9","line":118,"range":{"start_line":118,"start_character":36,"end_line":118,"end_character":43},"updated":"2022-04-25 10:51:11.000000000","message":"shouldn\u0027t be \"Workflow\" ?","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"53ac2321487edb7e0f4f8cf8beb2997f0092d4a3","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        # NOT+label:Workflo\u003c\u003d-1+label:Verified\u003e\u003d1+NOT+age:{within}day"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        conditions \u003d [\u0027(status:open\u0027, \u0027OR\u0027, \u0027status:merged)\u0027,"},{"line_number":118,"context_line":"                      \u0027NOT\u0027, \u0027label:Workflo\u003c\u003d-1\u0027,"},{"line_number":119,"context_line":"                      \u0027label:Verified\u003e\u003d1\u0027,"},{"line_number":120,"context_line":"                      \u0027branch:\u0027 + branch,"},{"line_number":121,"context_line":"                      \u0027NOT\u0027, \u0027age:\u0027 + str(within) + \u0027day\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"c7794076_498e6490","line":118,"range":{"start_line":118,"start_character":36,"end_line":118,"end_character":43},"in_reply_to":"e0fd09a5_38ff23f9","updated":"2022-05-06 08:30:55.000000000","message":"Done","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5717e0b7e4bffa4585c427b52ae677aa0eab947a","unresolved":true,"context_lines":[{"line_number":127,"context_line":"        # NOT+label:Workflow\u003c\u003d-1+label:Verified\u003e\u003d1+NOT+age:{within}day"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        conditions \u003d [\u0027status:open\u0027,"},{"line_number":130,"context_line":"                      \u0027NOT\u0027, \u0027label:Workflo\u003c\u003d-1\u0027,"},{"line_number":131,"context_line":"                      \u0027label:Verified\u003e\u003d1\u0027,"},{"line_number":132,"context_line":"                      \u0027label:Core-Review\u003d0\u0027,"},{"line_number":133,"context_line":"                      \u0027branch:\u0027 + branch,"}],"source_content_type":"text/x-python","patch_set":8,"id":"6659878d_48425beb","line":130,"range":{"start_line":130,"start_character":36,"end_line":130,"end_character":43},"updated":"2022-04-25 10:51:11.000000000","message":"same here","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"53ac2321487edb7e0f4f8cf8beb2997f0092d4a3","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        # NOT+label:Workflow\u003c\u003d-1+label:Verified\u003e\u003d1+NOT+age:{within}day"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        conditions \u003d [\u0027status:open\u0027,"},{"line_number":130,"context_line":"                      \u0027NOT\u0027, \u0027label:Workflo\u003c\u003d-1\u0027,"},{"line_number":131,"context_line":"                      \u0027label:Verified\u003e\u003d1\u0027,"},{"line_number":132,"context_line":"                      \u0027label:Core-Review\u003d0\u0027,"},{"line_number":133,"context_line":"                      \u0027branch:\u0027 + branch,"}],"source_content_type":"text/x-python","patch_set":8,"id":"49fd7ef9_da9165ba","line":130,"range":{"start_line":130,"start_character":36,"end_line":130,"end_character":43},"in_reply_to":"6659878d_48425beb","updated":"2022-05-06 08:30:55.000000000","message":"Done","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5717e0b7e4bffa4585c427b52ae677aa0eab947a","unresolved":true,"context_lines":[{"line_number":129,"context_line":"        conditions \u003d [\u0027status:open\u0027,"},{"line_number":130,"context_line":"                      \u0027NOT\u0027, \u0027label:Workflo\u003c\u003d-1\u0027,"},{"line_number":131,"context_line":"                      \u0027label:Verified\u003e\u003d1\u0027,"},{"line_number":132,"context_line":"                      \u0027label:Core-Review\u003d0\u0027,"},{"line_number":133,"context_line":"                      \u0027branch:\u0027 + branch,"},{"line_number":134,"context_line":"                      \u0027NOT\u0027, \u0027age:\u0027 + str(within) + \u0027day\u0027]"},{"line_number":135,"context_line":"        conditions +\u003d self.get_project_query_list(repos)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9233d265_29a5b744","line":132,"range":{"start_line":132,"start_character":29,"end_line":132,"end_character":33},"updated":"2022-04-25 10:51:11.000000000","message":"\"Code\" probably","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"53ac2321487edb7e0f4f8cf8beb2997f0092d4a3","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        conditions \u003d [\u0027status:open\u0027,"},{"line_number":130,"context_line":"                      \u0027NOT\u0027, \u0027label:Workflo\u003c\u003d-1\u0027,"},{"line_number":131,"context_line":"                      \u0027label:Verified\u003e\u003d1\u0027,"},{"line_number":132,"context_line":"                      \u0027label:Core-Review\u003d0\u0027,"},{"line_number":133,"context_line":"                      \u0027branch:\u0027 + branch,"},{"line_number":134,"context_line":"                      \u0027NOT\u0027, \u0027age:\u0027 + str(within) + \u0027day\u0027]"},{"line_number":135,"context_line":"        conditions +\u003d self.get_project_query_list(repos)"}],"source_content_type":"text/x-python","patch_set":8,"id":"e480dfa3_7e331433","line":132,"range":{"start_line":132,"start_character":29,"end_line":132,"end_character":33},"in_reply_to":"9233d265_29a5b744","updated":"2022-05-06 08:30:55.000000000","message":"Done","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5717e0b7e4bffa4585c427b52ae677aa0eab947a","unresolved":true,"context_lines":[{"line_number":240,"context_line":"    for branch in all_branch:"},{"line_number":241,"context_line":"        if not (branch.startswith(\u0027master\u0027) or branch.startswith(\u0027stable/\u0027)):"},{"line_number":242,"context_line":"            print(\u0027Invalid branch %s\u0027 % branch)"},{"line_number":243,"context_line":"            return"},{"line_number":244,"context_line":"    for project in project_scope:"},{"line_number":245,"context_line":"        print(\u0027*\u0027 * 50)"},{"line_number":246,"context_line":"        if project not in projects:"}],"source_content_type":"text/x-python","patch_set":8,"id":"8532af5d_69476d9f","line":243,"updated":"2022-04-25 10:51:11.000000000","message":"shouldn\u0027t You exit with some error code in such case?","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"53ac2321487edb7e0f4f8cf8beb2997f0092d4a3","unresolved":false,"context_lines":[{"line_number":240,"context_line":"    for branch in all_branch:"},{"line_number":241,"context_line":"        if not (branch.startswith(\u0027master\u0027) or branch.startswith(\u0027stable/\u0027)):"},{"line_number":242,"context_line":"            print(\u0027Invalid branch %s\u0027 % branch)"},{"line_number":243,"context_line":"            return"},{"line_number":244,"context_line":"    for project in project_scope:"},{"line_number":245,"context_line":"        print(\u0027*\u0027 * 50)"},{"line_number":246,"context_line":"        if project not in projects:"}],"source_content_type":"text/x-python","patch_set":8,"id":"ede010c8_39e41e7f","line":243,"in_reply_to":"8532af5d_69476d9f","updated":"2022-05-06 08:30:55.000000000","message":"Done","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":11292,"name":"Arne Wiebalck","email":"Arne.Wiebalck@cern.ch","username":"wiebalck"},"change_message_id":"e1c0c48eeb852b51ff09a8208beb9ebde8a30e05","unresolved":true,"context_lines":[{"line_number":283,"context_line":"                      \"generated within\","},{"line_number":284,"context_line":"                      \"%s days (Name/Account_ID: Percentage):\" % count_days)"},{"line_number":285,"context_line":"                for owner, rate in owners_rates.items():"},{"line_number":286,"context_line":"                    print(\u0027    - \u0027, owner, \u0027: \u0027, rate)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"            if not args.skip_zuul:"},{"line_number":289,"context_line":"                print(\" Validate Zuul...\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"e3affec1_31e7b3f1","line":286,"range":{"start_line":286,"start_character":20,"end_line":286,"end_character":54},"updated":"2022-04-21 20:14:41.000000000","message":"We may want to handle special characters in names (owners): the tool fails for instance on ironic with a UnicodeEncodeError (on the latin-1 character set since we have two contributors from nordic countries with special characters in their names) ... or will the character set be explicitly set when the tool is run automatically (as it may come from my env)?\n\n--\u003e\n$ ./tools/project_stats_check.py -p ironic\n...\nFile \"./tools/project_stats_check.py\", line 304, in \u003cmodule\u003e\n    main()\nFile \"./tools/project_stats_check.py\", line 286, in main\n    print(\u0027    - \u0027, owner, \u0027: \u0027, rate)\nUnicodeEncodeError: \u0027latin-1\u0027 codec can\u0027t encode character \u0027\\u0113\u0027 in position 10: ordinal not in range(256)\n\u003c--\n\nWe could use utf-8 (and ignore or replace unknown characters) as a start.","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"53ac2321487edb7e0f4f8cf8beb2997f0092d4a3","unresolved":true,"context_lines":[{"line_number":283,"context_line":"                      \"generated within\","},{"line_number":284,"context_line":"                      \"%s days (Name/Account_ID: Percentage):\" % count_days)"},{"line_number":285,"context_line":"                for owner, rate in owners_rates.items():"},{"line_number":286,"context_line":"                    print(\u0027    - \u0027, owner, \u0027: \u0027, rate)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"            if not args.skip_zuul:"},{"line_number":289,"context_line":"                print(\" Validate Zuul...\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"e2de11cf_b4cb9b6a","line":286,"range":{"start_line":286,"start_character":20,"end_line":286,"end_character":54},"in_reply_to":"e3affec1_31e7b3f1","updated":"2022-05-06 08:30:55.000000000","message":"Sorry but I can\u0027t reproduce that issue locally. Are You sure it isn\u0027t some error in Your terminal? Here\u0027s my result:\n\n *  Here\u0027s top 10 owner for patches generated within 180 days (Name/Account_ID: Percentage):\n    -  Dmitry Tantsur :  29.51%\n    -  Riccardo Pittau :  13.80%\n    -  Julia Kreger :  7.64%\n    -  Steve Baker :  5.73%\n    -  OpenStack Release Bot :  5.31%\n    -  Ghanshyam :  5.31%\n    -  Arne Wiebalck :  4.25%\n    -  Harald Jensås :  3.40%\n    -  Iury Gregory Melo Ferreira :  3.18%\n    -  Aija Jauntēva :  2.76%\n    -  Roman Popelka :  2.12%\n    -  Mark Goddard :  1.70%\n    -  Jacob Anders :  1.27%\n    -  Takashi Kajinami :  1.27%\n    -  Ruby Loo :  1.06%\n    -  Ameya Raut :  0.85%\n    -  Radosław Piliszek :  0.85%\n    -  Ebbex :  0.64%\n    -  ZhouHao :  0.64%\n    -  Vanou Ishii :  0.64%\n    -  Bernd Mueller :  0.64%\n    -  Vishal Manchanda :  0.42%\n    -  Mahnoor Asghar :  0.42%\n    -  Tadeas Kot :  0.42%\n    -  chandan kumar :  0.42%\n    -  Pierre Riteau :  0.42%\n    -  Tzu-Mainn Chen :  0.42%\n    -  Manuel Schönlaub :  0.42%\n    -  mitya-eremeev-2 :  0.21%\n    -  Peter Rudenko :  0.21%\n    -  James Denton :  0.21%\n    -  Leo McGann :  0.21%\n    -  Danni Shi :  0.21%\n    -  Kafilat Adeleke :  0.21%\n    -  Jeffrey Zhang :  0.21%\n    -  Felix Huettner :  0.21%\n    -  Thomas Goirand :  0.21%\n    -  goldyfruit :  0.21%\n    -  LiZekun :  0.21%\n    -  Maksim Malchuk :  0.21%\n    -  Bob Fournier :  0.21%\n    -  Samuel Zuk :  0.21%\n    -  TaylorTao :  0.21%\n    -  Michal Nasiadka :  0.21%\n    -  wangjing :  0.21%\n    -  Piotr Parczewski :  0.21%\n    -  Derek Higgins :  0.21%\n    -  Daniel Mellado :  0.21%\n    -  HanGuangyu :  0.21%\n**************************************************","commit_id":"d0326c042f15db4b18c325de5483c2d9e8ed39f5"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3a96855fa00902bb2044788cf9fbff187752a861","unresolved":true,"context_lines":[{"line_number":259,"context_line":"                    repos, within\u003dcount_days, branch\u003dbranch)"},{"line_number":260,"context_line":"                merged_patches \u003d gerrit.get_total_merged("},{"line_number":261,"context_line":"                    repos, within\u003dcount_days, branch\u003dbranch)"},{"line_number":262,"context_line":"                unreview_rate \u003d ("},{"line_number":263,"context_line":"                    len(not_reviewed_patches)/len(total_valid_patches))*100//1"},{"line_number":264,"context_line":"                merged_rate \u003d ("},{"line_number":265,"context_line":"                    len(merged_patches)/len(total_valid_patches))*100//1"},{"line_number":266,"context_line":"                owners_rates \u003d gerrit.count_owners("}],"source_content_type":"text/x-python","patch_set":10,"id":"91302351_fb318cd0","line":263,"range":{"start_line":262,"start_character":0,"end_line":263,"end_character":78},"updated":"2022-05-13 16:56:09.000000000","message":"I got an error here where repo has no valid patches like adjutant in below error. we should check the below calculation with if total_valid_patches condition and if there is no valid patches then just print \"no valid patches in this repo to calculate the stats\" \n\n\n Start Project adjutant analysis...\n Includes repositories: [\u0027openstack/adjutant\u0027, \u0027openstack/adjutant-ui\u0027, \u0027openstack/python-adjutantclient\u0027]\n Start analysis branch master...\n Validating Gerrit...\nTraceback (most recent call last):\n  File \"./tools/project_stats_check.py\", line 304, in \u003cmodule\u003e\n    main()\n  File \"./tools/project_stats_check.py\", line 263, in main\n    len(not_reviewed_patches)/len(total_valid_patches))*100//1\nZeroDivisionError: division by zero","commit_id":"ef160a10b90df849f82319830e90b04598791b98"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"51859f2936982dd486802d90d3c69508706e5815","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                    repos, within\u003dcount_days, branch\u003dbranch)"},{"line_number":260,"context_line":"                merged_patches \u003d gerrit.get_total_merged("},{"line_number":261,"context_line":"                    repos, within\u003dcount_days, branch\u003dbranch)"},{"line_number":262,"context_line":"                unreview_rate \u003d ("},{"line_number":263,"context_line":"                    len(not_reviewed_patches)/len(total_valid_patches))*100//1"},{"line_number":264,"context_line":"                merged_rate \u003d ("},{"line_number":265,"context_line":"                    len(merged_patches)/len(total_valid_patches))*100//1"},{"line_number":266,"context_line":"                owners_rates \u003d gerrit.count_owners("}],"source_content_type":"text/x-python","patch_set":10,"id":"e90e2331_5f97db58","line":263,"range":{"start_line":262,"start_character":0,"end_line":263,"end_character":78},"in_reply_to":"91302351_fb318cd0","updated":"2022-05-26 14:06:15.000000000","message":"Fixed, thx.","commit_id":"ef160a10b90df849f82319830e90b04598791b98"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"0ac7164acc7b24c3c084d9b226660dc2cb797653","unresolved":true,"context_lines":[{"line_number":247,"context_line":"    )"},{"line_number":248,"context_line":"    parser.add_argument("},{"line_number":249,"context_line":"        \u0027-p\u0027, \u0027--projects\u0027,"},{"line_number":250,"context_line":"        help\u003d\u0027projects to analyze. Seperate with comma\u0027,"},{"line_number":251,"context_line":"    )"},{"line_number":252,"context_line":"    parser.add_argument("},{"line_number":253,"context_line":"        \u0027-d\u0027, \u0027--days\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"52a25937_e5c9bbe0","line":250,"range":{"start_line":250,"start_character":35,"end_line":250,"end_character":43},"updated":"2022-05-26 17:59:36.000000000","message":"nit: Separate","commit_id":"201610b82b0d762763096fbb99668cb5358d0945"}]}
