)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6889,"name":"Fabien Boucher","email":"fboucher@redhat.com","username":"fabien-boucher"},"change_message_id":"6a4a98d9e152555035ff03f4ab95c367dfa0906f","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"GitHub has a branch protection setting that allows to block PRs from"},{"line_number":10,"context_line":"being merged until reviews of users that are responsible for the files"},{"line_number":11,"context_line":"in the PR have reviewed. Since GitHub doesn\u0027t expose an API that tells"},{"line_number":12,"context_line":"us whether we can merge a certain PR, we have to determine code ownership"},{"line_number":13,"context_line":"ourselves. Therefore we download the CODEOWNERS files from"},{"line_number":14,"context_line":"all possible locations within the repository and cache the parsed file."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"7faddb67_55ec44ba","line":11,"updated":"2019-08-29 13:23:09.000000000","message":"A link to https://help.github.com/en/articles/about-code-owners could be useful for the reviewer.","commit_id":"d6320754a787416e749db9c460f8a181a4da1107"},{"author":{"_account_id":6889,"name":"Fabien Boucher","email":"fboucher@redhat.com","username":"fabien-boucher"},"change_message_id":"6a4a98d9e152555035ff03f4ab95c367dfa0906f","unresolved":false,"context_lines":[{"line_number":17,"context_line":"provide an approval. We then look through the available review to check"},{"line_number":18,"context_line":"if all the file groups have at least one review."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Please note that there is a limit of 300 files per PR. If a PR has more"},{"line_number":21,"context_line":"than 300 files, we cannot determine whether the PR would be mergeable"},{"line_number":22,"context_line":"and we fall back to the old behavior. This might therefore still lead to"},{"line_number":23,"context_line":"merge failures on GitHub side."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"7faddb67_75f7008e","line":20,"updated":"2019-08-29 13:23:09.000000000","message":"Is the API v4 also has this limitation https://developer.github.com/v4/object/pullrequestchangedfileconnection/ ?","commit_id":"d6320754a787416e749db9c460f8a181a4da1107"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"3bf1177f844d9e84aa027a6af29f4f732bf6da8c","unresolved":false,"context_lines":[{"line_number":17,"context_line":"provide an approval. We then look through the available review to check"},{"line_number":18,"context_line":"if all the file groups have at least one review."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Please note that there is a limit of 300 files per PR. If a PR has more"},{"line_number":21,"context_line":"than 300 files, we cannot determine whether the PR would be mergeable"},{"line_number":22,"context_line":"and we fall back to the old behavior. This might therefore still lead to"},{"line_number":23,"context_line":"merge failures on GitHub side."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"7faddb67_4b20eb49","line":20,"in_reply_to":"7faddb67_75f7008e","updated":"2019-09-03 12:34:22.000000000","message":"Yes it does. I tried it out:\n\n- the field \"changedFiles\" on PullRequest gives the correct number of changed files in the PR even if it\u0027s more than 300 (see https://developer.github.com/enterprise/2.15/v4/object/pullrequest/#fields)\n- but the PullRequestChangedFileConnection gives only up to 300 files.","commit_id":"d6320754a787416e749db9c460f8a181a4da1107"}],"releasenotes/notes/evaluate-codeowners-during-canmerge-e0ca7b422e7ac034.yaml":[{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"19d37dffc88f32bd003692653f73645d6f48bccf","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    CODEOWNERS is now evaluated in the GitHub driver if this feature is"},{"line_number":5,"context_line":"    activated in the branch protection settings of GitHub. Merges and gate"},{"line_number":6,"context_line":"    runs will now only be performed if all reviews from all CODEOWNERs of the"},{"line_number":7,"context_line":"    modified files are available."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7faddb67_62a14494","line":6,"range":{"start_line":6,"start_character":56,"end_line":6,"end_character":70},"updated":"2019-07-16 11:49:32.000000000","message":"\u0027all CODEOWNERs\u0027 seems like it might be a bit strong. ansible/ansible uses a *similar* file (although not codeowners) - but it\u0027s an example I have at hand:\n\nhttps://github.com/ansible/ansible/blob/devel/.github/BOTMETA.yml#L177\nhttps://github.com/ansible/ansible/blob/devel/.github/BOTMETA.yml#L1586\n\nIn this case, everyone in $team_openstack are \u0027codeowners\u0027 for that code. We don\u0027t want to require a review from every member of the team before merging, but instead we look for 2 positive review from those people.\n\nDo we want to teach zuul about number-of-codeowners? Or do we want to just have zuul ensure that if there are reviews from codeowners they are all positive? Or am I completely misunderstanding the situation?","commit_id":"9a2cf8bc0a2796b58b40ec379e9dbe3dfe183674"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"c2580f392a1c3815df3b92980a6f31152cbb1eff","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    CODEOWNERS is now evaluated in the GitHub driver if this feature is"},{"line_number":5,"context_line":"    activated in the branch protection settings of GitHub. Merges and gate"},{"line_number":6,"context_line":"    runs will now only be performed if all reviews from all CODEOWNERs of the"},{"line_number":7,"context_line":"    modified files are available."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7faddb67_42dc48e3","line":6,"range":{"start_line":6,"start_character":56,"end_line":6,"end_character":70},"in_reply_to":"7faddb67_024df0c2","updated":"2019-07-16 12:05:14.000000000","message":"Or something like: ... will now only performed if reviews according to codeowners rules are available if requested by the branch protection.","commit_id":"9a2cf8bc0a2796b58b40ec379e9dbe3dfe183674"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"682e54d7edf3eb479cde328666492d2f3dd2c96c","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    CODEOWNERS is now evaluated in the GitHub driver if this feature is"},{"line_number":5,"context_line":"    activated in the branch protection settings of GitHub. Merges and gate"},{"line_number":6,"context_line":"    runs will now only be performed if all reviews from all CODEOWNERs of the"},{"line_number":7,"context_line":"    modified files are available."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7faddb67_c27a78ef","line":6,"range":{"start_line":6,"start_character":56,"end_line":6,"end_character":70},"in_reply_to":"7faddb67_62a14494","updated":"2019-07-16 11:58:23.000000000","message":"You\u0027re understanding it right, we require at least one review of a code owner for each modified file.\n\nThe number of codeowners was not a thing when this was implemented. I\u0027d like it to be supported but in order to make this change not even more complicated (it\u0027s hard to get it right and probably even harder to get reviewers) I\u0027d like to defer that to a followup-change that adds this new feature.\n\nThat said we\u0027re running this in production since several weeks now and I think we\u0027ve shaken out most bugs given that our users are quite good in finding corner cases.","commit_id":"9a2cf8bc0a2796b58b40ec379e9dbe3dfe183674"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"27dfc2916ee8b700fc2b498046129734ba2e1112","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    CODEOWNERS is now evaluated in the GitHub driver if this feature is"},{"line_number":5,"context_line":"    activated in the branch protection settings of GitHub. Merges and gate"},{"line_number":6,"context_line":"    runs will now only be performed if all reviews from all CODEOWNERs of the"},{"line_number":7,"context_line":"    modified files are available."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7faddb67_024df0c2","line":6,"range":{"start_line":6,"start_character":56,"end_line":6,"end_character":70},"in_reply_to":"7faddb67_c27a78ef","updated":"2019-07-16 12:03:04.000000000","message":"Cool. Then I think we should update this release note to say \"now only be performed if at least one approval from am appropriate user from CODEOWNERS is present.\"\n\nOr something.","commit_id":"9a2cf8bc0a2796b58b40ec379e9dbe3dfe183674"}],"tests/base.py":[{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"8cadd3bc9cc3cec7d1f42d06c1975c11dd14494e","unresolved":false,"context_lines":[{"line_number":1292,"context_line":"        pull_request.removeLabel(label)"},{"line_number":1293,"context_line":""},{"line_number":1294,"context_line":"    def _fetchFileFromGithub(self,"},{"line_number":1295,"context_line":"                             project: str,"},{"line_number":1296,"context_line":"                             branch: str,"},{"line_number":1297,"context_line":"                             path: str) -\u003e Optional[bytes]:"},{"line_number":1298,"context_line":"        repo \u003d self.getGitUrl(project)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_53cffcb2","line":1295,"range":{"start_line":1295,"start_character":29,"end_line":1295,"end_character":36},"updated":"2019-03-29 16:05:01.000000000","message":"We should rename this to project_name to not confuse it with the project object which already lead to some confusion in the past.","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":27719,"name":"Markus Hosch","email":"markus.hosch@bmw.de","username":"bavarianmaho"},"change_message_id":"9e26832e7d666bd586f2b288185bd8f3829b410e","unresolved":false,"context_lines":[{"line_number":1292,"context_line":"        pull_request.removeLabel(label)"},{"line_number":1293,"context_line":""},{"line_number":1294,"context_line":"    def _fetchFileFromGithub(self,"},{"line_number":1295,"context_line":"                             project: str,"},{"line_number":1296,"context_line":"                             branch: str,"},{"line_number":1297,"context_line":"                             path: str) -\u003e Optional[bytes]:"},{"line_number":1298,"context_line":"        repo \u003d self.getGitUrl(project)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_93a69253","line":1295,"range":{"start_line":1295,"start_character":29,"end_line":1295,"end_character":36},"in_reply_to":"5fc1f717_53cffcb2","updated":"2019-04-17 09:56:44.000000000","message":"Done","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"23070c6913ebb4d8e074859ee96b6c5e8e9dfb96","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from logging import Logger"},{"line_number":33,"context_line":"from queue import Queue"},{"line_number":34,"context_line":"from typing import Callable, Optional, Any, Iterable, Generator, List"},{"line_number":35,"context_line":"from typing import Optional"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"import requests"},{"line_number":38,"context_line":"import select"}],"source_content_type":"text/x-python","patch_set":51,"id":"df33271e_e3bb3ce2","line":35,"updated":"2020-04-08 14:47:55.000000000","message":"linters: F811 redefinition of unused \u0027Optional\u0027 from line 34","commit_id":"7367039e7495f9fd4e1ccaceaadeeed31ccfee2c"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"400396a6ce7526a5eaf52b963b5abd7d1e123382","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from logging import Logger"},{"line_number":33,"context_line":"from queue import Queue"},{"line_number":34,"context_line":"from typing import Callable, Optional, Any, Iterable, Generator, List"},{"line_number":35,"context_line":"from typing import Optional"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"import requests"},{"line_number":38,"context_line":"import select"}],"source_content_type":"text/x-python","patch_set":53,"id":"bf51134e_01a0a9f3","line":35,"updated":"2020-07-10 18:04:53.000000000","message":"linters: F811 redefinition of unused \u0027Optional\u0027 from line 34","commit_id":"0e9950f12907df503fd31dab55134c6643a46198"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"d95ef5628aeb124b33c009379bc86818dcb80eda","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from logging import Logger"},{"line_number":33,"context_line":"from queue import Queue"},{"line_number":34,"context_line":"from typing import Callable, Optional, Any, Iterable, Generator, List"},{"line_number":35,"context_line":"from typing import Optional"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"import requests"},{"line_number":38,"context_line":"import select"}],"source_content_type":"text/x-python","patch_set":54,"id":"bf51134e_cb1ec35d","line":35,"updated":"2020-07-13 09:21:49.000000000","message":"linters: F811 redefinition of unused \u0027Optional\u0027 from line 34","commit_id":"703ff6aa5dd374139f788da4460fa9da2e1ebd6c"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"985bac46eb941a0a217e8f36c7dbf100fe69d829","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from logging import Logger"},{"line_number":33,"context_line":"from queue import Queue"},{"line_number":34,"context_line":"from typing import Callable, Optional, Any, Iterable, Generator, List"},{"line_number":35,"context_line":"from typing import Optional"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"import requests"},{"line_number":38,"context_line":"import select"}],"source_content_type":"text/x-python","patch_set":55,"id":"9f560f44_e38430b4","line":35,"updated":"2020-07-27 12:34:46.000000000","message":"linters: F811 redefinition of unused \u0027Optional\u0027 from line 34","commit_id":"cdbc1b97881180bca2a64e1e561b110a291f7bb5"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3e4baedb3a41d080a1a7d59bf26e3e2136714e2e","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from logging import Logger"},{"line_number":33,"context_line":"from queue import Queue"},{"line_number":34,"context_line":"from typing import Callable, Optional, Any, Iterable, Generator, List"},{"line_number":35,"context_line":"from typing import Optional"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"import requests"},{"line_number":38,"context_line":"import select"}],"source_content_type":"text/x-python","patch_set":56,"id":"9f560f44_15e35507","line":35,"updated":"2020-07-27 14:45:35.000000000","message":"linters: F811 redefinition of unused \u0027Optional\u0027 from line 34","commit_id":"46014186b83f57d6cdb6b3fca67dad9b7c280df6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3cf396d3ca9b084cc8e35583f7012bccb2470db4","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from logging import Logger"},{"line_number":33,"context_line":"from queue import Queue"},{"line_number":34,"context_line":"from typing import Callable, Optional, Any, Iterable, Generator, List"},{"line_number":35,"context_line":"from typing import Optional"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"import requests"},{"line_number":38,"context_line":"import select"}],"source_content_type":"text/x-python","patch_set":57,"id":"9f560f44_46b52531","line":35,"updated":"2020-07-27 17:01:39.000000000","message":"linters: F811 redefinition of unused \u0027Optional\u0027 from line 34","commit_id":"19252dddb51ddacf06809dc1468acce1640b982d"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f7ea8038706730780b0d1caea2c417064013d378","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from logging import Logger"},{"line_number":33,"context_line":"from queue import Queue"},{"line_number":34,"context_line":"from typing import Callable, Optional, Any, Iterable, Generator, List"},{"line_number":35,"context_line":"from typing import Optional"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"import requests"},{"line_number":38,"context_line":"import select"}],"source_content_type":"text/x-python","patch_set":59,"id":"9f560f44_22ca94a0","line":35,"updated":"2020-08-31 11:09:20.000000000","message":"linters: F811 redefinition of unused \u0027Optional\u0027 from line 34","commit_id":"7dcc69c9f36153af8830718318784e555e046786"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3543cd0d63f79d101b8ff46c8f9784654034f1bc","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from logging import Logger"},{"line_number":33,"context_line":"from queue import Queue"},{"line_number":34,"context_line":"from typing import Callable, Optional, Any, Iterable, Generator, List"},{"line_number":35,"context_line":"from typing import Optional"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"import requests"},{"line_number":38,"context_line":"import select"}],"source_content_type":"text/x-python","patch_set":60,"id":"9f560f44_edbb6d72","line":35,"updated":"2020-08-31 12:55:46.000000000","message":"linters: F811 redefinition of unused \u0027Optional\u0027 from line 34","commit_id":"d519212cb9a440a3740dc3f7400faf022b11190d"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"d59f36992057e553e4f432eaa5d615e3b35c8ece","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from logging import Logger"},{"line_number":33,"context_line":"from queue import Queue"},{"line_number":34,"context_line":"from typing import Callable, Optional, Any, Iterable, Generator, List"},{"line_number":35,"context_line":"from typing import Optional"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"import requests"},{"line_number":38,"context_line":"import select"}],"source_content_type":"text/x-python","patch_set":61,"id":"9f560f44_a686c115","line":35,"updated":"2020-09-15 11:16:43.000000000","message":"linters: F811 redefinition of unused \u0027Optional\u0027 from line 34","commit_id":"e6adab7a2a62f1b44e1c244d170ae432d6454671"}],"tests/unit/test_github_driver.py":[{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"8cadd3bc9cc3cec7d1f42d06c1975c11dd14494e","unresolved":false,"context_lines":[{"line_number":1447,"context_line":"        testteam1 \u003d FakeGithubTeam(\u0027team1\u0027, {\u0027mhosch\u0027}, permission\u003d\u0027push\u0027)"},{"line_number":1448,"context_line":"        testteam2 \u003d FakeGithubTeam(\u0027team2\u0027, {\u0027tobiash\u0027}, permission\u003d\u0027push\u0027)"},{"line_number":1449,"context_line":"        testteam3 \u003d FakeGithubTeam(\u0027team3\u0027, {\u0027swestphahl\u0027}, permission\u003d\u0027pull\u0027)"},{"line_number":1450,"context_line":"        teams \u003d [testteam1, testteam2, testteam3]"},{"line_number":1451,"context_line":""},{"line_number":1452,"context_line":"        ghuser \u003d FakeGithubCollaborator(\u0027ghuser\u0027,"},{"line_number":1453,"context_line":"                                        permissions\u003d{"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_f6d61654","line":1450,"updated":"2019-03-29 16:05:01.000000000","message":"We should also test with a team that has admin permissions.","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":27719,"name":"Markus Hosch","email":"markus.hosch@bmw.de","username":"bavarianmaho"},"change_message_id":"9e26832e7d666bd586f2b288185bd8f3829b410e","unresolved":false,"context_lines":[{"line_number":1447,"context_line":"        testteam1 \u003d FakeGithubTeam(\u0027team1\u0027, {\u0027mhosch\u0027}, permission\u003d\u0027push\u0027)"},{"line_number":1448,"context_line":"        testteam2 \u003d FakeGithubTeam(\u0027team2\u0027, {\u0027tobiash\u0027}, permission\u003d\u0027push\u0027)"},{"line_number":1449,"context_line":"        testteam3 \u003d FakeGithubTeam(\u0027team3\u0027, {\u0027swestphahl\u0027}, permission\u003d\u0027pull\u0027)"},{"line_number":1450,"context_line":"        teams \u003d [testteam1, testteam2, testteam3]"},{"line_number":1451,"context_line":""},{"line_number":1452,"context_line":"        ghuser \u003d FakeGithubCollaborator(\u0027ghuser\u0027,"},{"line_number":1453,"context_line":"                                        permissions\u003d{"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_ee11295f","line":1450,"in_reply_to":"5fc1f717_f6d61654","updated":"2019-04-17 09:56:44.000000000","message":"Done","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"8cadd3bc9cc3cec7d1f42d06c1975c11dd14494e","unresolved":false,"context_lines":[{"line_number":1487,"context_line":"            {\u0027some_file.cpp\u0027: \u0027int main() {}\u0027}, [\u0027ghuser\u0027], True)"},{"line_number":1488,"context_line":""},{"line_number":1489,"context_line":"    def test_review_from_codeowner_using_mail(self):"},{"line_number":1490,"context_line":"        self._test_pipeline_with_codeowners("},{"line_number":1491,"context_line":"            {\u0027test.py\u0027: \u0027# just a comment\u0027}, [\u0027ghuser\u0027], True)"},{"line_number":1492,"context_line":""},{"line_number":1493,"context_line":"    def test_review_from_team_member(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_7686a668","line":1490,"updated":"2019-03-29 16:05:01.000000000","message":"Maybe we should add a negative test for this one.","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":27719,"name":"Markus Hosch","email":"markus.hosch@bmw.de","username":"bavarianmaho"},"change_message_id":"9e26832e7d666bd586f2b288185bd8f3829b410e","unresolved":false,"context_lines":[{"line_number":1487,"context_line":"            {\u0027some_file.cpp\u0027: \u0027int main() {}\u0027}, [\u0027ghuser\u0027], True)"},{"line_number":1488,"context_line":""},{"line_number":1489,"context_line":"    def test_review_from_codeowner_using_mail(self):"},{"line_number":1490,"context_line":"        self._test_pipeline_with_codeowners("},{"line_number":1491,"context_line":"            {\u0027test.py\u0027: \u0027# just a comment\u0027}, [\u0027ghuser\u0027], True)"},{"line_number":1492,"context_line":""},{"line_number":1493,"context_line":"    def test_review_from_team_member(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_2e189182","line":1490,"in_reply_to":"5fc1f717_7686a668","updated":"2019-04-17 09:56:44.000000000","message":"Done","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"8cadd3bc9cc3cec7d1f42d06c1975c11dd14494e","unresolved":false,"context_lines":[{"line_number":1498,"context_line":"        self._test_pipeline_with_codeowners("},{"line_number":1499,"context_line":"            {\u0027test.yaml\u0027: \u0027stuff\u0027}, [\u0027tobiash\u0027], True)"},{"line_number":1500,"context_line":""},{"line_number":1501,"context_line":"        self.fake_github.emitEvent(self._generate_membership_event(\u0027org\u0027,"},{"line_number":1502,"context_line":"                                                                   \u0027team2\u0027,"},{"line_number":1503,"context_line":"                                                                   \u0027removed\u0027,"},{"line_number":1504,"context_line":"                                                                   \u0027tobiash\u0027))"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_d638bad5","line":1501,"updated":"2019-03-29 16:05:01.000000000","message":"This looks like this can create a race so we should probably add a self.waitUntilSettled after this event.","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":27719,"name":"Markus Hosch","email":"markus.hosch@bmw.de","username":"bavarianmaho"},"change_message_id":"9e26832e7d666bd586f2b288185bd8f3829b410e","unresolved":false,"context_lines":[{"line_number":1498,"context_line":"        self._test_pipeline_with_codeowners("},{"line_number":1499,"context_line":"            {\u0027test.yaml\u0027: \u0027stuff\u0027}, [\u0027tobiash\u0027], True)"},{"line_number":1500,"context_line":""},{"line_number":1501,"context_line":"        self.fake_github.emitEvent(self._generate_membership_event(\u0027org\u0027,"},{"line_number":1502,"context_line":"                                                                   \u0027team2\u0027,"},{"line_number":1503,"context_line":"                                                                   \u0027removed\u0027,"},{"line_number":1504,"context_line":"                                                                   \u0027tobiash\u0027))"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_e28d35d4","line":1501,"in_reply_to":"5fc1f717_d638bad5","updated":"2019-04-17 09:56:44.000000000","message":"Done","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"8cadd3bc9cc3cec7d1f42d06c1975c11dd14494e","unresolved":false,"context_lines":[{"line_number":1524,"context_line":"            {\u0027test.php\u0027: \u0027stuff\u0027}, [\u0027tobiash\u0027], True)"},{"line_number":1525,"context_line":""},{"line_number":1526,"context_line":"        self.fake_github.emitEvent("},{"line_number":1527,"context_line":"            self._generate_team_event(\u0027org\u0027,"},{"line_number":1528,"context_line":"                                      \u0027team2\u0027,"},{"line_number":1529,"context_line":"                                      \u0027removed_from_repository\u0027,"},{"line_number":1530,"context_line":"                                      \u0027project1\u0027,"},{"line_number":1531,"context_line":"                                      \u0027push\u0027))"},{"line_number":1532,"context_line":""},{"line_number":1533,"context_line":"        self._test_pipeline_with_codeowners("},{"line_number":1534,"context_line":"            {\u0027test.php\u0027: \u0027stuff\u0027}, [\u0027tobiash\u0027], False)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_36cedeb4","line":1531,"range":{"start_line":1527,"start_character":0,"end_line":1531,"end_character":46},"updated":"2019-03-29 16:05:01.000000000","message":"waitUntilSettled?","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":27719,"name":"Markus Hosch","email":"markus.hosch@bmw.de","username":"bavarianmaho"},"change_message_id":"9e26832e7d666bd586f2b288185bd8f3829b410e","unresolved":false,"context_lines":[{"line_number":1524,"context_line":"            {\u0027test.php\u0027: \u0027stuff\u0027}, [\u0027tobiash\u0027], True)"},{"line_number":1525,"context_line":""},{"line_number":1526,"context_line":"        self.fake_github.emitEvent("},{"line_number":1527,"context_line":"            self._generate_team_event(\u0027org\u0027,"},{"line_number":1528,"context_line":"                                      \u0027team2\u0027,"},{"line_number":1529,"context_line":"                                      \u0027removed_from_repository\u0027,"},{"line_number":1530,"context_line":"                                      \u0027project1\u0027,"},{"line_number":1531,"context_line":"                                      \u0027push\u0027))"},{"line_number":1532,"context_line":""},{"line_number":1533,"context_line":"        self._test_pipeline_with_codeowners("},{"line_number":1534,"context_line":"            {\u0027test.php\u0027: \u0027stuff\u0027}, [\u0027tobiash\u0027], False)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_d51eb45d","line":1531,"range":{"start_line":1527,"start_character":0,"end_line":1531,"end_character":46},"in_reply_to":"5fc1f717_36cedeb4","updated":"2019-04-17 09:56:44.000000000","message":"Done","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"8cadd3bc9cc3cec7d1f42d06c1975c11dd14494e","unresolved":false,"context_lines":[{"line_number":1538,"context_line":"            {\u0027test.php\u0027: \u0027stuff\u0027}, [\u0027tobiash\u0027], True)"},{"line_number":1539,"context_line":""},{"line_number":1540,"context_line":"        self.fake_github.emitEvent("},{"line_number":1541,"context_line":"            self._generate_team_event(\u0027org\u0027,"},{"line_number":1542,"context_line":"                                      \u0027team2\u0027,"},{"line_number":1543,"context_line":"                                      \u0027deleted\u0027,"},{"line_number":1544,"context_line":"                                      \u0027project1\u0027,"},{"line_number":1545,"context_line":"                                      \u0027push\u0027))"},{"line_number":1546,"context_line":""},{"line_number":1547,"context_line":"        self._test_pipeline_with_codeowners("},{"line_number":1548,"context_line":"            {\u0027test.php\u0027: \u0027stuff\u0027}, [\u0027tobiash\u0027], False)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_d6c2fa86","line":1545,"range":{"start_line":1541,"start_character":0,"end_line":1545,"end_character":46},"updated":"2019-03-29 16:05:01.000000000","message":"waitUntilSettled?","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":27719,"name":"Markus Hosch","email":"markus.hosch@bmw.de","username":"bavarianmaho"},"change_message_id":"9e26832e7d666bd586f2b288185bd8f3829b410e","unresolved":false,"context_lines":[{"line_number":1538,"context_line":"            {\u0027test.php\u0027: \u0027stuff\u0027}, [\u0027tobiash\u0027], True)"},{"line_number":1539,"context_line":""},{"line_number":1540,"context_line":"        self.fake_github.emitEvent("},{"line_number":1541,"context_line":"            self._generate_team_event(\u0027org\u0027,"},{"line_number":1542,"context_line":"                                      \u0027team2\u0027,"},{"line_number":1543,"context_line":"                                      \u0027deleted\u0027,"},{"line_number":1544,"context_line":"                                      \u0027project1\u0027,"},{"line_number":1545,"context_line":"                                      \u0027push\u0027))"},{"line_number":1546,"context_line":""},{"line_number":1547,"context_line":"        self._test_pipeline_with_codeowners("},{"line_number":1548,"context_line":"            {\u0027test.php\u0027: \u0027stuff\u0027}, [\u0027tobiash\u0027], False)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_d5531415","line":1545,"range":{"start_line":1541,"start_character":0,"end_line":1545,"end_character":46},"in_reply_to":"5fc1f717_d6c2fa86","updated":"2019-04-17 09:56:44.000000000","message":"Done","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"8cadd3bc9cc3cec7d1f42d06c1975c11dd14494e","unresolved":false,"context_lines":[{"line_number":1589,"context_line":""},{"line_number":1590,"context_line":"        reviewers \u003d codeowners.getReviewersForFiles({\u0027somethingelse.txt\u0027})"},{"line_number":1591,"context_line":"        self.assertEqual(reviewers, [[\u0027@org/team2\u0027, \u0027@ghuser\u0027]])"},{"line_number":1592,"context_line":""},{"line_number":1593,"context_line":"    def test_codeowners_verification(self):"},{"line_number":1594,"context_line":"        github \u003d self.fake_github"},{"line_number":1595,"context_line":"        review1 \u003d [{"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_c1fc72b7","line":1592,"updated":"2019-03-29 16:05:01.000000000","message":"Add following test cases:\n\nPR containing main.rs and test.yaml and expect:\n- team1 AND team2 approval\n\nPR containing main.rs and test.yaml and expect:\n-  team3","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":27719,"name":"Markus Hosch","email":"markus.hosch@bmw.de","username":"bavarianmaho"},"change_message_id":"afb92d43d56fcec18643a2ff73e024a8cfa9a954","unresolved":false,"context_lines":[{"line_number":1589,"context_line":""},{"line_number":1590,"context_line":"        reviewers \u003d codeowners.getReviewersForFiles({\u0027somethingelse.txt\u0027})"},{"line_number":1591,"context_line":"        self.assertEqual(reviewers, [[\u0027@org/team2\u0027, \u0027@ghuser\u0027]])"},{"line_number":1592,"context_line":""},{"line_number":1593,"context_line":"    def test_codeowners_verification(self):"},{"line_number":1594,"context_line":"        github \u003d self.fake_github"},{"line_number":1595,"context_line":"        review1 \u003d [{"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_22aacdd1","line":1592,"in_reply_to":"5fc1f717_c1fc72b7","updated":"2019-05-22 15:08:43.000000000","message":"Done","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"8cadd3bc9cc3cec7d1f42d06c1975c11dd14494e","unresolved":false,"context_lines":[{"line_number":1608,"context_line":"            \u0027type\u0027: \u0027APPROVED\u0027"},{"line_number":1609,"context_line":"        }]"},{"line_number":1610,"context_line":""},{"line_number":1611,"context_line":"        assert github._hasCodeownersReview(\u0027org/project1\u0027, \u0027master\u0027,"},{"line_number":1612,"context_line":"                                           [\u0027zuul.yaml\u0027], review1)"},{"line_number":1613,"context_line":"        assert not github._hasCodeownersReview(\u0027org/project1\u0027, \u0027master\u0027,"},{"line_number":1614,"context_line":"                                               [\u0027zuul.yaml\u0027], review2)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_565daaea","line":1611,"range":{"start_line":1611,"start_character":8,"end_line":1611,"end_character":14},"updated":"2019-03-29 16:05:01.000000000","message":"All tests use self.assert* so this should be the case here too.","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":27719,"name":"Markus Hosch","email":"markus.hosch@bmw.de","username":"bavarianmaho"},"change_message_id":"9e26832e7d666bd586f2b288185bd8f3829b410e","unresolved":false,"context_lines":[{"line_number":1608,"context_line":"            \u0027type\u0027: \u0027APPROVED\u0027"},{"line_number":1609,"context_line":"        }]"},{"line_number":1610,"context_line":""},{"line_number":1611,"context_line":"        assert github._hasCodeownersReview(\u0027org/project1\u0027, \u0027master\u0027,"},{"line_number":1612,"context_line":"                                           [\u0027zuul.yaml\u0027], review1)"},{"line_number":1613,"context_line":"        assert not github._hasCodeownersReview(\u0027org/project1\u0027, \u0027master\u0027,"},{"line_number":1614,"context_line":"                                               [\u0027zuul.yaml\u0027], review2)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_b5468820","line":1611,"range":{"start_line":1611,"start_character":8,"end_line":1611,"end_character":14},"in_reply_to":"5fc1f717_565daaea","updated":"2019-04-17 09:56:44.000000000","message":"Done","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"}],"zuul/driver/github/githubconnection.py":[{"author":{"_account_id":27719,"name":"Markus Hosch","email":"markus.hosch@bmw.de","username":"bavarianmaho"},"change_message_id":"509b8c86e43d666c1ca3eacc8d566a710a866373","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        Since the rules are appended to the ruleset, they take precedence over"},{"line_number":80,"context_line":"        rules that are already present in the ruleset of a Codeowners instance."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        :param file: TextIOBase that shall be parsed"},{"line_number":83,"context_line":"        \"\"\""},{"line_number":84,"context_line":"        for line in file.splitlines():"},{"line_number":85,"context_line":"            content, _, _ \u003d line.partition(\u0027#\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_877bc779","line":82,"updated":"2019-04-01 10:33:44.000000000","message":"TextIOBase? Double check","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":27719,"name":"Markus Hosch","email":"markus.hosch@bmw.de","username":"bavarianmaho"},"change_message_id":"9e26832e7d666bd586f2b288185bd8f3829b410e","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        Since the rules are appended to the ruleset, they take precedence over"},{"line_number":80,"context_line":"        rules that are already present in the ruleset of a Codeowners instance."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        :param file: TextIOBase that shall be parsed"},{"line_number":83,"context_line":"        \"\"\""},{"line_number":84,"context_line":"        for line in file.splitlines():"},{"line_number":85,"context_line":"            content, _, _ \u003d line.partition(\u0027#\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_b5ad2832","line":82,"in_reply_to":"5fc1f717_877bc779","updated":"2019-04-17 09:56:44.000000000","message":"Done","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"8cadd3bc9cc3cec7d1f42d06c1975c11dd14494e","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                self.log.warning(\"Missing reviewers in CODEOWNERS\")"},{"line_number":93,"context_line":"                continue"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"            regex, action \u003d GitWildMatchPattern.pattern_to_regex(glob)"},{"line_number":96,"context_line":"            if action is not None:"},{"line_number":97,"context_line":"                if not action:"},{"line_number":98,"context_line":"                    self.log.warning(\"Excluding patterns is not supported by \""}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_01d7da51","line":95,"updated":"2019-03-29 16:05:01.000000000","message":"The patten \u0027/\u0027  will result in None as regex. We need to check for this case and ignore it. Also this edge case should be tested.","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":27719,"name":"Markus Hosch","email":"markus.hosch@bmw.de","username":"bavarianmaho"},"change_message_id":"509b8c86e43d666c1ca3eacc8d566a710a866373","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                self.log.warning(\"Missing reviewers in CODEOWNERS\")"},{"line_number":93,"context_line":"                continue"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"            regex, action \u003d GitWildMatchPattern.pattern_to_regex(glob)"},{"line_number":96,"context_line":"            if action is not None:"},{"line_number":97,"context_line":"                if not action:"},{"line_number":98,"context_line":"                    self.log.warning(\"Excluding patterns is not supported by \""}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_a7436313","line":95,"in_reply_to":"5fc1f717_01d7da51","updated":"2019-04-01 10:33:44.000000000","message":"The regex is only used if action is not None, otherwise this case is silently ignored. I will\n1. Check what GitHub does\n2. Make up a rule in case GitHub unexpectedly DOES consider the rule\n3. log the fact that a rule was ignored if regex or action is None","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":27719,"name":"Markus Hosch","email":"markus.hosch@bmw.de","username":"bavarianmaho"},"change_message_id":"afb92d43d56fcec18643a2ff73e024a8cfa9a954","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                self.log.warning(\"Missing reviewers in CODEOWNERS\")"},{"line_number":93,"context_line":"                continue"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"            regex, action \u003d GitWildMatchPattern.pattern_to_regex(glob)"},{"line_number":96,"context_line":"            if action is not None:"},{"line_number":97,"context_line":"                if not action:"},{"line_number":98,"context_line":"                    self.log.warning(\"Excluding patterns is not supported by \""}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_d1f94480","line":95,"in_reply_to":"5fc1f717_a7436313","updated":"2019-05-22 15:08:43.000000000","message":"GitHub does not consider that rule.","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"8cadd3bc9cc3cec7d1f42d06c1975c11dd14494e","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                             files: Set[str]) -\u003e List[List[str]]:"},{"line_number":105,"context_line":"        \"\"\""},{"line_number":106,"context_line":"        Returns a list of reviewers for a set of files"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        :param files: Files that are under review"},{"line_number":109,"context_line":"        :return: List of reviewers needed for the set of files"},{"line_number":110,"context_line":"                 (teams or people)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_41df223a","line":107,"updated":"2019-03-29 16:05:01.000000000","message":"Maybe add an explanation of the algorithm here.","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":27719,"name":"Markus Hosch","email":"markus.hosch@bmw.de","username":"bavarianmaho"},"change_message_id":"9e26832e7d666bd586f2b288185bd8f3829b410e","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                             files: Set[str]) -\u003e List[List[str]]:"},{"line_number":105,"context_line":"        \"\"\""},{"line_number":106,"context_line":"        Returns a list of reviewers for a set of files"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        :param files: Files that are under review"},{"line_number":109,"context_line":"        :return: List of reviewers needed for the set of files"},{"line_number":110,"context_line":"                 (teams or people)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_1885515a","line":107,"in_reply_to":"5fc1f717_41df223a","updated":"2019-04-17 09:56:44.000000000","message":"Done","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"8cadd3bc9cc3cec7d1f42d06c1975c11dd14494e","unresolved":false,"context_lines":[{"line_number":574,"context_line":"        team \u003d \u0027%s/%s\u0027 % (self.body[\u0027organization\u0027][\u0027login\u0027],"},{"line_number":575,"context_line":"                          self.body[\u0027team\u0027][\u0027name\u0027])"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"        if (action \u003d\u003d \u0027edited\u0027 or action \u003d\u003d \u0027added_to_repository\u0027 or"},{"line_number":578,"context_line":"                action \u003d\u003d \u0027removed_from_repository\u0027):"},{"line_number":579,"context_line":"            repository \u003d self.body[\u0027repository\u0027]"},{"line_number":580,"context_line":"            project \u003d \u0027%s/%s\u0027 % (repository[\u0027owner\u0027][\u0027login\u0027],"},{"line_number":581,"context_line":"                                 repository[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_bc162d49","line":578,"range":{"start_line":577,"start_character":0,"end_line":578,"end_character":53},"updated":"2019-03-29 16:05:01.000000000","message":"That could be simplified to\n\n if action in (\u0027edited\u0027, \u0027added_to_repository\u0027, \u0027removed_from_repository\u0027):\n   ...","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":27719,"name":"Markus Hosch","email":"markus.hosch@bmw.de","username":"bavarianmaho"},"change_message_id":"9e26832e7d666bd586f2b288185bd8f3829b410e","unresolved":false,"context_lines":[{"line_number":574,"context_line":"        team \u003d \u0027%s/%s\u0027 % (self.body[\u0027organization\u0027][\u0027login\u0027],"},{"line_number":575,"context_line":"                          self.body[\u0027team\u0027][\u0027name\u0027])"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"        if (action \u003d\u003d \u0027edited\u0027 or action \u003d\u003d \u0027added_to_repository\u0027 or"},{"line_number":578,"context_line":"                action \u003d\u003d \u0027removed_from_repository\u0027):"},{"line_number":579,"context_line":"            repository \u003d self.body[\u0027repository\u0027]"},{"line_number":580,"context_line":"            project \u003d \u0027%s/%s\u0027 % (repository[\u0027owner\u0027][\u0027login\u0027],"},{"line_number":581,"context_line":"                                 repository[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fc1f717_d8c829a9","line":578,"range":{"start_line":577,"start_character":0,"end_line":578,"end_character":53},"in_reply_to":"5fc1f717_bc162d49","updated":"2019-04-17 09:56:44.000000000","message":"Done","commit_id":"07c926836babc67d1b8ce46bf289fd945542f1d8"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"b85f394ceb4adf0b3868a93d6c6a10d03d132a90","unresolved":false,"context_lines":[{"line_number":1566,"context_line":"        team_org, team_name \u003d team_name.split(\u0027/\u0027)"},{"line_number":1567,"context_line":"        cached_team_name \u003d \u0027%s/%s\u0027 % (team_org, team_name.lower())"},{"line_number":1568,"context_line":"        if cached_team_name not in self._team_cache or \\"},{"line_number":1569,"context_line":"                self._team_cache[cached_team_name].ttl \u003c time.time():"},{"line_number":1570,"context_line":"            self.sched.statsd.incr(\u0027zuul.cache.githubteams.miss\u0027)"},{"line_number":1571,"context_line":"            self.log.debug(\"Github team %s cache MISS\", cached_team_name)"},{"line_number":1572,"context_line":"            self._team_cache[cached_team_name] \u003d self._fetchGithubTeam("}],"source_content_type":"text/x-python","patch_set":25,"id":"7faddb67_57bc17db","line":1569,"range":{"start_line":1569,"start_character":21,"end_line":1569,"end_character":32},"updated":"2019-08-01 08:56:18.000000000","message":"Instead of handling ttl in the cached item and validating it ourselves we should use cachetools.TTLCache which handles this (and also prevents the cache from growing indefinitely).\n\nWe can then just retrieve the cached team via self._team_cache.get(cached_team_name) and if it\u0027s None we have a cache miss.","commit_id":"ba6db83552248b9ac8750741a014f2093b8e701f"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"b85f394ceb4adf0b3868a93d6c6a10d03d132a90","unresolved":false,"context_lines":[{"line_number":1568,"context_line":"        if cached_team_name not in self._team_cache or \\"},{"line_number":1569,"context_line":"                self._team_cache[cached_team_name].ttl \u003c time.time():"},{"line_number":1570,"context_line":"            self.sched.statsd.incr(\u0027zuul.cache.githubteams.miss\u0027)"},{"line_number":1571,"context_line":"            self.log.debug(\"Github team %s cache MISS\", cached_team_name)"},{"line_number":1572,"context_line":"            self._team_cache[cached_team_name] \u003d self._fetchGithubTeam("},{"line_number":1573,"context_line":"                project_name, team_name, event)"},{"line_number":1574,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":25,"id":"7faddb67_f7cc238a","line":1571,"range":{"start_line":1571,"start_character":49,"end_line":1571,"end_character":53},"updated":"2019-08-01 08:56:18.000000000","message":"nit: I find the log easier to read if we have spell miss and hit lowercase as part of the message.","commit_id":"ba6db83552248b9ac8750741a014f2093b8e701f"},{"author":{"_account_id":6889,"name":"Fabien Boucher","email":"fboucher@redhat.com","username":"fabien-boucher"},"change_message_id":"6758d10e409180b872d9fe7530b38ec430062369","unresolved":false,"context_lines":[{"line_number":1479,"context_line":"        owner, project \u003d project.split(\u0027/\u0027)"},{"line_number":1480,"context_line":"        repo \u003d github.repository(owner, project)"},{"line_number":1481,"context_line":"        try:"},{"line_number":1482,"context_line":"            content \u003d repo.file_contents(path, ref\u003dbranch)"},{"line_number":1483,"context_line":"            return content.decoded"},{"line_number":1484,"context_line":"        except github3.exceptions.NotFoundError:"},{"line_number":1485,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":31,"id":"7faddb67_232044b0","line":1482,"updated":"2019-09-02 13:31:25.000000000","message":"Could it be possible to use the executor local copy to fetch the CODEOWNERS file ?","commit_id":"d6320754a787416e749db9c460f8a181a4da1107"},{"author":{"_account_id":27582,"name":"Simon Westphahl","email":"simon.westphahl@bmw.de","username":"simon.westphahl"},"change_message_id":"a97fe0a664f01e4617fde8fe6ca4010ad185292a","unresolved":false,"context_lines":[{"line_number":1656,"context_line":"                            # This is a team without proper permissions, GitHub"},{"line_number":1657,"context_line":"                            # disregards the team. Emit a warning to ease"},{"line_number":1658,"context_line":"                            # debugging in this case."},{"line_number":1659,"context_line":"                            log.warning(\u0027Team %s/%s is requested by \u0027"},{"line_number":1660,"context_line":"                                        \u0027codeowners file but has no proper \u0027"},{"line_number":1661,"context_line":"                                        \u0027permissions on the repo\u0027)"},{"line_number":1662,"context_line":"                            continue"}],"source_content_type":"text/x-python","patch_set":31,"id":"7faddb67_a7274012","line":1659,"updated":"2019-09-04 08:12:57.000000000","message":"Format args are missing (team_org, team_name?) for this log line","commit_id":"d6320754a787416e749db9c460f8a181a4da1107"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"9592259b2d23f7a7266e1e842d2348fcfdf44ac2","unresolved":false,"context_lines":[{"line_number":1656,"context_line":"                            # This is a team without proper permissions, GitHub"},{"line_number":1657,"context_line":"                            # disregards the team. Emit a warning to ease"},{"line_number":1658,"context_line":"                            # debugging in this case."},{"line_number":1659,"context_line":"                            log.warning(\u0027Team %s/%s is requested by \u0027"},{"line_number":1660,"context_line":"                                        \u0027codeowners file but has no proper \u0027"},{"line_number":1661,"context_line":"                                        \u0027permissions on the repo\u0027)"},{"line_number":1662,"context_line":"                            continue"}],"source_content_type":"text/x-python","patch_set":31,"id":"7faddb67_38d3713a","line":1659,"in_reply_to":"7faddb67_a7274012","updated":"2019-09-04 10:56:09.000000000","message":"Yes found that too. Caused me a bit headache last 2 days :) Fix will come soon.","commit_id":"d6320754a787416e749db9c460f8a181a4da1107"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"23070c6913ebb4d8e074859ee96b6c5e8e9dfb96","unresolved":false,"context_lines":[{"line_number":200,"context_line":"# convenient than the values Github expects. Having in mind that those comments"},{"line_number":201,"context_line":"# most probably come from various linters, \"info\", \"warning\" and \"error\""},{"line_number":202,"context_line":"# should be more general terms than \"notice\", \"warning\" and \"failure\"."},{"line_number":203,"context_line":"ANNOTATION_LEVELS \u003d {"},{"line_number":204,"context_line":"    \"info\": \"notice\","},{"line_number":205,"context_line":"    \"warning\": \"warning\","},{"line_number":206,"context_line":"    \"error\": \"failure\","}],"source_content_type":"text/x-python","patch_set":51,"id":"df33271e_c3bef8d2","line":203,"updated":"2020-04-08 14:47:55.000000000","message":"linters: E305 expected 2 blank lines after class or function definition, found 1","commit_id":"7367039e7495f9fd4e1ccaceaadeeed31ccfee2c"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"400396a6ce7526a5eaf52b963b5abd7d1e123382","unresolved":false,"context_lines":[{"line_number":200,"context_line":"# convenient than the values Github expects. Having in mind that those comments"},{"line_number":201,"context_line":"# most probably come from various linters, \"info\", \"warning\" and \"error\""},{"line_number":202,"context_line":"# should be more general terms than \"notice\", \"warning\" and \"failure\"."},{"line_number":203,"context_line":"ANNOTATION_LEVELS \u003d {"},{"line_number":204,"context_line":"    \"info\": \"notice\","},{"line_number":205,"context_line":"    \"warning\": \"warning\","},{"line_number":206,"context_line":"    \"error\": \"failure\","}],"source_content_type":"text/x-python","patch_set":53,"id":"bf51134e_61a1a5f7","line":203,"updated":"2020-07-10 18:04:53.000000000","message":"linters: E305 expected 2 blank lines after class or function definition, found 1","commit_id":"0e9950f12907df503fd31dab55134c6643a46198"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"d95ef5628aeb124b33c009379bc86818dcb80eda","unresolved":false,"context_lines":[{"line_number":200,"context_line":"# convenient than the values Github expects. Having in mind that those comments"},{"line_number":201,"context_line":"# most probably come from various linters, \"info\", \"warning\" and \"error\""},{"line_number":202,"context_line":"# should be more general terms than \"notice\", \"warning\" and \"failure\"."},{"line_number":203,"context_line":"ANNOTATION_LEVELS \u003d {"},{"line_number":204,"context_line":"    \"info\": \"notice\","},{"line_number":205,"context_line":"    \"warning\": \"warning\","},{"line_number":206,"context_line":"    \"error\": \"failure\","}],"source_content_type":"text/x-python","patch_set":54,"id":"bf51134e_ab238fa6","line":203,"updated":"2020-07-13 09:21:49.000000000","message":"linters: E305 expected 2 blank lines after class or function definition, found 1","commit_id":"703ff6aa5dd374139f788da4460fa9da2e1ebd6c"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"985bac46eb941a0a217e8f36c7dbf100fe69d829","unresolved":false,"context_lines":[{"line_number":200,"context_line":"# convenient than the values Github expects. Having in mind that those comments"},{"line_number":201,"context_line":"# most probably come from various linters, \"info\", \"warning\" and \"error\""},{"line_number":202,"context_line":"# should be more general terms than \"notice\", \"warning\" and \"failure\"."},{"line_number":203,"context_line":"ANNOTATION_LEVELS \u003d {"},{"line_number":204,"context_line":"    \"info\": \"notice\","},{"line_number":205,"context_line":"    \"warning\": \"warning\","},{"line_number":206,"context_line":"    \"error\": \"failure\","}],"source_content_type":"text/x-python","patch_set":55,"id":"9f560f44_038844c4","line":203,"updated":"2020-07-27 12:34:46.000000000","message":"linters: E305 expected 2 blank lines after class or function definition, found 1","commit_id":"cdbc1b97881180bca2a64e1e561b110a291f7bb5"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3e4baedb3a41d080a1a7d59bf26e3e2136714e2e","unresolved":false,"context_lines":[{"line_number":200,"context_line":"# convenient than the values Github expects. Having in mind that those comments"},{"line_number":201,"context_line":"# most probably come from various linters, \"info\", \"warning\" and \"error\""},{"line_number":202,"context_line":"# should be more general terms than \"notice\", \"warning\" and \"failure\"."},{"line_number":203,"context_line":"ANNOTATION_LEVELS \u003d {"},{"line_number":204,"context_line":"    \"info\": \"notice\","},{"line_number":205,"context_line":"    \"warning\": \"warning\","},{"line_number":206,"context_line":"    \"error\": \"failure\","}],"source_content_type":"text/x-python","patch_set":56,"id":"9f560f44_35e65918","line":203,"updated":"2020-07-27 14:45:35.000000000","message":"linters: E305 expected 2 blank lines after class or function definition, found 1","commit_id":"46014186b83f57d6cdb6b3fca67dad9b7c280df6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3cf396d3ca9b084cc8e35583f7012bccb2470db4","unresolved":false,"context_lines":[{"line_number":200,"context_line":"# convenient than the values Github expects. Having in mind that those comments"},{"line_number":201,"context_line":"# most probably come from various linters, \"info\", \"warning\" and \"error\""},{"line_number":202,"context_line":"# should be more general terms than \"notice\", \"warning\" and \"failure\"."},{"line_number":203,"context_line":"ANNOTATION_LEVELS \u003d {"},{"line_number":204,"context_line":"    \"info\": \"notice\","},{"line_number":205,"context_line":"    \"warning\": \"warning\","},{"line_number":206,"context_line":"    \"error\": \"failure\","}],"source_content_type":"text/x-python","patch_set":57,"id":"9f560f44_66b8292a","line":203,"updated":"2020-07-27 17:01:39.000000000","message":"linters: E305 expected 2 blank lines after class or function definition, found 1","commit_id":"19252dddb51ddacf06809dc1468acce1640b982d"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f7ea8038706730780b0d1caea2c417064013d378","unresolved":false,"context_lines":[{"line_number":200,"context_line":"# convenient than the values Github expects. Having in mind that those comments"},{"line_number":201,"context_line":"# most probably come from various linters, \"info\", \"warning\" and \"error\""},{"line_number":202,"context_line":"# should be more general terms than \"notice\", \"warning\" and \"failure\"."},{"line_number":203,"context_line":"ANNOTATION_LEVELS \u003d {"},{"line_number":204,"context_line":"    \"info\": \"notice\","},{"line_number":205,"context_line":"    \"warning\": \"warning\","},{"line_number":206,"context_line":"    \"error\": \"failure\","}],"source_content_type":"text/x-python","patch_set":59,"id":"9f560f44_c2d4784a","line":203,"updated":"2020-08-31 11:09:20.000000000","message":"linters: E305 expected 2 blank lines after class or function definition, found 1","commit_id":"7dcc69c9f36153af8830718318784e555e046786"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3543cd0d63f79d101b8ff46c8f9784654034f1bc","unresolved":false,"context_lines":[{"line_number":200,"context_line":"# convenient than the values Github expects. Having in mind that those comments"},{"line_number":201,"context_line":"# most probably come from various linters, \"info\", \"warning\" and \"error\""},{"line_number":202,"context_line":"# should be more general terms than \"notice\", \"warning\" and \"failure\"."},{"line_number":203,"context_line":"ANNOTATION_LEVELS \u003d {"},{"line_number":204,"context_line":"    \"info\": \"notice\","},{"line_number":205,"context_line":"    \"warning\": \"warning\","},{"line_number":206,"context_line":"    \"error\": \"failure\","}],"source_content_type":"text/x-python","patch_set":60,"id":"9f560f44_8d8d91d5","line":203,"updated":"2020-08-31 12:55:46.000000000","message":"linters: E305 expected 2 blank lines after class or function definition, found 1","commit_id":"d519212cb9a440a3740dc3f7400faf022b11190d"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"d59f36992057e553e4f432eaa5d615e3b35c8ece","unresolved":false,"context_lines":[{"line_number":200,"context_line":"# convenient than the values Github expects. Having in mind that those comments"},{"line_number":201,"context_line":"# most probably come from various linters, \"info\", \"warning\" and \"error\""},{"line_number":202,"context_line":"# should be more general terms than \"notice\", \"warning\" and \"failure\"."},{"line_number":203,"context_line":"ANNOTATION_LEVELS \u003d {"},{"line_number":204,"context_line":"    \"info\": \"notice\","},{"line_number":205,"context_line":"    \"warning\": \"warning\","},{"line_number":206,"context_line":"    \"error\": \"failure\","}],"source_content_type":"text/x-python","patch_set":61,"id":"9f560f44_46988574","line":203,"updated":"2020-09-15 11:16:43.000000000","message":"linters: E305 expected 2 blank lines after class or function definition, found 1","commit_id":"e6adab7a2a62f1b44e1c244d170ae432d6454671"}]}
