)]}'
{"swift/obj/server.py":[{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"354e2ba9b37f281874e54ff4cfcf446fabea393b","unresolved":false,"context_lines":[{"line_number":394,"context_line":"            if \u0027*\u0027 in request.if_none_match:"},{"line_number":395,"context_line":"                # File exists already so return 412"},{"line_number":396,"context_line":"                return HTTPPreconditionFailed(request\u003drequest)"},{"line_number":397,"context_line":"            if orig_metadata.get(\u0027ETag\u0027) in request.if_none_match:"},{"line_number":398,"context_line":"                # The current ETag matches, so return 412"},{"line_number":399,"context_line":"                return HTTPPreconditionFailed(request\u003drequest)"},{"line_number":400,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9t%2FY%3D","line":397,"updated":"2014-04-02 15:50:08.000000000","message":"I\u0027m probably missing something but I thought you weren\u0027t including an etag match capability, what am I reading wrong about this? (note this is marked partially covered in test coverage)","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"890037cf111c9ee865f17f2939a252472082b6ba","unresolved":false,"context_lines":[{"line_number":394,"context_line":"            if \u0027*\u0027 in request.if_none_match:"},{"line_number":395,"context_line":"                # File exists already so return 412"},{"line_number":396,"context_line":"                return HTTPPreconditionFailed(request\u003drequest)"},{"line_number":397,"context_line":"            if orig_metadata.get(\u0027ETag\u0027) in request.if_none_match:"},{"line_number":398,"context_line":"                # The current ETag matches, so return 412"},{"line_number":399,"context_line":"                return HTTPPreconditionFailed(request\u003drequest)"},{"line_number":400,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9tRE%3D","line":397,"updated":"2014-04-02 17:16:58.000000000","message":"ditto - is this in anticipation of supporting etags at some point?","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"40025df103c5719eead30d81484fa4c64daea500","unresolved":false,"context_lines":[{"line_number":394,"context_line":"            if \u0027*\u0027 in request.if_none_match:"},{"line_number":395,"context_line":"                # File exists already so return 412"},{"line_number":396,"context_line":"                return HTTPPreconditionFailed(request\u003drequest)"},{"line_number":397,"context_line":"            if orig_metadata.get(\u0027ETag\u0027) in request.if_none_match:"},{"line_number":398,"context_line":"                # The current ETag matches, so return 412"},{"line_number":399,"context_line":"                return HTTPPreconditionFailed(request\u003drequest)"},{"line_number":400,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9tKM%3D","line":397,"in_reply_to":"AAAAWH%2F9t%2FY%3D","updated":"2014-04-02 17:12:08.000000000","message":"The proxy is filtering the request (early) to prevent etag support, but here the object server still supports it. On the one hand, it\u0027s vestigial, but on the other it\u0027s available for when Chuck (or whomever) figures out how to do etag matching on if-none-match in the proxy.\n\nThe hard part of supporting it in the proxy is coordinating what happens with different responses from object servers. The object still can support it pretty simply (and it could be used internally even if not exposed in the API).","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"},{"author":{"_account_id":917,"name":"Chuck Thier","email":"cthier@gmail.com","username":"cthier"},"change_message_id":"55af33d9624dc7546ad3bad9da2c04b613120b77","unresolved":false,"context_lines":[{"line_number":394,"context_line":"            if \u0027*\u0027 in request.if_none_match:"},{"line_number":395,"context_line":"                # File exists already so return 412"},{"line_number":396,"context_line":"                return HTTPPreconditionFailed(request\u003drequest)"},{"line_number":397,"context_line":"            if orig_metadata.get(\u0027ETag\u0027) in request.if_none_match:"},{"line_number":398,"context_line":"                # The current ETag matches, so return 412"},{"line_number":399,"context_line":"                return HTTPPreconditionFailed(request\u003drequest)"},{"line_number":400,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9sas%3D","line":397,"in_reply_to":"AAAAWH%2F9tRE%3D","updated":"2014-04-02 18:43:31.000000000","message":"The hope is that somebody will figure this out at some point :)","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"d0519969be3e977ba01880de1b278e363e276430","unresolved":false,"context_lines":[{"line_number":659,"context_line":"        conns \u003d [conn for conn in pile if conn]"},{"line_number":660,"context_line":"        min_conns \u003d quorum_size(len(nodes))"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"        none_match \u003d req.headers.get(\u0027if-none-match\u0027)"},{"line_number":663,"context_line":"        if none_match is not None:"},{"line_number":664,"context_line":"            statuses \u003d [conn.resp.status for conn in conns if conn.resp]"},{"line_number":665,"context_line":"            if \u0027*\u0027 in none_match:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F99b0%3D","line":662,"updated":"2014-03-31 23:06:47.000000000","message":"Why pull the header directly when you have access to req.if_none_match? Is it because of the next line where you want to compare it to None? This seems different than the logic in the object server (where it is using .if_none_match).","commit_id":"fc6a2c55504aab3fe4f8a488092c148a36fd252b"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"d0519969be3e977ba01880de1b278e363e276430","unresolved":false,"context_lines":[{"line_number":661,"context_line":""},{"line_number":662,"context_line":"        none_match \u003d req.headers.get(\u0027if-none-match\u0027)"},{"line_number":663,"context_line":"        if none_match is not None:"},{"line_number":664,"context_line":"            statuses \u003d [conn.resp.status for conn in conns if conn.resp]"},{"line_number":665,"context_line":"            if \u0027*\u0027 in none_match:"},{"line_number":666,"context_line":"                if HTTP_PRECONDITION_FAILED in statuses:"},{"line_number":667,"context_line":"                    # If we find any copy of the file, it shouldn\u0027t be uploaded"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F99W0%3D","line":664,"updated":"2014-03-31 23:06:47.000000000","message":"No need to consume the statuses until we actually need them right? ie this can go inside the if \u0027*\u0027... conditional.","commit_id":"fc6a2c55504aab3fe4f8a488092c148a36fd252b"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"d0519969be3e977ba01880de1b278e363e276430","unresolved":false,"context_lines":[{"line_number":662,"context_line":"        none_match \u003d req.headers.get(\u0027if-none-match\u0027)"},{"line_number":663,"context_line":"        if none_match is not None:"},{"line_number":664,"context_line":"            statuses \u003d [conn.resp.status for conn in conns if conn.resp]"},{"line_number":665,"context_line":"            if \u0027*\u0027 in none_match:"},{"line_number":666,"context_line":"                if HTTP_PRECONDITION_FAILED in statuses:"},{"line_number":667,"context_line":"                    # If we find any copy of the file, it shouldn\u0027t be uploaded"},{"line_number":668,"context_line":"                    self.app.logger.debug("}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F99bs%3D","line":665,"updated":"2014-03-31 23:06:47.000000000","message":"I think this conditional would work for req.if_none_match because that compares it to the set of values passed in. But it seems that \"If-None-Match: foo*bar\" would pass here.","commit_id":"fc6a2c55504aab3fe4f8a488092c148a36fd252b"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"d0519969be3e977ba01880de1b278e363e276430","unresolved":false,"context_lines":[{"line_number":672,"context_line":"            else:"},{"line_number":673,"context_line":"                # Sending an etag with if-none-match isn\u0027t currently supported"},{"line_number":674,"context_line":"                return HTTPBadRequest(request\u003dreq, content_type\u003d\u0027text/plain\u0027,"},{"line_number":675,"context_line":"                                      body\u003d\u0027If-None-Match only supports *\u0027)"},{"line_number":676,"context_line":""},{"line_number":677,"context_line":"        if len(conns) \u003c min_conns:"},{"line_number":678,"context_line":"            self.app.logger.error("}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F99VY%3D","line":675,"updated":"2014-03-31 23:06:47.000000000","message":"This could go way up in the PUT method to avoid any backend requests at all.","commit_id":"fc6a2c55504aab3fe4f8a488092c148a36fd252b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"890037cf111c9ee865f17f2939a252472082b6ba","unresolved":false,"context_lines":[{"line_number":443,"context_line":"    @delay_denial"},{"line_number":444,"context_line":"    def PUT(self, req):"},{"line_number":445,"context_line":"        \"\"\"HTTP PUT request handler.\"\"\""},{"line_number":446,"context_line":"        if req.if_none_match is not None and \u0027*\u0027 not in req.if_none_match:"},{"line_number":447,"context_line":"            # Sending an etag with if-none-match isn\u0027t currently supported"},{"line_number":448,"context_line":"            return HTTPBadRequest(request\u003dreq, content_type\u003d\u0027text/plain\u0027,"},{"line_number":449,"context_line":"                                  body\u003d\u0027If-None-Match only supports *\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9tUk%3D","line":446,"updated":"2014-04-02 17:16:58.000000000","message":"Should \u0027If-None-Match : *, etag\u0027 also be disallowed i.e. value must be a * and only a *? I\u0027m not sure - this code looks consistent with GET, but http spec suggests either a * or a list of etags.","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"764a687f73f4da376e96850e5674bb64e504aef1","unresolved":false,"context_lines":[{"line_number":443,"context_line":"    @delay_denial"},{"line_number":444,"context_line":"    def PUT(self, req):"},{"line_number":445,"context_line":"        \"\"\"HTTP PUT request handler.\"\"\""},{"line_number":446,"context_line":"        if req.if_none_match is not None and \u0027*\u0027 not in req.if_none_match:"},{"line_number":447,"context_line":"            # Sending an etag with if-none-match isn\u0027t currently supported"},{"line_number":448,"context_line":"            return HTTPBadRequest(request\u003dreq, content_type\u003d\u0027text/plain\u0027,"},{"line_number":449,"context_line":"                                  body\u003d\u0027If-None-Match only supports *\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9sDg%3D","line":446,"in_reply_to":"AAAAWH%2F9sZE%3D","updated":"2014-04-02 19:52:54.000000000","message":"think we may have wires crossed :) - i understand that * is sufficient and there would be no point adding an etag.\n\nmy observation was that spec does not in fact allow \u0027*, etag\u0027  in the header but swift does - but I wan\u0027t sure if we cared about that \u0027technicality\u0027 at all. Discussion with John in IRC concluded that it makes no difference to functional behavior.\n\nbottom line: not an issue.","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"},{"author":{"_account_id":917,"name":"Chuck Thier","email":"cthier@gmail.com","username":"cthier"},"change_message_id":"55af33d9624dc7546ad3bad9da2c04b613120b77","unresolved":false,"context_lines":[{"line_number":443,"context_line":"    @delay_denial"},{"line_number":444,"context_line":"    def PUT(self, req):"},{"line_number":445,"context_line":"        \"\"\"HTTP PUT request handler.\"\"\""},{"line_number":446,"context_line":"        if req.if_none_match is not None and \u0027*\u0027 not in req.if_none_match:"},{"line_number":447,"context_line":"            # Sending an etag with if-none-match isn\u0027t currently supported"},{"line_number":448,"context_line":"            return HTTPBadRequest(request\u003dreq, content_type\u003d\u0027text/plain\u0027,"},{"line_number":449,"context_line":"                                  body\u003d\u0027If-None-Match only supports *\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9sZE%3D","line":446,"in_reply_to":"AAAAWH%2F9tUk%3D","updated":"2014-04-02 18:43:31.000000000","message":"\u0027*\u0027 implies to not upload if *anything* exists, so adding an etag, while likely allowed by the spec, is a bit redundant, and is fine to fall back to using just \u0027*\u0027","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"890037cf111c9ee865f17f2939a252472082b6ba","unresolved":false,"context_lines":[{"line_number":663,"context_line":"        conns \u003d [conn for conn in pile if conn]"},{"line_number":664,"context_line":"        min_conns \u003d quorum_size(len(nodes))"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        if req.if_none_match is not None and \u0027*\u0027 in req.if_none_match:"},{"line_number":667,"context_line":"            statuses \u003d [conn.resp.status for conn in conns if conn.resp]"},{"line_number":668,"context_line":"            if HTTP_PRECONDITION_FAILED in statuses:"},{"line_number":669,"context_line":"                # If we find any copy of the file, it shouldn\u0027t be uploaded"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9tZE%3D","line":666,"updated":"2014-04-02 17:16:58.000000000","message":"would \u0027req.if_none_match is not None\u0027 be sufficient here? if * is missing then BadRequest got returned earlier.","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"},{"author":{"_account_id":917,"name":"Chuck Thier","email":"cthier@gmail.com","username":"cthier"},"change_message_id":"55af33d9624dc7546ad3bad9da2c04b613120b77","unresolved":false,"context_lines":[{"line_number":663,"context_line":"        conns \u003d [conn for conn in pile if conn]"},{"line_number":664,"context_line":"        min_conns \u003d quorum_size(len(nodes))"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        if req.if_none_match is not None and \u0027*\u0027 in req.if_none_match:"},{"line_number":667,"context_line":"            statuses \u003d [conn.resp.status for conn in conns if conn.resp]"},{"line_number":668,"context_line":"            if HTTP_PRECONDITION_FAILED in statuses:"},{"line_number":669,"context_line":"                # If we find any copy of the file, it shouldn\u0027t be uploaded"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9sYk%3D","line":666,"in_reply_to":"AAAAWH%2F9tZE%3D","updated":"2014-04-02 18:43:31.000000000","message":"While yes, I like that we are being explicit here that we are only handling the \u0027*\u0027 case.","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"354e2ba9b37f281874e54ff4cfcf446fabea393b","unresolved":false,"context_lines":[{"line_number":664,"context_line":"        min_conns \u003d quorum_size(len(nodes))"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        if req.if_none_match is not None and \u0027*\u0027 in req.if_none_match:"},{"line_number":667,"context_line":"            statuses \u003d [conn.resp.status for conn in conns if conn.resp]"},{"line_number":668,"context_line":"            if HTTP_PRECONDITION_FAILED in statuses:"},{"line_number":669,"context_line":"                # If we find any copy of the file, it shouldn\u0027t be uploaded"},{"line_number":670,"context_line":"                self.app.logger.debug("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9t6M%3D","line":667,"updated":"2014-04-02 15:50:08.000000000","message":"Looks like 3 or 4 lines here not covered w/unit test","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"ad166c3d6ace936da6c0312c6309bf8c6de2ab5d","unresolved":false,"context_lines":[{"line_number":664,"context_line":"        min_conns \u003d quorum_size(len(nodes))"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        if req.if_none_match is not None and \u0027*\u0027 in req.if_none_match:"},{"line_number":667,"context_line":"            statuses \u003d [conn.resp.status for conn in conns if conn.resp]"},{"line_number":668,"context_line":"            if HTTP_PRECONDITION_FAILED in statuses:"},{"line_number":669,"context_line":"                # If we find any copy of the file, it shouldn\u0027t be uploaded"},{"line_number":670,"context_line":"                self.app.logger.debug("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9r5o%3D","line":667,"in_reply_to":"AAAAWH%2F9sYY%3D","updated":"2014-04-02 19:53:38.000000000","message":"@Paul: it\u0027s a little bit weird - actually the tests are executed and also cover this part, but the coverage report marks these lines as missing.","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"},{"author":{"_account_id":917,"name":"Chuck Thier","email":"cthier@gmail.com","username":"cthier"},"change_message_id":"55af33d9624dc7546ad3bad9da2c04b613120b77","unresolved":false,"context_lines":[{"line_number":664,"context_line":"        min_conns \u003d quorum_size(len(nodes))"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"        if req.if_none_match is not None and \u0027*\u0027 in req.if_none_match:"},{"line_number":667,"context_line":"            statuses \u003d [conn.resp.status for conn in conns if conn.resp]"},{"line_number":668,"context_line":"            if HTTP_PRECONDITION_FAILED in statuses:"},{"line_number":669,"context_line":"                # If we find any copy of the file, it shouldn\u0027t be uploaded"},{"line_number":670,"context_line":"                self.app.logger.debug("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9sYY%3D","line":667,"in_reply_to":"AAAAWH%2F9t6M%3D","updated":"2014-04-02 18:43:31.000000000","message":"nobody is perfect :)","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5420d9db8701a9af8d0dcf6e6ad1f1afa075360","unresolved":false,"context_lines":[{"line_number":496,"context_line":"        self.assertEquals(resp.status_int, 412)"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"    def test_PUT_if_none_match(self):"},{"line_number":499,"context_line":"        # PUT with if-none-match set and nothing there should succede"},{"line_number":500,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":501,"context_line":"        req \u003d Request.blank("},{"line_number":502,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2FFs4%3D","line":499,"updated":"2014-03-20 18:20:39.000000000","message":"$xp\n^ftfy","commit_id":"8cd957aa5be0b87db3ac345936286355d4afe636"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"890037cf111c9ee865f17f2939a252472082b6ba","unresolved":false,"context_lines":[{"line_number":510,"context_line":"        self.assertEquals(resp.status_int, 412)"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"    def test_PUT_if_none_match(self):"},{"line_number":513,"context_line":"        # PUT with if-none-match set and nothing there should succede"},{"line_number":514,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":515,"context_line":"        req \u003d Request.blank("},{"line_number":516,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9tMs%3D","line":513,"updated":"2014-04-02 17:16:58.000000000","message":"/succede/succeed","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"},{"author":{"_account_id":917,"name":"Chuck Thier","email":"cthier@gmail.com","username":"cthier"},"change_message_id":"55af33d9624dc7546ad3bad9da2c04b613120b77","unresolved":false,"context_lines":[{"line_number":510,"context_line":"        self.assertEquals(resp.status_int, 412)"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"    def test_PUT_if_none_match(self):"},{"line_number":513,"context_line":"        # PUT with if-none-match set and nothing there should succede"},{"line_number":514,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":515,"context_line":"        req \u003d Request.blank("},{"line_number":516,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9sX8%3D","line":513,"in_reply_to":"AAAAWH%2F9tMs%3D","updated":"2014-04-02 18:43:31.000000000","message":"ugh","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"890037cf111c9ee865f17f2939a252472082b6ba","unresolved":false,"context_lines":[{"line_number":531,"context_line":"                     \u0027If-None-Match\u0027: \u00270b4c12d7e0a73840c1c4f148fda3b037\u0027})"},{"line_number":532,"context_line":"        req.body \u003d \u0027VERIFY\u0027"},{"line_number":533,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":534,"context_line":"        self.assertEquals(resp.status_int, 412)"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"    def test_PUT_common(self):"},{"line_number":537,"context_line":"        timestamp \u003d normalize_timestamp(time())"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9tKA%3D","line":534,"updated":"2014-04-02 17:16:58.000000000","message":"maybe also test for  success when object exists and If-None-Match : not-the-etag","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"eab88c23c946659d4b462bf09d74779d5590c03b","unresolved":false,"context_lines":[{"line_number":531,"context_line":"                     \u0027If-None-Match\u0027: \u00270b4c12d7e0a73840c1c4f148fda3b037\u0027})"},{"line_number":532,"context_line":"        req.body \u003d \u0027VERIFY\u0027"},{"line_number":533,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":534,"context_line":"        self.assertEquals(resp.status_int, 412)"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"    def test_PUT_common(self):"},{"line_number":537,"context_line":"        timestamp \u003d normalize_timestamp(time())"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9rxs%3D","line":534,"in_reply_to":"AAAAWH%2F9sX0%3D","updated":"2014-04-02 20:15:25.000000000","message":"so, right after this, third request to existing object with if-non-match\u003dgobbledegook should return 201 response.\n\nBut since this functionality is not used/exposed (yet) I think that test can wait for a follow-up.","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"},{"author":{"_account_id":917,"name":"Chuck Thier","email":"cthier@gmail.com","username":"cthier"},"change_message_id":"55af33d9624dc7546ad3bad9da2c04b613120b77","unresolved":false,"context_lines":[{"line_number":531,"context_line":"                     \u0027If-None-Match\u0027: \u00270b4c12d7e0a73840c1c4f148fda3b037\u0027})"},{"line_number":532,"context_line":"        req.body \u003d \u0027VERIFY\u0027"},{"line_number":533,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":534,"context_line":"        self.assertEquals(resp.status_int, 412)"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"    def test_PUT_common(self):"},{"line_number":537,"context_line":"        timestamp \u003d normalize_timestamp(time())"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9sX0%3D","line":534,"in_reply_to":"AAAAWH%2F9tKA%3D","updated":"2014-04-02 18:43:31.000000000","message":"this is covered in the first test","commit_id":"0b893825ebdd63d22d51cce42a3994f120f43921"}],"test/unit/proxy/controllers/test_obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5420d9db8701a9af8d0dcf6e6ad1f1afa075360","unresolved":false,"context_lines":[{"line_number":92,"context_line":"class TestObjController(unittest.TestCase):"},{"line_number":93,"context_line":"    def setUp(self):"},{"line_number":94,"context_line":"        logger \u003d debug_logger(\u0027proxy-server\u0027)"},{"line_number":95,"context_line":"        logger.thread_locals \u003d (\u0027txn1\u0027, \u0027127.0.0.2\u0027)"},{"line_number":96,"context_line":"        self.app \u003d proxy_server.Application("},{"line_number":97,"context_line":"            None, FakeMemcache(), account_ring\u003dFakeRing(),"},{"line_number":98,"context_line":"            container_ring\u003dFakeRing(), object_ring\u003dFakeRing(),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2FFs8%3D","line":95,"updated":"2014-03-20 18:20:39.000000000","message":"if https://review.openstack.org/#/c/81158/ would land you may find this is not needed.","commit_id":"8cd957aa5be0b87db3ac345936286355d4afe636"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"125b2554ca5bda24c7e068e3550187afe6189cfe","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            resp \u003d self.controller.PUT(req)"},{"line_number":118,"context_line":"        self.assertEquals(resp.status_int, 201)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def test_PUT_if_none_match(self):"},{"line_number":121,"context_line":"        req \u003d swift.common.swob.Request.blank(\u0027/v1/a/c/o\u0027)"},{"line_number":122,"context_line":"        req.headers[\u0027if-none-match\u0027] \u003d \u0027*\u0027"},{"line_number":123,"context_line":"        req.headers[\u0027content-length\u0027] \u003d \u00270\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F%2BgmI%3D","line":120,"updated":"2014-03-26 09:58:28.000000000","message":"I think it can be renamed to test_PUT_if_none_match_star to maintain consistency in name given in unit/test_server.py.","commit_id":"fc6a2c55504aab3fe4f8a488092c148a36fd252b"},{"author":{"_account_id":10206,"name":"Madhuri Kumari","email":"madhuri.kumari@intel.com","username":"Madhuri"},"change_message_id":"125b2554ca5bda24c7e068e3550187afe6189cfe","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            resp \u003d self.controller.PUT(req)"},{"line_number":134,"context_line":"        self.assertEquals(resp.status_int, 412)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def test_PUT_if_none_match_not_star(self):"},{"line_number":137,"context_line":"        req \u003d swift.common.swob.Request.blank(\u0027/v1/a/c/o\u0027)"},{"line_number":138,"context_line":"        req.headers[\u0027if-none-match\u0027] \u003d \u0027somethingelse\u0027"},{"line_number":139,"context_line":"        req.headers[\u0027content-length\u0027] \u003d \u00270\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F%2Bgks%3D","line":136,"updated":"2014-03-26 09:58:28.000000000","message":"ditto","commit_id":"fc6a2c55504aab3fe4f8a488092c148a36fd252b"}]}
