)]}'
{"nova/crypto.py":[{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"ec103a59cdd870d2bd19c5bab39c9407dd200cf4","unresolved":false,"context_lines":[{"line_number":5,"context_line":"# All Rights Reserved."},{"line_number":6,"context_line":"# Copyright 2011 NTT"},{"line_number":7,"context_line":"# All Rights Reserved."},{"line_number":8,"context_line":"# Copyright 2012 IBM"},{"line_number":9,"context_line":"#"},{"line_number":10,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":11,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2Fi2U%3D","line":8,"updated":"2012-09-01 00:23:59.000000000","message":"Chris -- normally we don\u0027t bump copyright statements for patches like this. If the change was a large re-factoring or a new file, then we would.","commit_id":"42534ab8666d137a0f15adae23168dd28f976505"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"ec103a59cdd870d2bd19c5bab39c9407dd200cf4","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def fetch_ca(project_id\u003dNone):"},{"line_number":100,"context_line":"    if not FLAGS.use_project_ca:"},{"line_number":101,"context_line":"        project_id \u003d None"},{"line_number":102,"context_line":"    try:"},{"line_number":103,"context_line":"        with open(ca_path(project_id), \u0027r\u0027) as cafile:"},{"line_number":104,"context_line":"            return cafile.read()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2Fi14%3D","line":101,"updated":"2012-09-01 00:23:59.000000000","message":"I\u0027d prefer to see an explicit file existence check here (and in the other examples):\n\n  ca_file_path \u003d ca_path(project_id)\n  if not os.path.exists(ca_file_path):\n    raise exception.CryptoFileNotFound(project_id\u003dproject_id)\n\nThen you don\u0027t need to catch the IO error below, because its a different error -- file permissions and so forth.","commit_id":"42534ab8666d137a0f15adae23168dd28f976505"}],"nova/exception.py":[{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"ec103a59cdd870d2bd19c5bab39c9407dd200cf4","unresolved":false,"context_lines":[{"line_number":5,"context_line":"# All Rights Reserved."},{"line_number":6,"context_line":"# Copyright 2011 NTT"},{"line_number":7,"context_line":"# All Rights Reserved."},{"line_number":8,"context_line":"# Copyright 2012 IBM"},{"line_number":9,"context_line":"#"},{"line_number":10,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":11,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2Fi2Q%3D","line":8,"updated":"2012-09-01 00:23:59.000000000","message":"Ditto on the copyright bump here.","commit_id":"42534ab8666d137a0f15adae23168dd28f976505"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"ec103a59cdd870d2bd19c5bab39c9407dd200cf4","unresolved":false,"context_lines":[{"line_number":1068,"context_line":"    \"\"\"Error in file operation.\"\"\""},{"line_number":1069,"context_line":"    def __init__(self, inner_exception\u003dNone):"},{"line_number":1070,"context_line":"        self.inner_exception \u003d inner_exception"},{"line_number":1071,"context_line":"        super(FileError, self).__init__(str(inner_exception))"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":""},{"line_number":1074,"context_line":"def get_context_from_function_and_args(function, args, kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2Fi2I%3D","line":1071,"updated":"2012-09-01 00:23:59.000000000","message":"I think I\u0027d prefer to see this as an exception which inherits from the FileNotFound exception above, but doesn\u0027t include the filename on the server. Something more like:\n\n  class CryptoFileNotFound(FileNotFound):\n    message \u003d _(\"The CA file for %(project)s could not be found\")","commit_id":"42534ab8666d137a0f15adae23168dd28f976505"}],"nova/tests/test_crypto.py":[{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"ec103a59cdd870d2bd19c5bab39c9407dd200cf4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2011 OpenStack LLC."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"# Copyright 2012 IBM"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2Fi10%3D","line":3,"updated":"2012-09-01 00:23:59.000000000","message":"Ditto for the copyright bump.","commit_id":"42534ab8666d137a0f15adae23168dd28f976505"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"ec103a59cdd870d2bd19c5bab39c9407dd200cf4","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            self.flags(use_project_ca\u003dTrue)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"            self.assertRaises(exception.FileError, crypto.fetch_ca,"},{"line_number":147,"context_line":"                              project_id\u003d\u0027fake\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALH%2F%2Fi1w%3D","line":147,"updated":"2012-09-01 00:23:59.000000000","message":"Thanks heaps for adding a unit test.","commit_id":"42534ab8666d137a0f15adae23168dd28f976505"}]}
