)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ca75fc13427127bd3ed05cf83075652659e33c8f","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Alistair Coles \u003calistairncoles@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-01-08 16:54:28 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Rename S3Request.timestamp to avoid confusion super-class"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Previously, the S3Request.timestamp property was actually derived from"},{"line_number":10,"context_line":"whichever header or parameter defined the request\u0027s signing timestamp"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"bc53e04e_6b9e0017","line":7,"range":{"start_line":7,"start_character":36,"end_line":7,"end_character":46},"updated":"2026-01-08 18:19:40.000000000","message":"s/confusion/confusion with/","commit_id":"c173cfe46ff80364c958c50219e47de2379fa81f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2be70745c7f5f7f1876e34cad6599c905ed0b3da","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Alistair Coles \u003calistairncoles@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-01-08 16:54:28 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Rename S3Request.timestamp to avoid confusion super-class"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Previously, the S3Request.timestamp property was actually derived from"},{"line_number":10,"context_line":"whichever header or parameter defined the request\u0027s signing timestamp"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"e3a2f5df_24e37886","line":7,"range":{"start_line":7,"start_character":36,"end_line":7,"end_character":46},"in_reply_to":"bc53e04e_6b9e0017","updated":"2026-01-09 11:50:56.000000000","message":"Done","commit_id":"c173cfe46ff80364c958c50219e47de2379fa81f"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"29546b72051001d514e1feecddba1a2a791d26a0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"9a982ab2_d31f8236","updated":"2026-01-07 19:09:59.000000000","message":"wow, quite a discovery!","commit_id":"adda882c01ee2d7a1627edcd1ff542b5eae26449"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"cfd138ef4935d531571614173226897bf7658b7d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"c8e13ed2_7192bf8d","updated":"2026-03-10 20:26:55.000000000","message":"Seems entirely reasonable -- did you want to do anything with the bucket-inventory repo before merging, or should we just go for it?","commit_id":"4fda219b5358686bc4adaa94e6e867ced24bc49b"}],"swift/common/middleware/s3api/s3request.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a1d61092abd7519726e00cee12947fad3258aea4","unresolved":true,"context_lines":[{"line_number":794,"context_line":"            \u0027S3Request.timestamp is deprecated; use the ``signing_timestamp`` \u0027"},{"line_number":795,"context_line":"            \u0027property instead.\u0027, DeprecationWarning, stacklevel\u003d2"},{"line_number":796,"context_line":"        )"},{"line_number":797,"context_line":"        return self.signing_timestamp"},{"line_number":798,"context_line":""},{"line_number":799,"context_line":"    def _validate_expire_param(self):"},{"line_number":800,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"07d615a2_243aba80","line":797,"updated":"2026-03-25 18:05:06.000000000","message":"Oh, right -- this isn\u0027t breaking anything -- if some out-of-tree code is referencing `S3Request.timestamp` they\u0027re still going to get the same answer, just with a deprecation warning to switch to `S3Request.signing_timestamp`\n\nDo we expect we\u0027ll ever *remove* this property and let it just inherit `Request.timestamp`? I guess *that\u0027s* where the real danger will lie...","commit_id":"4fda219b5358686bc4adaa94e6e867ced24bc49b"}],"test/unit/common/middleware/s3api/test_s3request.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"df2f075fa93add01de3d6397e5050b055ab930c2","unresolved":true,"context_lines":[{"line_number":449,"context_line":"    def test_sig_v4_request_signing_timestamp_is_not_x_timestamp(self):"},{"line_number":450,"context_line":"        date_header \u003d self.get_v4_amz_date_header()"},{"line_number":451,"context_line":"        signing_timestamp \u003d S3Timestamp("},{"line_number":452,"context_line":"            str(mktime(date_header, SIGV4_X_AMZ_DATE_FORMAT)))"},{"line_number":453,"context_line":"        ts1 \u003d Timestamp(1678000000.12345)"},{"line_number":454,"context_line":"        self.assertNotEqual(signing_timestamp, ts1)  # sanity check"},{"line_number":455,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5068e9c1_0e93b5fd","line":452,"range":{"start_line":452,"start_character":12,"end_line":452,"end_character":15},"updated":"2026-01-08 17:48:08.000000000","message":"Really? We need to convert to a string?","commit_id":"c173cfe46ff80364c958c50219e47de2379fa81f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ca75fc13427127bd3ed05cf83075652659e33c8f","unresolved":true,"context_lines":[{"line_number":449,"context_line":"    def test_sig_v4_request_signing_timestamp_is_not_x_timestamp(self):"},{"line_number":450,"context_line":"        date_header \u003d self.get_v4_amz_date_header()"},{"line_number":451,"context_line":"        signing_timestamp \u003d S3Timestamp("},{"line_number":452,"context_line":"            str(mktime(date_header, SIGV4_X_AMZ_DATE_FORMAT)))"},{"line_number":453,"context_line":"        ts1 \u003d Timestamp(1678000000.12345)"},{"line_number":454,"context_line":"        self.assertNotEqual(signing_timestamp, ts1)  # sanity check"},{"line_number":455,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"96db66b9_0a4a6f88","line":452,"range":{"start_line":452,"start_character":12,"end_line":452,"end_character":15},"in_reply_to":"5068e9c1_0e93b5fd","updated":"2026-01-08 18:19:40.000000000","message":"ho hum, so this is because my mind is full of us adding jitter to timestamps and whether that should happen by default or not https://review.opendev.org/c/openstack/swift/+/972217\n\nbut yeah this isn\u0027t necessary in this patch","commit_id":"c173cfe46ff80364c958c50219e47de2379fa81f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"956798167713050df56d57def4763b31f4e7e8de","unresolved":false,"context_lines":[{"line_number":449,"context_line":"    def test_sig_v4_request_signing_timestamp_is_not_x_timestamp(self):"},{"line_number":450,"context_line":"        date_header \u003d self.get_v4_amz_date_header()"},{"line_number":451,"context_line":"        signing_timestamp \u003d S3Timestamp("},{"line_number":452,"context_line":"            str(mktime(date_header, SIGV4_X_AMZ_DATE_FORMAT)))"},{"line_number":453,"context_line":"        ts1 \u003d Timestamp(1678000000.12345)"},{"line_number":454,"context_line":"        self.assertNotEqual(signing_timestamp, ts1)  # sanity check"},{"line_number":455,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1f3af157_ec20d0b5","line":452,"range":{"start_line":452,"start_character":12,"end_line":452,"end_character":15},"in_reply_to":"96db66b9_0a4a6f88","updated":"2026-01-09 11:50:45.000000000","message":"Done","commit_id":"c173cfe46ff80364c958c50219e47de2379fa81f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"df2f075fa93add01de3d6397e5050b055ab930c2","unresolved":true,"context_lines":[{"line_number":456,"context_line":"        scope_date \u003d date_header.split(\u0027T\u0027, 1)[0]"},{"line_number":457,"context_line":"        headers \u003d {"},{"line_number":458,"context_line":"            \u0027X-Amz-Date\u0027: date_header,"},{"line_number":459,"context_line":"            \u0027X-Timestamp\u0027: ts1 .internal,"},{"line_number":460,"context_line":"            \u0027Authorization\u0027:"},{"line_number":461,"context_line":"                \u0027AWS4-HMAC-SHA256 \u0027"},{"line_number":462,"context_line":"                \u0027Credential\u003dtest/%s/us-east-1/s3/aws4_request, \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"0f4f8584_f7072ba9","line":459,"range":{"start_line":459,"start_character":30,"end_line":459,"end_character":31},"updated":"2026-01-08 17:48:08.000000000","message":"I\u0027m kinda surprised the pep8 job doesn\u0027t complain here.","commit_id":"c173cfe46ff80364c958c50219e47de2379fa81f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"956798167713050df56d57def4763b31f4e7e8de","unresolved":false,"context_lines":[{"line_number":456,"context_line":"        scope_date \u003d date_header.split(\u0027T\u0027, 1)[0]"},{"line_number":457,"context_line":"        headers \u003d {"},{"line_number":458,"context_line":"            \u0027X-Amz-Date\u0027: date_header,"},{"line_number":459,"context_line":"            \u0027X-Timestamp\u0027: ts1 .internal,"},{"line_number":460,"context_line":"            \u0027Authorization\u0027:"},{"line_number":461,"context_line":"                \u0027AWS4-HMAC-SHA256 \u0027"},{"line_number":462,"context_line":"                \u0027Credential\u003dtest/%s/us-east-1/s3/aws4_request, \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff27269c_50237cba","line":459,"range":{"start_line":459,"start_character":30,"end_line":459,"end_character":31},"in_reply_to":"0eeea5af_452c195e","updated":"2026-01-09 11:50:45.000000000","message":"Done","commit_id":"c173cfe46ff80364c958c50219e47de2379fa81f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ca75fc13427127bd3ed05cf83075652659e33c8f","unresolved":true,"context_lines":[{"line_number":456,"context_line":"        scope_date \u003d date_header.split(\u0027T\u0027, 1)[0]"},{"line_number":457,"context_line":"        headers \u003d {"},{"line_number":458,"context_line":"            \u0027X-Amz-Date\u0027: date_header,"},{"line_number":459,"context_line":"            \u0027X-Timestamp\u0027: ts1 .internal,"},{"line_number":460,"context_line":"            \u0027Authorization\u0027:"},{"line_number":461,"context_line":"                \u0027AWS4-HMAC-SHA256 \u0027"},{"line_number":462,"context_line":"                \u0027Credential\u003dtest/%s/us-east-1/s3/aws4_request, \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"0eeea5af_452c195e","line":459,"range":{"start_line":459,"start_character":30,"end_line":459,"end_character":31},"in_reply_to":"0f4f8584_f7072ba9","updated":"2026-01-08 18:19:40.000000000","message":"😮 will fix","commit_id":"c173cfe46ff80364c958c50219e47de2379fa81f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ca75fc13427127bd3ed05cf83075652659e33c8f","unresolved":true,"context_lines":[{"line_number":481,"context_line":"        self.assertEqual(ts1, sw_req1.timestamp)"},{"line_number":482,"context_line":"        self.assertEqual(ts1.internal, sw_req1.headers[\u0027X-Timestamp\u0027])"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def _test_request_timestamp_sigv4(self, date_header):"},{"line_number":485,"context_line":"        # signature v4 here"},{"line_number":486,"context_line":"        environ \u003d {"},{"line_number":487,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027GET\u0027}"}],"source_content_type":"text/x-python","patch_set":2,"id":"a4accbc9_2c044063","line":484,"updated":"2026-01-08 18:19:40.000000000","message":"maybe I should rename these tests","commit_id":"c173cfe46ff80364c958c50219e47de2379fa81f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"956798167713050df56d57def4763b31f4e7e8de","unresolved":false,"context_lines":[{"line_number":481,"context_line":"        self.assertEqual(ts1, sw_req1.timestamp)"},{"line_number":482,"context_line":"        self.assertEqual(ts1.internal, sw_req1.headers[\u0027X-Timestamp\u0027])"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def _test_request_timestamp_sigv4(self, date_header):"},{"line_number":485,"context_line":"        # signature v4 here"},{"line_number":486,"context_line":"        environ \u003d {"},{"line_number":487,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027GET\u0027}"}],"source_content_type":"text/x-python","patch_set":2,"id":"6a10cbb4_3cce15b7","line":484,"in_reply_to":"a4accbc9_2c044063","updated":"2026-01-09 11:50:45.000000000","message":"Done","commit_id":"c173cfe46ff80364c958c50219e47de2379fa81f"}]}
