)]}'
{".gitignore":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"efcbb2c9f724507eb125a1de5a04ff70b92fb6c3","unresolved":false,"context_lines":[{"line_number":18,"context_line":"python_heatclient.egg-info"},{"line_number":19,"context_line":"*.log"},{"line_number":20,"context_line":".testrepository"},{"line_number":21,"context_line":".pydevproject"},{"line_number":22,"context_line":".project"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"AAAATn%2F95P4%3D","line":21,"updated":"2013-12-04 21:26:27.000000000","message":"Please remove these, they are unrelated to this change","commit_id":"a0f811e20db6f2f65a0cd11702fed227d01c659c"}],"/COMMIT_MSG":[{"author":{"_account_id":2834,"name":"Steven Dake","email":"steven.dake@gmail.com","username":"sdake"},"change_message_id":"b7071d992701dec50a1f32870a1cad9daec9ab78","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"backward support for grizzly"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Set X-Auth-User, X-Auth-Key on all stack cmds to support grizzly. Since heat api version is not updated since grizzly, the client should backforward support."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Closes-Bug:1250731"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F%2FAMs%3D","line":9,"updated":"2013-11-15 21:11:20.000000000","message":"79 character limit on commit messages.  Could you wrap this?  Tx","commit_id":"e333be5fd41f3151b8857dc7b7a9f326a61042c2"}],"heatclient/common/http.py":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"233fdfd7420ad64402b996d8aeac78894ea1a52f","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        body_str \u003d \u0027\u0027.join([chunk for chunk in body_iter])"},{"line_number":163,"context_line":"        self.log_http_response(resp, body_str)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        if resp.status \u003d\u003d 500 and \"(HTTP 401)\" in body_str:"},{"line_number":166,"context_line":"            raise exc.HTTPUnauthorized(\"Authentication failed. Please try a\" +"},{"line_number":167,"context_line":"                                       \"gain with option --include-password\")"},{"line_number":168,"context_line":"        elif 400 \u003c\u003d resp.status \u003c 600:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Bvl0%3D","line":165,"updated":"2013-11-20 19:34:45.000000000","message":"There are a couple of problems here:\n* it is masking the actual message in the exception\n* the \"try again with --include-password\" is being suggested even when --include-password has been included\n\nThis should append \"try again ...\" to the existing exception message, and only when no password was set in the headers.\n\nSo this conditional should be:\n\nif not \u0027X-Auth-Key\u0027 in kwargs[\u0027headers\u0027] and (resp.status \u003d\u003d 401 or (resp.status \u003d\u003d 500 and \"(HTTP 401)\" in body_str)):","commit_id":"e3b6f6551cc409e0b93f676ec0b8a5e2c03da98b"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"a091310bda958855891a391dac61d79c14b2713f","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        if resp.status \u003d\u003d 500 and \"(HTTP 401)\" in body_str:"},{"line_number":166,"context_line":"            raise exc.HTTPUnauthorized(\"Authentication failed. Please try a\" +"},{"line_number":167,"context_line":"                                       \"gain with option --include-password\")"},{"line_number":168,"context_line":"        elif 400 \u003c\u003d resp.status \u003c 600:"},{"line_number":169,"context_line":"            raise exc.from_response(resp, body_str)"},{"line_number":170,"context_line":"        elif resp.status in (301, 302, 305):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Bvuk%3D","line":167,"updated":"2013-11-20 18:55:01.000000000","message":"You don\u0027t need the + there. Adjacent strings are automatically concatenated. That said, I would suggest not chopping again like that, and just wrapping the whole word. Chopping it makes the words in the error hard to find and hard to read.","commit_id":"e3b6f6551cc409e0b93f676ec0b8a5e2c03da98b"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"fbba9746a9dd2c2090d60d5a2e6e176872f2380a","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                (resp.status \u003d\u003d 500 and \"(HTTP 401)\" in body_str)):"},{"line_number":168,"context_line":"            raise exc.HTTPUnauthorized(\"Authentication failed. Please try\""},{"line_number":169,"context_line":"                                       \" again with option \""},{"line_number":170,"context_line":"                                       \"--include-password\\n %s\""},{"line_number":171,"context_line":"                                       % body_str)"},{"line_number":172,"context_line":"        elif 400 \u003c\u003d resp.status \u003c 600:"},{"line_number":173,"context_line":"            raise exc.from_response(resp, body_str)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BuYQ%3D","line":170,"updated":"2013-11-21 02:33:38.000000000","message":"\"--include-password\\n %s\" % body_str\n\nseemly we should remove the blank space char before %s, or there will be a leading blank space char.","commit_id":"ee2093b05cddd302d389451754ec34b52898a99e"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"bc9d844e39a2162cf4bda19afeb4f1494e7fbc63","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        if not \u0027X-Auth-Key\u0027 in kwargs[\u0027headers\u0027] and \\"},{"line_number":166,"context_line":"                (resp.status \u003d\u003d 401 or"},{"line_number":167,"context_line":"                (resp.status \u003d\u003d 500 and \"(HTTP 401)\" in body_str)):"},{"line_number":168,"context_line":"            raise exc.HTTPUnauthorized(\"Authentication failed. Please try\""},{"line_number":169,"context_line":"                                       \" again with option \""},{"line_number":170,"context_line":"                                       \"--include-password\\n%s\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BVKg%3D","line":167,"updated":"2013-11-27 10:13:58.000000000","message":"I\u0027m not sure about catching 500 here - a 500 response from heat means we have an internal bug, and in this case it probably means we should be catching a Forbidden exception somewhere and turning it into a 401 response from our API.  \n\nThis will disguise these bugs which will make it less likely that we fix them, so IMO we should only catch 401 here.","commit_id":"4b1eccb8011c521aa6e18da871d1da1503a35e66"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"395dfc6d71ddcf36424d2fe7f6f112ffe2fc24cb","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        if not \u0027X-Auth-Key\u0027 in kwargs[\u0027headers\u0027] and \\"},{"line_number":166,"context_line":"                (resp.status \u003d\u003d 401 or"},{"line_number":167,"context_line":"                (resp.status \u003d\u003d 500 and \"(HTTP 401)\" in body_str)):"},{"line_number":168,"context_line":"            raise exc.HTTPUnauthorized(\"Authentication failed. Please try\""},{"line_number":169,"context_line":"                                       \" again with option \""},{"line_number":170,"context_line":"                                       \"--include-password\\n%s\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BQOg%3D","line":167,"in_reply_to":"AAAATn%2F%2BR0A%3D","updated":"2013-11-28 09:55:52.000000000","message":"Uh, wouldn\u0027t it be best to backport a fix for that then, rather than papering over the issue in the client?  500 is never the right response, so IMO we shouldn\u0027t hide it.","commit_id":"4b1eccb8011c521aa6e18da871d1da1503a35e66"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"3cc7cb10ce567260ea6e620a75c4fa36425f9869","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        if not \u0027X-Auth-Key\u0027 in kwargs[\u0027headers\u0027] and \\"},{"line_number":166,"context_line":"                (resp.status \u003d\u003d 401 or"},{"line_number":167,"context_line":"                (resp.status \u003d\u003d 500 and \"(HTTP 401)\" in body_str)):"},{"line_number":168,"context_line":"            raise exc.HTTPUnauthorized(\"Authentication failed. Please try\""},{"line_number":169,"context_line":"                                       \" again with option \""},{"line_number":170,"context_line":"                                       \"--include-password\\n%s\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BR0A%3D","line":167,"in_reply_to":"AAAATn%2F%2BVKg%3D","updated":"2013-11-27 23:32:43.000000000","message":"shardy, I suspect there is a bug in grizzly heat which returns code 500 but includes string \"(HTTP 401)\" on auth failure.\n\nAlso checking for \"(HTTP 401)\" should prevent problems with real 500s.","commit_id":"4b1eccb8011c521aa6e18da871d1da1503a35e66"}],"heatclient/shell.py":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"233fdfd7420ad64402b996d8aeac78894ea1a52f","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                            action\u003d\u0027store_true\u0027,"},{"line_number":183,"context_line":"                            help\u003d\u0027Send os-username and os-password to heat\u0027)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        parser.add_argument(\u0027--include_password\u0027,"},{"line_number":186,"context_line":"                            help\u003dargparse.SUPPRESS)"},{"line_number":187,"context_line":"        return parser"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Bvlo%3D","line":185,"updated":"2013-11-20 19:34:45.000000000","message":"no need for this, the underscore options are legacy options","commit_id":"e3b6f6551cc409e0b93f676ec0b8a5e2c03da98b"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"bc9d844e39a2162cf4bda19afeb4f1494e7fbc63","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                            help\u003dargparse.SUPPRESS)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        parser.add_argument(\u0027--include-password\u0027,"},{"line_number":181,"context_line":"                            default\u003dFalse,"},{"line_number":182,"context_line":"                            action\u003d\u0027store_true\u0027,"},{"line_number":183,"context_line":"                            help\u003d\u0027Send os-username and os-password to heat\u0027)"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BVJo%3D","line":181,"updated":"2013-11-27 10:13:58.000000000","message":"We probably want to default this to an environment variable, like most of the other auth related arguments. HEAT_INCLUDE_PASSWORD?","commit_id":"4b1eccb8011c521aa6e18da871d1da1503a35e66"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"3cc7cb10ce567260ea6e620a75c4fa36425f9869","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                            help\u003dargparse.SUPPRESS)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        parser.add_argument(\u0027--include-password\u0027,"},{"line_number":181,"context_line":"                            default\u003dFalse,"},{"line_number":182,"context_line":"                            action\u003d\u0027store_true\u0027,"},{"line_number":183,"context_line":"                            help\u003d\u0027Send os-username and os-password to heat\u0027)"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BRzo%3D","line":181,"in_reply_to":"AAAATn%2F%2BVJo%3D","updated":"2013-11-27 23:32:43.000000000","message":"yes please","commit_id":"4b1eccb8011c521aa6e18da871d1da1503a35e66"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"efcbb2c9f724507eb125a1de5a04ff70b92fb6c3","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        parser.add_argument(\u0027--os_endpoint_type\u0027,"},{"line_number":177,"context_line":"                            help\u003dargparse.SUPPRESS)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        parser.add_argument(\u0027-t\u0027, \u0027--token-only\u0027,"},{"line_number":180,"context_line":"                            default\u003dbool(False),"},{"line_number":181,"context_line":"                            action\u003d\u0027store_true\u0027,"},{"line_number":182,"context_line":"                            help\u003dargparse.SUPPRESS)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F95NA%3D","line":179,"updated":"2013-12-04 21:26:27.000000000","message":"maybe a comment here explaining why this unused option shouldn\u0027t be deleted would be good.","commit_id":"a0f811e20db6f2f65a0cd11702fed227d01c659c"}],"heatclient/tests/test_common_http.py":[{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"a091310bda958855891a391dac61d79c14b2713f","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        self.m.ReplayAll()"},{"line_number":141,"context_line":"        client \u003d http.HTTPClient(\u0027http://example.com:8004\u0027)"},{"line_number":142,"context_line":"        resp, body \u003d client.raw_request(\u0027GET\u0027, \u0027\u0027)"},{"line_number":143,"context_line":"        self.assertEqual(resp.status, 200)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        client.username \u003d \u0027user\u0027"},{"line_number":146,"context_line":"        client.password \u003d \u0027pass\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BvuI%3D","line":143,"updated":"2013-11-20 18:55:01.000000000","message":"assertEqual defines the first argument as \u0027expected\u0027 and the second as \u0027observed\u0027, so please switch the order on any asserts like the one above (seems all of them are backwards).","commit_id":"e3b6f6551cc409e0b93f676ec0b8a5e2c03da98b"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"a091310bda958855891a391dac61d79c14b2713f","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            self.fail(\u0027No exception raised\u0027)"},{"line_number":177,"context_line":"        except exc.HTTPUnauthorized as e:"},{"line_number":178,"context_line":"            # Assert that the raised exception can be converted to string"},{"line_number":179,"context_line":"            self.assertIn(\"include-password\", e.message)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def test_region_name(self):"},{"line_number":182,"context_line":"        # Record a 200"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Bvt8%3D","line":179,"updated":"2013-11-20 18:55:01.000000000","message":"testtools extends assertRaises so that it returns the exception raised, so you can just use\n\n    e \u003d self.assertRaises(exc.HTTPUnauthorized, client.raw_request(\u0027GET\u0027, \u0027\u0027)\n    self.assertIn(\u0027include-password\u0027, e.message)","commit_id":"e3b6f6551cc409e0b93f676ec0b8a5e2c03da98b"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"a2b74c59c1a98701b6422fef8364041441446be1","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        client \u003d http.HTTPClient(\u0027http://example.com:8004\u0027)"},{"line_number":174,"context_line":"        e \u003d self.assertRaises(exc.HTTPUnauthorized,"},{"line_number":175,"context_line":"                              client.raw_request, \u0027GET\u0027, \u0027\u0027)"},{"line_number":176,"context_line":"        self.assertIn(\u0027include-password\u0027, e.message)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def test_region_name(self):"},{"line_number":179,"context_line":"        # Record a 200"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BuZ0%3D","line":176,"updated":"2013-11-21 02:28:14.000000000","message":"Suggest you use:\nself.assertIn(\u0027include-password\u0027, str(e))\n\naccess e.message directly will not be support in python 3.","commit_id":"ee2093b05cddd302d389451754ec34b52898a99e"}]}
