)]}'
{"doc/source/admin/drivers/bitbucket.rst":[{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"8f582e343b821fd8bd643652a0d88ac94c8756e3","unresolved":false,"context_lines":[{"line_number":7,"context_line":""},{"line_number":8,"context_line":"The Bitbucket Server driver supports sources. It is primarily intended"},{"line_number":9,"context_line":"to interact with Bitbucket Server instances, i.e. not useful for the"},{"line_number":10,"context_line":"Bitbucket Cloud offering."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Configure Bitbucket Server"},{"line_number":13,"context_line":"--------------------------"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dfbec78f_2a2cd200","line":10,"updated":"2019-05-09 17:04:52.000000000","message":"Is that something that we can change easily, or are they somehow fundamentally different from one another? It might be good to call out the TODO\u0027s to make it happen so somebody else can pick it up.","commit_id":"98e27fecdc0e5f1e85514c905ecaa3babef39599"},{"author":{"_account_id":30404,"name":"Mark Meyer","email":"mark@ofosos.org","username":"ofosos"},"change_message_id":"a3bd5f8fb0a14dbc583d493abe5233f8cefaa064","unresolved":false,"context_lines":[{"line_number":7,"context_line":""},{"line_number":8,"context_line":"The Bitbucket Server driver supports sources. It is primarily intended"},{"line_number":9,"context_line":"to interact with Bitbucket Server instances, i.e. not useful for the"},{"line_number":10,"context_line":"Bitbucket Cloud offering."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Configure Bitbucket Server"},{"line_number":13,"context_line":"--------------------------"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dfbec78f_47f9f34a","line":10,"in_reply_to":"dfbec78f_2a2cd200","updated":"2019-05-10 08:40:31.000000000","message":"I didn\u0027t look into it. In general Bitbucket Cloud is quite more modern.","commit_id":"98e27fecdc0e5f1e85514c905ecaa3babef39599"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"8f582e343b821fd8bd643652a0d88ac94c8756e3","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"  .. attr:: server_git_port"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    Port of the git protocal of the server (default 5999)."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"  .. attr:: server_rest_port"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"dfbec78f_4a2fc6f5","line":43,"updated":"2019-05-09 17:04:52.000000000","message":"Does it actually use the raw git protocol? That thing is actually pretty insecure. I\u0027d hope it could do everything over https or ssh.","commit_id":"98e27fecdc0e5f1e85514c905ecaa3babef39599"},{"author":{"_account_id":30404,"name":"Mark Meyer","email":"mark@ofosos.org","username":"ofosos"},"change_message_id":"a3bd5f8fb0a14dbc583d493abe5233f8cefaa064","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"  .. attr:: server_git_port"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    Port of the git protocal of the server (default 5999)."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"  .. attr:: server_rest_port"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"dfbec78f_e79587e5","line":43,"in_reply_to":"dfbec78f_4a2fc6f5","updated":"2019-05-10 08:40:31.000000000","message":"No, I usually just enter an ssh:// url into this variable.","commit_id":"98e27fecdc0e5f1e85514c905ecaa3babef39599"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"8f582e343b821fd8bd643652a0d88ac94c8756e3","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"  .. attr:: server_rest_port"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    Port of the REAST API of the server (default 443)."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"  .. attr:: server_user"},{"line_number":50,"context_line":"    :required:"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dfbec78f_ea355a47","line":47,"updated":"2019-05-09 17:04:52.000000000","message":"s/REAST/REST/","commit_id":"98e27fecdc0e5f1e85514c905ecaa3babef39599"},{"author":{"_account_id":30404,"name":"Mark Meyer","email":"mark@ofosos.org","username":"ofosos"},"change_message_id":"a3bd5f8fb0a14dbc583d493abe5233f8cefaa064","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"  .. attr:: server_rest_port"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    Port of the REAST API of the server (default 443)."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"  .. attr:: server_user"},{"line_number":50,"context_line":"    :required:"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dfbec78f_0799bb1d","line":47,"in_reply_to":"dfbec78f_ea355a47","updated":"2019-05-10 08:40:31.000000000","message":"Done","commit_id":"98e27fecdc0e5f1e85514c905ecaa3babef39599"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"318379af8d7ee48f2e6ed1afdfcf19893c359066","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    Hostname of the Bitbucket Server instance."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"  .. attr:: server_git_port"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    Port of the ssh/git protocal of the server (default 5999)."},{"line_number":44,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"dfbec78f_51fbdf45","line":41,"range":{"start_line":41,"start_character":12,"end_line":41,"end_character":27},"updated":"2019-05-11 15:08:08.000000000","message":"The other drivers just use \u0027port\u0027 for this setting.","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":30404,"name":"Mark Meyer","email":"mark@ofosos.org","username":"ofosos"},"change_message_id":"ab4fbe2e3e611365d0a75df0612250afa6112c33","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    Hostname of the Bitbucket Server instance."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"  .. attr:: server_git_port"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    Port of the ssh/git protocal of the server (default 5999)."},{"line_number":44,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"dfbec78f_467b15f4","line":41,"range":{"start_line":41,"start_character":12,"end_line":41,"end_character":27},"in_reply_to":"dfbec78f_51fbdf45","updated":"2019-05-13 13:04:42.000000000","message":"Done","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"318379af8d7ee48f2e6ed1afdfcf19893c359066","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    Port of the ssh/git protocal of the server (default 5999)."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"  .. attr:: server_rest_port"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    Port of the REST API of the server (default 443)."},{"line_number":48,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"dfbec78f_71f86348","line":45,"range":{"start_line":45,"start_character":12,"end_line":45,"end_character":28},"updated":"2019-05-11 15:08:08.000000000","message":"What do you think about setting a baseurl like the other drivers instead of defining the port of the rest api. That would encode also the protocol in it.","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":30404,"name":"Mark Meyer","email":"mark@ofosos.org","username":"ofosos"},"change_message_id":"ab4fbe2e3e611365d0a75df0612250afa6112c33","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    Port of the ssh/git protocal of the server (default 5999)."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"  .. attr:: server_rest_port"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    Port of the REST API of the server (default 443)."},{"line_number":48,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"dfbec78f_668099c1","line":45,"range":{"start_line":45,"start_character":12,"end_line":45,"end_character":28},"in_reply_to":"dfbec78f_71f86348","updated":"2019-05-13 13:04:42.000000000","message":"Done","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"318379af8d7ee48f2e6ed1afdfcf19893c359066","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    Port of the REST API of the server (default 443)."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"  .. attr:: server_user"},{"line_number":50,"context_line":"    :required:"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    Username to log in to the server."}],"source_content_type":"text/x-rst","patch_set":16,"id":"dfbec78f_d1e7cfab","line":49,"range":{"start_line":49,"start_character":12,"end_line":49,"end_character":23},"updated":"2019-05-11 15:08:08.000000000","message":"All the other drivers just use the terms \u0027user\u0027 and \u0027password\u0027. For consistency reasons we should stick to this terminology.","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":30404,"name":"Mark Meyer","email":"mark@ofosos.org","username":"ofosos"},"change_message_id":"ab4fbe2e3e611365d0a75df0612250afa6112c33","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    Port of the REST API of the server (default 443)."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"  .. attr:: server_user"},{"line_number":50,"context_line":"    :required:"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    Username to log in to the server."}],"source_content_type":"text/x-rst","patch_set":16,"id":"dfbec78f_06819dc3","line":49,"range":{"start_line":49,"start_character":12,"end_line":49,"end_character":23},"in_reply_to":"dfbec78f_d1e7cfab","updated":"2019-05-13 13:04:42.000000000","message":"Done","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"44c278f85dd1834c68514c1ee219298a5d235730","unresolved":false,"context_lines":[{"line_number":7,"context_line":""},{"line_number":8,"context_line":"The Bitbucket Server driver supports sources. It is primarily intended"},{"line_number":9,"context_line":"to interact with Bitbucket Server instances, i.e. not useful for the"},{"line_number":10,"context_line":"Bitbucket Cloud offering."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Configure Bitbucket Server"},{"line_number":13,"context_line":"--------------------------"}],"source_content_type":"text/x-rst","patch_set":22,"id":"9fb8cfa7_dc79bbc4","line":10,"updated":"2019-06-14 21:18:12.000000000","message":"This is correct in this patch, but is not updated in the later ones.  You may as well just drop the \"supports sources\" bit and write for the end state.","commit_id":"7b5490030b275714684317abd23cc35901fb9fa8"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"b5e3b6f0e0018108cff8527ed2845c73cf998e27","unresolved":false,"context_lines":[{"line_number":51,"context_line":"  .. attr:: password"},{"line_number":52,"context_line":"    :required:"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    Password for the user to log in to the server."}],"source_content_type":"text/x-rst","patch_set":23,"id":"7faddb67_f7098330","line":54,"updated":"2019-08-16 16:50:08.000000000","message":"If ssh is used for cloning (it is in the example above) we should add an option for the ssh key path here so that we don\u0027t have to assume it\u0027s ~/.ssh/id_rsa.  That way different sources can have different keys.","commit_id":"dc9b240161809ce65d20f5f7ca65485c50d172f0"}],"tests/bitbucket/mocks.py":[{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6a8954d73ace1676e36d1040c16ee081d34b339f","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"import json"},{"line_number":3,"context_line":"import unittest"},{"line_number":4,"context_line":"from zuul.driver.bitbucket.bitbucketconnection import BitbucketConnection"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfbec78f_b4728048","line":1,"updated":"2019-05-08 16:22:53.000000000","message":"IMO this file is full of stubs, not mocks. A minor point, but it may be confusing for some who expect sophisticated mocking to happen here. (And for the record, I prefer the stub approach you\u0027ve taken to mocking.","commit_id":"cf23ce210b0eb86a422627a9dab0c3ee37b67605"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6a8954d73ace1676e36d1040c16ee081d34b339f","unresolved":false,"context_lines":[{"line_number":4,"context_line":"from zuul.driver.bitbucket.bitbucketconnection import BitbucketConnection"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"class CommonConnectionTest(unittest.TestCase):"},{"line_number":7,"context_line":"\trealProject \u003d \u0027sys-ic/foobar\u0027"},{"line_number":8,"context_line":"\trealGitUrl \u003d \u0027ssh://git@bitbucket.glumfungl.net:59/sys-ic/foobar.git\u0027"},{"line_number":9,"context_line":"\trealWebUrl \u003d \u0027https://bitbucket.glumfungl.net/projects/SYS-IC/repos/foobar/browse\u0027"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"dfbec78f_548f8422","line":7,"updated":"2019-05-08 16:22:53.000000000","message":"I\u0027m sure you\u0027ll get a pep8 fail that tells you this, but just to be clear, we use spaces. You may want to configure your editor to do that on all python, as it\u0027s almost entirely unheard of to use tabs in python.","commit_id":"cf23ce210b0eb86a422627a9dab0c3ee37b67605"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6a8954d73ace1676e36d1040c16ee081d34b339f","unresolved":false,"context_lines":[{"line_number":5,"context_line":""},{"line_number":6,"context_line":"class CommonConnectionTest(unittest.TestCase):"},{"line_number":7,"context_line":"\trealProject \u003d \u0027sys-ic/foobar\u0027"},{"line_number":8,"context_line":"\trealGitUrl \u003d \u0027ssh://git@bitbucket.glumfungl.net:59/sys-ic/foobar.git\u0027"},{"line_number":9,"context_line":"\trealWebUrl \u003d \u0027https://bitbucket.glumfungl.net/projects/SYS-IC/repos/foobar/browse\u0027"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"\tdef _connection(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfbec78f_7492c84d","line":8,"updated":"2019-05-08 16:22:53.000000000","message":"Using semi-real domain names can cause problems. I suggest using .test as your tld here. There\u0027s a whole RFC for this: https://tools.ietf.org/html/rfc2606#section-2","commit_id":"cf23ce210b0eb86a422627a9dab0c3ee37b67605"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6a8954d73ace1676e36d1040c16ee081d34b339f","unresolved":false,"context_lines":[{"line_number":9,"context_line":"\trealWebUrl \u003d \u0027https://bitbucket.glumfungl.net/projects/SYS-IC/repos/foobar/browse\u0027"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"\tdef _connection(self):"},{"line_number":12,"context_line":"\t\tcon \u003d BitbucketConnection(None, \u0027tester\u0027, "},{"line_number":13,"context_line":"\t\t\t{\u0027server\u0027: \u0027bitbucket.glumfungl.net\u0027,"},{"line_number":14,"context_line":"\t\t\t \u0027server_git_port\u0027: 59,"},{"line_number":15,"context_line":"\t\t\t \u0027server_rest_port\u0027: 43,"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfbec78f_14990c6d","line":12,"updated":"2019-05-08 16:22:53.000000000","message":"trailing space","commit_id":"cf23ce210b0eb86a422627a9dab0c3ee37b67605"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6a8954d73ace1676e36d1040c16ee081d34b339f","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            \"author\": {"},{"line_number":106,"context_line":"                \"user\": {"},{"line_number":107,"context_line":"                    \"name\": \"tom\","},{"line_number":108,"context_line":"                    \"emailAddress\": \"tom@example.com\","},{"line_number":109,"context_line":"                    \"id\": 115026,"},{"line_number":110,"context_line":"                    \"displayName\": \"Tom\","},{"line_number":111,"context_line":"                    \"active\": true,"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfbec78f_349c505c","line":108,"updated":"2019-05-08 16:22:53.000000000","message":"Same with all the email addresses, don\u0027t use real tlds","commit_id":"cf23ce210b0eb86a422627a9dab0c3ee37b67605"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6a8954d73ace1676e36d1040c16ee081d34b339f","unresolved":false,"context_lines":[{"line_number":181,"context_line":"{"},{"line_number":182,"context_line":"    \"id\": 101,"},{"line_number":183,"context_line":"    \"version\": 1,"},{"line_number":184,"context_line":"    \"title\": \"Talking Nerdy\","},{"line_number":185,"context_line":"    \"description\": \"It’s a kludge, but put the tuple from the database in the cache.\","},{"line_number":186,"context_line":"    \"state\": \"OPEN\","},{"line_number":187,"context_line":"    \"open\": true,"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfbec78f_d4a2949a","line":184,"updated":"2019-05-08 16:22:53.000000000","message":"*DO* continue to talk nerdy to us.","commit_id":"cf23ce210b0eb86a422627a9dab0c3ee37b67605"}],"tests/bitbucket/testbitbucketconnection.py":[{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6a8954d73ace1676e36d1040c16ee081d34b339f","unresolved":false,"context_lines":[{"line_number":5,"context_line":"from tests.bitbucket.mocks import BitbucketClientMock, CommonConnectionTest"},{"line_number":6,"context_line":"from zuul.driver.bitbucket.bitbucketconnection import BitbucketClient, BitbucketConnection, BitbucketConnectionError"},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"class TestBitbucketClient(unittest.TestCase):"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"\tdef _broken_client(self):"},{"line_number":11,"context_line":"\t\tbc \u003d BitbucketClient(\"https://bitbucket.smaato.net\", 443)"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfbec78f_f49d5857","line":8,"updated":"2019-05-08 16:22:53.000000000","message":"We have a BaseTestCase which we want every test suite to use. Peek at the other tests to see it. There are others which add some helpful functionality you may need.","commit_id":"cf23ce210b0eb86a422627a9dab0c3ee37b67605"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6a8954d73ace1676e36d1040c16ee081d34b339f","unresolved":false,"context_lines":[{"line_number":8,"context_line":"class TestBitbucketClient(unittest.TestCase):"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"\tdef _broken_client(self):"},{"line_number":11,"context_line":"\t\tbc \u003d BitbucketClient(\"https://bitbucket.smaato.net\", 443)"},{"line_number":12,"context_line":"\t\tbc.setCredentials(\"mark\", \"foobar\")"},{"line_number":13,"context_line":"\t\treturn bc"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"dfbec78f_94ac1c8d","line":11,"updated":"2019-05-08 16:22:53.000000000","message":"smaato.net is your company, yes? This URL needs to be an environment variable too. Also it\u0027s weird that the client takes a port number when you can specify that in the URL.","commit_id":"cf23ce210b0eb86a422627a9dab0c3ee37b67605"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6a8954d73ace1676e36d1040c16ee081d34b339f","unresolved":false,"context_lines":[{"line_number":17,"context_line":"\t\tbc.setCredentials(environ[\u0027BITBUCKET_USER\u0027], environ[\u0027BITBUCKET_PASS\u0027])"},{"line_number":18,"context_line":"\t\treturn bc"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"\t@unittest.skipUnless(\u0027BITBUCKET_USER\u0027 in environ, True) "},{"line_number":21,"context_line":"\tdef test_authenticateFailed(self):"},{"line_number":22,"context_line":"\t\twith self.assertRaises(BitbucketConnectionError):"},{"line_number":23,"context_line":"\t\t\tbc \u003d self._broken_client()"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfbec78f_b4a7e0a7","line":20,"updated":"2019-05-08 16:22:53.000000000","message":"trailing space","commit_id":"cf23ce210b0eb86a422627a9dab0c3ee37b67605"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6a8954d73ace1676e36d1040c16ee081d34b339f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"class TestBitbucketConnection(CommonConnectionTest):"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"\t@patch(\u0027zuul.driver.bitbucket.bitbucketconnection.BitbucketClient\u0027, new\u003dBitbucketClientMock)"},{"line_number":40,"context_line":"\tdef test_getBitbucketClient(self):"},{"line_number":41,"context_line":"\t\tcon \u003d self._connection()"},{"line_number":42,"context_line":"\t\tclient \u003d con._getBitbucketClient()"},{"line_number":43,"context_line":"\t\tself.assertEqual(client.user, \u0027mark\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfbec78f_54b8e4c6","line":40,"updated":"2019-05-08 16:22:53.000000000","message":"@patch should pass the mocked client as a second arg here, so you shouldn\u0027t need to call the private _getBitbucketClient method to get it.","commit_id":"cf23ce210b0eb86a422627a9dab0c3ee37b67605"}],"tests/bitbucket/testbitbucketdriver.py":[{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"6a8954d73ace1676e36d1040c16ee081d34b339f","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"\tdef test_getConnection(self):"},{"line_number":21,"context_line":"\t\tdrv \u003d BitbucketDriver()"},{"line_number":22,"context_line":"\t\tself.assertIsInstance(drv.getConnection(\u0027foo\u0027, {}), BitbucketConnection)"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfbec78f_74bba8c3","line":22,"updated":"2019-05-08 16:22:53.000000000","message":"Oops, forgot the newline","commit_id":"cf23ce210b0eb86a422627a9dab0c3ee37b67605"}],"tests/unit/bitbucket/mocks.py":[{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"8f582e343b821fd8bd643652a0d88ac94c8756e3","unresolved":false,"context_lines":[{"line_number":14,"context_line":"        con \u003d BitbucketConnection(None, \u0027tester\u0027,"},{"line_number":15,"context_line":"                                  {\u0027server\u0027: \u0027bitbucket.glumfun.test\u0027,"},{"line_number":16,"context_line":"                                   \u0027server_git_port\u0027: 59,"},{"line_number":17,"context_line":"                                   \u0027server_rest_port\u0027: 43,"},{"line_number":18,"context_line":"                                   \u0027server_user\u0027: \u0027mark\u0027,"},{"line_number":19,"context_line":"                                   \u0027server_pass\u0027: \u0027foobar\u0027})"},{"line_number":20,"context_line":"        return con"}],"source_content_type":"text/x-python","patch_set":13,"id":"dfbec78f_0a39ce3f","line":17,"updated":"2019-05-09 17:04:52.000000000","message":"59 and 43? Is there some reason you chopped numbers off the defaults?","commit_id":"98e27fecdc0e5f1e85514c905ecaa3babef39599"},{"author":{"_account_id":30404,"name":"Mark Meyer","email":"mark@ofosos.org","username":"ofosos"},"change_message_id":"a3bd5f8fb0a14dbc583d493abe5233f8cefaa064","unresolved":false,"context_lines":[{"line_number":14,"context_line":"        con \u003d BitbucketConnection(None, \u0027tester\u0027,"},{"line_number":15,"context_line":"                                  {\u0027server\u0027: \u0027bitbucket.glumfun.test\u0027,"},{"line_number":16,"context_line":"                                   \u0027server_git_port\u0027: 59,"},{"line_number":17,"context_line":"                                   \u0027server_rest_port\u0027: 43,"},{"line_number":18,"context_line":"                                   \u0027server_user\u0027: \u0027mark\u0027,"},{"line_number":19,"context_line":"                                   \u0027server_pass\u0027: \u0027foobar\u0027})"},{"line_number":20,"context_line":"        return con"}],"source_content_type":"text/x-python","patch_set":13,"id":"dfbec78f_478ed3d0","line":17,"in_reply_to":"dfbec78f_0a39ce3f","updated":"2019-05-10 08:40:31.000000000","message":"This is intentional for testing purposes. I wanted to check that these values actually get moved into the config of the adapter. So I had to change them from the defaults. But I don\u0027t see where I check this...","commit_id":"98e27fecdc0e5f1e85514c905ecaa3babef39599"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"8f582e343b821fd8bd643652a0d88ac94c8756e3","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                        \"slug\": \"jcitizen\","},{"line_number":131,"context_line":"                        \"type\": \"NORMAL\""},{"line_number":132,"context_line":"                    },"},{"line_number":133,"context_line":"                    \"lastReviewedCommit\": \"7549846524f8aed2bd1c0249993\","},{"line_number":134,"context_line":"                    \"role\": \"REVIEWER\","},{"line_number":135,"context_line":"                    \"approved\": true,"},{"line_number":136,"context_line":"                    \"status\": \"APPROVED\""}],"source_content_type":"text/x-python","patch_set":13,"id":"dfbec78f_aa3f6223","line":133,"updated":"2019-05-09 17:04:52.000000000","message":"Isn\u0027t this a SHA? seems like it should be left at full length. You could set a variable to it before building this, and then make this a reference to that, if you\u0027re worried about it being unreadable.","commit_id":"98e27fecdc0e5f1e85514c905ecaa3babef39599"},{"author":{"_account_id":30404,"name":"Mark Meyer","email":"mark@ofosos.org","username":"ofosos"},"change_message_id":"c9cdad98b9fc001f046ff5bfb7cae3f6927b0ac3","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                        \"slug\": \"jcitizen\","},{"line_number":131,"context_line":"                        \"type\": \"NORMAL\""},{"line_number":132,"context_line":"                    },"},{"line_number":133,"context_line":"                    \"lastReviewedCommit\": \"7549846524f8aed2bd1c0249993\","},{"line_number":134,"context_line":"                    \"role\": \"REVIEWER\","},{"line_number":135,"context_line":"                    \"approved\": true,"},{"line_number":136,"context_line":"                    \"status\": \"APPROVED\""}],"source_content_type":"text/x-python","patch_set":13,"id":"dfbec78f_3a9dd2bb","line":133,"in_reply_to":"dfbec78f_aa3f6223","updated":"2019-05-13 13:18:45.000000000","message":"Done","commit_id":"98e27fecdc0e5f1e85514c905ecaa3babef39599"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"8f582e343b821fd8bd643652a0d88ac94c8756e3","unresolved":false,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":"                \u0027\u0027\u0027)"},{"line_number":182,"context_line":"        elif path \u003d\u003d\\"},{"line_number":183,"context_line":"                \u0027/rest/api/1.0/projects/sys-ic/repos/foobar/pull-requests/101\u0027:"},{"line_number":184,"context_line":"            return json.loads(\u0027\u0027\u0027"},{"line_number":185,"context_line":"{"},{"line_number":186,"context_line":"    \"id\": 101,"}],"source_content_type":"text/x-python","patch_set":13,"id":"dfbec78f_ca3ad632","line":183,"updated":"2019-05-09 17:04:52.000000000","message":"Another trick you can do is\n\n  os.path.join(\n    \u0027rest\u0027,\n    \u0027api\u0027,\n    \u00271.0\u0027,\n    \u0027projects\u0027,\n    \u0027sys-ic\u0027,\n    \u0027repos\u0027,\n    \u0027foobar\u0027,\n    \u0027pull-requests\u0027,\n    \u0027101\u0027\n  )\n\nBut I kinda like the full path all in one.","commit_id":"98e27fecdc0e5f1e85514c905ecaa3babef39599"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"8f582e343b821fd8bd643652a0d88ac94c8756e3","unresolved":false,"context_lines":[{"line_number":284,"context_line":"}"},{"line_number":285,"context_line":"                \u0027\u0027\u0027)"},{"line_number":286,"context_line":"        elif path \u003d\u003d\\"},{"line_number":287,"context_line":"                \u0027/rest/api/1.0/projects/sys-ic/repos/foobar/pull-requests/\u0027\\"},{"line_number":288,"context_line":"                \u0027101/merge\u0027:"},{"line_number":289,"context_line":"            return json.loads(\u0027\u0027\u0027"},{"line_number":290,"context_line":"{"}],"source_content_type":"text/x-python","patch_set":13,"id":"dfbec78f_6a496ace","line":287,"updated":"2019-05-09 17:04:52.000000000","message":"You can also span multiple lines with (). As long as there\u0027s no comma, it will just resolve to the value in the parens, and that allows splitting strings across lines:\n\n  elif path \u003d\u003d (\u0027/rest/api/1.0/projects/sys-ic/repos/foobar/pull-requests/\u0027\n                \u0027101/merge\u0027):","commit_id":"98e27fecdc0e5f1e85514c905ecaa3babef39599"},{"author":{"_account_id":30404,"name":"Mark Meyer","email":"mark@ofosos.org","username":"ofosos"},"change_message_id":"c9cdad98b9fc001f046ff5bfb7cae3f6927b0ac3","unresolved":false,"context_lines":[{"line_number":284,"context_line":"}"},{"line_number":285,"context_line":"                \u0027\u0027\u0027)"},{"line_number":286,"context_line":"        elif path \u003d\u003d\\"},{"line_number":287,"context_line":"                \u0027/rest/api/1.0/projects/sys-ic/repos/foobar/pull-requests/\u0027\\"},{"line_number":288,"context_line":"                \u0027101/merge\u0027:"},{"line_number":289,"context_line":"            return json.loads(\u0027\u0027\u0027"},{"line_number":290,"context_line":"{"}],"source_content_type":"text/x-python","patch_set":13,"id":"dfbec78f_faa2dafb","line":287,"in_reply_to":"dfbec78f_6a496ace","updated":"2019-05-13 13:18:45.000000000","message":"Cool, I\u0027ll leave it for now. Next time I may change it.","commit_id":"98e27fecdc0e5f1e85514c905ecaa3babef39599"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"318379af8d7ee48f2e6ed1afdfcf19893c359066","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"import json"},{"line_number":3,"context_line":"from zuul.driver.bitbucket.bitbucketconnection import BitbucketConnection"},{"line_number":4,"context_line":"from tests.base import BaseTestCase"}],"source_content_type":"text/x-python","patch_set":16,"id":"dfbec78f_1197a7ee","line":1,"updated":"2019-05-11 15:08:08.000000000","message":"Copyright header is missing","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":30404,"name":"Mark Meyer","email":"mark@ofosos.org","username":"ofosos"},"change_message_id":"ab4fbe2e3e611365d0a75df0612250afa6112c33","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"import json"},{"line_number":3,"context_line":"from zuul.driver.bitbucket.bitbucketconnection import BitbucketConnection"},{"line_number":4,"context_line":"from tests.base import BaseTestCase"}],"source_content_type":"text/x-python","patch_set":16,"id":"dfbec78f_066bddf0","line":1,"in_reply_to":"dfbec78f_1197a7ee","updated":"2019-05-13 13:04:42.000000000","message":"Done","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"318379af8d7ee48f2e6ed1afdfcf19893c359066","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        self.user \u003d user"},{"line_number":30,"context_line":"        self.pw \u003d pw"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def get(self, path):"},{"line_number":33,"context_line":"        if path \u003d\u003d \u0027/rest/api/1.0/projects/sys-ic/repos/foobar/branches\u0027:"},{"line_number":34,"context_line":"            return json.loads(\u0027\u0027\u0027"},{"line_number":35,"context_line":"{"}],"source_content_type":"text/x-python","patch_set":16,"id":"dfbec78f_51a99f21","line":32,"updated":"2019-05-11 15:08:08.000000000","message":"This is probably good for the source only driver but won\u0027t scale for tests as soon as gating is involved.\n\nThis will probably need a fake bitbucket data structure which will be used for generating the responses. The gerrit and github driver do something similar. But I think that can be improved iteratively when it\u0027s needed.","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":30404,"name":"Mark Meyer","email":"mark@ofosos.org","username":"ofosos"},"change_message_id":"dccda39cda2fb7c0f117831356a43546ec212631","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        self.user \u003d user"},{"line_number":30,"context_line":"        self.pw \u003d pw"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def get(self, path):"},{"line_number":33,"context_line":"        if path \u003d\u003d \u0027/rest/api/1.0/projects/sys-ic/repos/foobar/branches\u0027:"},{"line_number":34,"context_line":"            return json.loads(\u0027\u0027\u0027"},{"line_number":35,"context_line":"{"}],"source_content_type":"text/x-python","patch_set":16,"id":"dfbec78f_da6836ba","line":32,"in_reply_to":"dfbec78f_51a99f21","updated":"2019-05-13 13:17:13.000000000","message":"I pretty much agree, for this patch set it\u0027s all I need.","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"}],"tests/unit/bitbucket/testbitbucketconnection.py":[{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"318379af8d7ee48f2e6ed1afdfcf19893c359066","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import unittest"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"from os import environ"},{"line_number":4,"context_line":"from unittest.mock import patch"}],"source_content_type":"text/x-python","patch_set":16,"id":"dfbec78f_71a62356","line":1,"updated":"2019-05-11 15:08:08.000000000","message":"Copyright header is missing","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":30404,"name":"Mark Meyer","email":"mark@ofosos.org","username":"ofosos"},"change_message_id":"ab4fbe2e3e611365d0a75df0612250afa6112c33","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import unittest"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"from os import environ"},{"line_number":4,"context_line":"from unittest.mock import patch"}],"source_content_type":"text/x-python","patch_set":16,"id":"dfbec78f_e62329bc","line":1,"in_reply_to":"dfbec78f_71a62356","updated":"2019-05-13 13:04:42.000000000","message":"Done","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"318379af8d7ee48f2e6ed1afdfcf19893c359066","unresolved":false,"context_lines":[{"line_number":12,"context_line":"class TestBitbucketClient(BaseTestCase):"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    def _broken_client(self):"},{"line_number":15,"context_line":"        bc \u003d BitbucketClient(\"https://bitbucket.glumfun.test\", 443)"},{"line_number":16,"context_line":"        bc.setCredentials(\"mark\", \"foobar\")"},{"line_number":17,"context_line":"        return bc"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"dfbec78f_d1110f5f","line":15,"range":{"start_line":15,"start_character":30,"end_line":15,"end_character":61},"updated":"2019-05-11 15:08:08.000000000","message":"I have to second Clint that when using urls the port should be part of the url and not specified separetely.","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":30404,"name":"Mark Meyer","email":"mark@ofosos.org","username":"ofosos"},"change_message_id":"ab4fbe2e3e611365d0a75df0612250afa6112c33","unresolved":false,"context_lines":[{"line_number":12,"context_line":"class TestBitbucketClient(BaseTestCase):"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    def _broken_client(self):"},{"line_number":15,"context_line":"        bc \u003d BitbucketClient(\"https://bitbucket.glumfun.test\", 443)"},{"line_number":16,"context_line":"        bc.setCredentials(\"mark\", \"foobar\")"},{"line_number":17,"context_line":"        return bc"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"dfbec78f_c62625cf","line":15,"range":{"start_line":15,"start_character":30,"end_line":15,"end_character":61},"in_reply_to":"dfbec78f_d1110f5f","updated":"2019-05-13 13:04:42.000000000","message":"Done","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"318379af8d7ee48f2e6ed1afdfcf19893c359066","unresolved":false,"context_lines":[{"line_number":21,"context_line":"        bc.setCredentials(environ[\u0027BITBUCKET_USER\u0027], environ[\u0027BITBUCKET_PASS\u0027])"},{"line_number":22,"context_line":"        return bc"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    @unittest.skip"},{"line_number":25,"context_line":"    def test_authenticateFailed(self):"},{"line_number":26,"context_line":"        with self.assertRaises(BitbucketConnectionError):"},{"line_number":27,"context_line":"            bc \u003d self._broken_client()"}],"source_content_type":"text/x-python","patch_set":16,"id":"dfbec78f_1165671e","line":24,"range":{"start_line":24,"start_character":4,"end_line":24,"end_character":18},"updated":"2019-05-11 15:08:08.000000000","message":"What are the skips for?","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":30404,"name":"Mark Meyer","email":"mark@ofosos.org","username":"ofosos"},"change_message_id":"ab4fbe2e3e611365d0a75df0612250afa6112c33","unresolved":false,"context_lines":[{"line_number":21,"context_line":"        bc.setCredentials(environ[\u0027BITBUCKET_USER\u0027], environ[\u0027BITBUCKET_PASS\u0027])"},{"line_number":22,"context_line":"        return bc"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    @unittest.skip"},{"line_number":25,"context_line":"    def test_authenticateFailed(self):"},{"line_number":26,"context_line":"        with self.assertRaises(BitbucketConnectionError):"},{"line_number":27,"context_line":"            bc \u003d self._broken_client()"}],"source_content_type":"text/x-python","patch_set":16,"id":"dfbec78f_bf053448","line":24,"range":{"start_line":24,"start_character":4,"end_line":24,"end_character":18},"in_reply_to":"dfbec78f_1165671e","updated":"2019-05-13 13:04:42.000000000","message":"\u003e What are the skips for?\n\nYou need a Bitbucket server to run this. Originally these were conditional on having the variable BITBUCKET_SERVER set, but that broke tox for some weird reason.\n\nI would still like to conditionalize this test.","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"}],"zuul/driver/bitbucket/bitbucketconnection.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"9956c67d7182f7f34b8a26c26a5968817b5404a7","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.source \u003d BitbucketSource(driver, self)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        self.branches \u003d {}"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def _getBitbucketClient(self):"},{"line_number":73,"context_line":"        # authenticate, return client"}],"source_content_type":"text/x-python","patch_set":22,"id":"9fb8cfa7_676efc00","line":70,"updated":"2019-06-14 22:54:52.000000000","message":"You might consider setting a self.client here then you don\u0027t have to re request a new client object each time a client is needed. I think that will simplify things a bit in the code below.","commit_id":"7b5490030b275714684317abd23cc35901fb9fa8"}],"zuul/driver/bitbucket/bitbucketsource.py":[{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"a4fb1020ea872c6241b336246c97c57bee05e10e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        return []"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    change_re \u003d"},{"line_number":42,"context_line":"    re.compile(r\".*/projects/(.*?)/repos/(.*?)/pull-requests/(\\d+)[\\w]*\")"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def buildPR(self, project, repo, id):"},{"line_number":45,"context_line":"        pr \u003d self.connection.getPR(project, repo, id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"dfbec78f_f471d8df","line":42,"updated":"2019-05-08 16:40:02.000000000","message":"This regex will work fantastically well with re2, which is up to 40x faster than re, and already in zuul\u0027s requirements.\n\n  Python 3.6.7 (default, Oct 22 2018, 11:32:17) \n  [GCC 8.2.0] on linux\n  Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n  \u003e\u003e\u003e import re2\n  \u003e\u003e\u003e re2.compile(\".*/projects/(.*?)/repos/(.*?)/pull-requests/(\\d+)[\\w]*\")\n  \u003c_re2.RE2_Regexp object at 0x7f49a1595750\u003e\n  \u003e\u003e\u003e x \u003d re2.compile(\".*/projects/(.*?)/repos/(.*?)/pull-requests/(\\d+)[\\w]*\")\n  \u003e\u003e\u003e y \u003d x.match(\"/anything/projects/moar/repos/bah/pull-requests/99999\")\n  \u003e\u003e\u003e y\n  \u003c_re2.RE2_Match object at 0x7f49a15dfde0\u003e\n  \u003e\u003e\u003e dir(y)\n  [\u0027__class__\u0027, \u0027__delattr__\u0027, \u0027__dir__\u0027, \u0027__doc__\u0027, \u0027__eq__\u0027, \u0027__format__\u0027, \u0027__ge__\u0027, \u0027__getattribute__\u0027, \u0027__gt__\u0027, \u0027__hash__\u0027, \u0027__init__\u0027, \u0027__init_subclass__\u0027, \u0027__le__\u0027, \u0027__lt__\u0027, \u0027__ne__\u0027, \u0027__new__\u0027, \u0027__reduce__\u0027, \u0027__reduce_ex__\u0027, \u0027__repr__\u0027, \u0027__setattr__\u0027, \u0027__sizeof__\u0027, \u0027__str__\u0027, \u0027__subclasshook__\u0027, \u0027end\u0027, \u0027group\u0027, \u0027groupdict\u0027, \u0027groups\u0027, \u0027span\u0027, \u0027start\u0027]\n  \u003e\u003e\u003e y.groups\n  \u003cbuilt-in method groups of _re2.RE2_Match object at 0x7f49a15dfde0\u003e\n  \u003e\u003e\u003e list(y.groups)\n  Traceback (most recent call last):\n    File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n  TypeError: \u0027builtin_function_or_method\u0027 object is not iterable\n  \u003e\u003e\u003e y.groups()\n  (\u0027moar\u0027, \u0027bah\u0027, \u002799999\u0027)\n  \u003e\u003e\u003e","commit_id":"524803ee18aa1e7b6234a339b686012913135ae5"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"318379af8d7ee48f2e6ed1afdfcf19893c359066","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    def getChangesDependingOn(self, change, projects, tenant):"},{"line_number":39,"context_line":"        return []"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    change_re \u003d\\"},{"line_number":42,"context_line":"        re2.compile(r\".*/projects/(.*?)/repos/(.*?)/pull-requests/(\\d+)[\\w]*\")"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def buildPR(self, project, repo, id):"},{"line_number":45,"context_line":"        pr \u003d self.connection.getPR(project, repo, id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"dfbec78f_b1757bcd","line":42,"range":{"start_line":41,"start_character":0,"end_line":42,"end_character":78},"updated":"2019-05-11 15:08:08.000000000","message":"This class variable looks a little bit odd between the functions and should be moved above the function definitions.","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":30404,"name":"Mark Meyer","email":"mark@ofosos.org","username":"ofosos"},"change_message_id":"ab4fbe2e3e611365d0a75df0612250afa6112c33","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    def getChangesDependingOn(self, change, projects, tenant):"},{"line_number":39,"context_line":"        return []"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    change_re \u003d\\"},{"line_number":42,"context_line":"        re2.compile(r\".*/projects/(.*?)/repos/(.*?)/pull-requests/(\\d+)[\\w]*\")"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def buildPR(self, project, repo, id):"},{"line_number":45,"context_line":"        pr \u003d self.connection.getPR(project, repo, id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"dfbec78f_c66e252e","line":42,"range":{"start_line":41,"start_character":0,"end_line":42,"end_character":78},"in_reply_to":"dfbec78f_b1757bcd","updated":"2019-05-13 13:04:42.000000000","message":"Done","commit_id":"d4ab7bf26f015a76e7edd10fd67302f7f85f6b2f"},{"author":{"_account_id":8334,"name":"Noorul Islam K M","email":"noorul@noorul.com","username":"noorul"},"change_message_id":"2c554723f76e049328f606548fa8dbefef011425","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    def getChange(self, event):"},{"line_number":97,"context_line":"        raise NotImplementedError()"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def canMerge(self, change, allow_needs):"},{"line_number":100,"context_line":"        return self.connection.canMerge(change, allow_needs)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def isMerged(self, change, head):"}],"source_content_type":"text/x-python","patch_set":23,"id":"7faddb67_c52ed841","line":99,"updated":"2019-08-20 23:31:50.000000000","message":"Interface has changed in master","commit_id":"dc9b240161809ce65d20f5f7ca65485c50d172f0"}]}
