)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"becdfc8300a6e016c0ee2732c35a505b446210a8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"d4627942_603d59e7","updated":"2022-06-07 15:58:38.000000000","message":"It looks like this change supports different signature digest algorithms - does it also address https://bugs.launchpad.net/python-swiftclient/+bug/1977867","commit_id":"e2cc21c007df36582e3ac1ac5243813eb1e06b2e"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"55170b21c88a21b1ec960f8d1b9fe1cca34d0297","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"65ae8d0d_efff0a36","updated":"2022-06-22 21:17:13.000000000","message":"opps yeah, I\u0027ll add the base64 when using prefix stuff. Needs a rebase anyway.","commit_id":"e2cc21c007df36582e3ac1ac5243813eb1e06b2e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"0495fa0f_783e01e8","updated":"2024-02-26 19:57:43.000000000","message":"Seems mostly faithful to the original -- I think I\u0027d like a little better separation between shell.py and utils.py, though, and maybe error out on extra args.\n\nI\u0027m also curious about your thoughts regarding how much more advantage we could take of switching to `argparse`","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"9c278df5a586e77b1b0f88a5965696a045d72919","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"b705b611_f7efbd77","in_reply_to":"0495fa0f_783e01e8","updated":"2024-02-28 03:14:29.000000000","message":"yeah, I don\u0027t really like how we\u0027re dealing with args where. I mean we do use argparse but I assume you mean in a way where everything is properly defined.","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"51f17082e4a0d58bf7ca0780fcb782929b44c8b9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"40a1728b_a0123d9a","updated":"2024-02-28 03:16:52.000000000","message":"@tim this is a new version, params more similar to tempurl now. Maybe I need some absolute and different time tests :hmm:","commit_id":"722aec299820f44b68d2813bbc008b8bf9aea3f0"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"0465defd1a9f5bdb631fc5ab76b4cbbc8b7c6435","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"87ba019c_c71650f3","updated":"2024-09-02 07:00:45.000000000","message":"I guess I should address your comments. opps sorry.","commit_id":"f1a6aaa08b06f4410f3c85b14835441af184fe0a"}],"swiftclient/shell.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":true,"context_lines":[{"line_number":1404,"context_line":"                        account/container."},{"line_number":1405,"context_line":""},{"line_number":1406,"context_line":"optional arguments:"},{"line_number":1407,"context_line":"  --redirect \u003curl\u003e     The URL to redirect the browser to after the uploads"},{"line_number":1408,"context_line":"                        have completed."},{"line_number":1409,"context_line":"  --digest {sha256,sha512,sha1}, -a {sha256,sha512,sha1}"},{"line_number":1410,"context_line":"                        Select the hash digest to use."}],"source_content_type":"text/x-python","patch_set":7,"id":"90d11056_a71b4a7a","line":1407,"updated":"2024-02-26 19:57:43.000000000","message":"OK, so we\u0027re breaking from the script in swift/cli -- that seems fine to me; it\u0027ll be `swift formpost ...` instead of `swift-form-signature` anyway, so may as well change up the args a bit, too.\n\nShould we change up anything else, too? In particular, I\u0027m thinking `1` might be a reasonable default for `max_file_count`...","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7fe23b57f06535dd4ca4fdfe20924b461a41e8c6","unresolved":false,"context_lines":[{"line_number":1404,"context_line":"                        account/container."},{"line_number":1405,"context_line":""},{"line_number":1406,"context_line":"optional arguments:"},{"line_number":1407,"context_line":"  --redirect \u003curl\u003e     The URL to redirect the browser to after the uploads"},{"line_number":1408,"context_line":"                        have completed."},{"line_number":1409,"context_line":"  --digest {sha256,sha512,sha1}, -a {sha256,sha512,sha1}"},{"line_number":1410,"context_line":"                        Select the hash digest to use."}],"source_content_type":"text/x-python","patch_set":7,"id":"4fb23f1e_f5720108","line":1407,"in_reply_to":"90d11056_a71b4a7a","updated":"2024-09-03 23:16:31.000000000","message":"Done","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":true,"context_lines":[{"line_number":1426,"context_line":"    (options, args) \u003d parse_args(parser, args)"},{"line_number":1427,"context_line":"    args \u003d args[1:]"},{"line_number":1428,"context_line":"    thread_manager.print_msg(\", \".join(args))"},{"line_number":1429,"context_line":"    if len(args) \u003c 5:"},{"line_number":1430,"context_line":"        thread_manager.error(\u0027Usage: %s formpost %s\\n%s\u0027, BASENAME,"},{"line_number":1431,"context_line":"                             st_formpost_options, st_formpost_help)"},{"line_number":1432,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":7,"id":"b532b79e_a2c433a0","line":1429,"updated":"2024-02-26 19:57:43.000000000","message":"And if the user provided *too many* args... we just ignore the extras?","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c4134d92f878827dddc7c659627c9ff021ee3d24","unresolved":false,"context_lines":[{"line_number":1426,"context_line":"    (options, args) \u003d parse_args(parser, args)"},{"line_number":1427,"context_line":"    args \u003d args[1:]"},{"line_number":1428,"context_line":"    thread_manager.print_msg(\", \".join(args))"},{"line_number":1429,"context_line":"    if len(args) \u003c 5:"},{"line_number":1430,"context_line":"        thread_manager.error(\u0027Usage: %s formpost %s\\n%s\u0027, BASENAME,"},{"line_number":1431,"context_line":"                             st_formpost_options, st_formpost_help)"},{"line_number":1432,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a2fcd26_c399d1a0","line":1429,"in_reply_to":"b532b79e_a2c433a0","updated":"2024-05-14 18:00:49.000000000","message":"Done","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":true,"context_lines":[{"line_number":1440,"context_line":"        thread_manager.error(err)"},{"line_number":1441,"context_line":"        return"},{"line_number":1442,"context_line":""},{"line_number":1443,"context_line":"    thread_manager.print_msg(\u0027  Expires: %d\u0027 % int(expires))"},{"line_number":1444,"context_line":"    thread_manager.print_msg(\u0027Signature: %s\u0027 % sig)"},{"line_number":1445,"context_line":""},{"line_number":1446,"context_line":"    thread_manager.print_msg(\u0027\\n\u0027 + code)"}],"source_content_type":"text/x-python","patch_set":7,"id":"031c34de_811d46c7","line":1443,"range":{"start_line":1443,"start_character":47,"end_line":1443,"end_character":50},"updated":"2024-02-26 19:57:43.000000000","message":"Shouldn\u0027t we already know we\u0027ll get back an int from `generate_formpost_sig`?","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7fe23b57f06535dd4ca4fdfe20924b461a41e8c6","unresolved":false,"context_lines":[{"line_number":1440,"context_line":"        thread_manager.error(err)"},{"line_number":1441,"context_line":"        return"},{"line_number":1442,"context_line":""},{"line_number":1443,"context_line":"    thread_manager.print_msg(\u0027  Expires: %d\u0027 % int(expires))"},{"line_number":1444,"context_line":"    thread_manager.print_msg(\u0027Signature: %s\u0027 % sig)"},{"line_number":1445,"context_line":""},{"line_number":1446,"context_line":"    thread_manager.print_msg(\u0027\\n\u0027 + code)"}],"source_content_type":"text/x-python","patch_set":7,"id":"689cdca6_9ed0e06a","line":1443,"range":{"start_line":1443,"start_character":47,"end_line":1443,"end_character":50},"in_reply_to":"031c34de_811d46c7","updated":"2024-09-03 23:16:31.000000000","message":"Yes, yes we do","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":true,"context_lines":[{"line_number":1505,"context_line":"                        ISO 8601 UTC timestamp instead of a Unix timestamp."},{"line_number":1506,"context_line":"  --ip-range            If present, the temporary URL will be restricted to the"},{"line_number":1507,"context_line":"                        given ip or ip range."},{"line_number":1508,"context_line":"  --digest              The digest digest to use. Defaults to sha256, but"},{"line_number":1509,"context_line":"                        older clusters may only support sha1."},{"line_number":1510,"context_line":"\u0027\u0027\u0027.strip(\u0027\\n\u0027)"},{"line_number":1511,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"75059df6_833e988f","line":1508,"updated":"2024-02-26 19:57:43.000000000","message":"\"digest digest\"?","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7fe23b57f06535dd4ca4fdfe20924b461a41e8c6","unresolved":false,"context_lines":[{"line_number":1505,"context_line":"                        ISO 8601 UTC timestamp instead of a Unix timestamp."},{"line_number":1506,"context_line":"  --ip-range            If present, the temporary URL will be restricted to the"},{"line_number":1507,"context_line":"                        given ip or ip range."},{"line_number":1508,"context_line":"  --digest              The digest digest to use. Defaults to sha256, but"},{"line_number":1509,"context_line":"                        older clusters may only support sha1."},{"line_number":1510,"context_line":"\u0027\u0027\u0027.strip(\u0027\\n\u0027)"},{"line_number":1511,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ac508ede_d72c21c1","line":1508,"in_reply_to":"75059df6_833e988f","updated":"2024-09-03 23:16:31.000000000","message":"Done","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":true,"context_lines":[{"line_number":1539,"context_line":"    parser.add_argument("},{"line_number":1540,"context_line":"        \u0027--digest\u0027, choices\u003d(\u0027sha1\u0027, \u0027sha256\u0027, \u0027sha512\u0027),"},{"line_number":1541,"context_line":"        default\u003d\u0027sha256\u0027,"},{"line_number":1542,"context_line":"        help\u003d(\"The digest digest to use. Defaults to sha256, but \""},{"line_number":1543,"context_line":"              \"older clusters may only support sha1.\"),"},{"line_number":1544,"context_line":"    )"},{"line_number":1545,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"8eda78e6_abd7a348","line":1542,"updated":"2024-02-26 19:57:43.000000000","message":"ditto","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c4134d92f878827dddc7c659627c9ff021ee3d24","unresolved":false,"context_lines":[{"line_number":1539,"context_line":"    parser.add_argument("},{"line_number":1540,"context_line":"        \u0027--digest\u0027, choices\u003d(\u0027sha1\u0027, \u0027sha256\u0027, \u0027sha512\u0027),"},{"line_number":1541,"context_line":"        default\u003d\u0027sha256\u0027,"},{"line_number":1542,"context_line":"        help\u003d(\"The digest digest to use. Defaults to sha256, but \""},{"line_number":1543,"context_line":"              \"older clusters may only support sha1.\"),"},{"line_number":1544,"context_line":"    )"},{"line_number":1545,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"a791bd41_ca7e5bad","line":1542,"in_reply_to":"8eda78e6_abd7a348","updated":"2024-05-14 18:00:49.000000000","message":"Done","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c4134d92f878827dddc7c659627c9ff021ee3d24","unresolved":true,"context_lines":[{"line_number":1474,"context_line":""},{"line_number":1475,"context_line":"    (options, args) \u003d parse_args(parser, args)"},{"line_number":1476,"context_line":"    args \u003d args[1:]"},{"line_number":1477,"context_line":"    thread_manager.print_msg(\", \".join(args))"},{"line_number":1478,"context_line":"    if len(args) !\u003d 4:"},{"line_number":1479,"context_line":"        thread_manager.error(\u0027Usage: %s formpost %s\\n%s\u0027, BASENAME,"},{"line_number":1480,"context_line":"                             st_formpost_options, st_formpost_help)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ac0ed8f7_87e96c32","line":1477,"updated":"2024-05-14 18:00:49.000000000","message":"Did we mean to include this, or was it just for debugging?","commit_id":"0a25984870f8a853c671b4c1b93f7c4a4af999a9"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7fe23b57f06535dd4ca4fdfe20924b461a41e8c6","unresolved":false,"context_lines":[{"line_number":1474,"context_line":""},{"line_number":1475,"context_line":"    (options, args) \u003d parse_args(parser, args)"},{"line_number":1476,"context_line":"    args \u003d args[1:]"},{"line_number":1477,"context_line":"    thread_manager.print_msg(\", \".join(args))"},{"line_number":1478,"context_line":"    if len(args) !\u003d 4:"},{"line_number":1479,"context_line":"        thread_manager.error(\u0027Usage: %s formpost %s\\n%s\u0027, BASENAME,"},{"line_number":1480,"context_line":"                             st_formpost_options, st_formpost_help)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ec4c48f8_26e9ff35","line":1477,"in_reply_to":"ac0ed8f7_87e96c32","updated":"2024-09-03 23:16:31.000000000","message":"ummm, yeah, no idea why this is here. I\u0027ll remove it","commit_id":"0a25984870f8a853c671b4c1b93f7c4a4af999a9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c4134d92f878827dddc7c659627c9ff021ee3d24","unresolved":true,"context_lines":[{"line_number":1479,"context_line":"        thread_manager.error(\u0027Usage: %s formpost %s\\n%s\u0027, BASENAME,"},{"line_number":1480,"context_line":"                             st_formpost_options, st_formpost_help)"},{"line_number":1481,"context_line":"        return"},{"line_number":1482,"context_line":"    timestamp, max_file_size, path, key \u003d args[:4]"},{"line_number":1483,"context_line":""},{"line_number":1484,"context_line":"    try:"},{"line_number":1485,"context_line":"        sig, expires, code \u003d generate_formpost_sig("}],"source_content_type":"text/x-python","patch_set":9,"id":"6ac85751_3722aee5","line":1482,"updated":"2024-05-14 18:00:49.000000000","message":"This doesn\u0027t seem to match what `st_formpost_options` says:\n```\n\u003cpath\u003e \u003cmax_file_size\u003e \u003cseconds\u003e \u003ckey\u003e\n```","commit_id":"0a25984870f8a853c671b4c1b93f7c4a4af999a9"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7fe23b57f06535dd4ca4fdfe20924b461a41e8c6","unresolved":false,"context_lines":[{"line_number":1479,"context_line":"        thread_manager.error(\u0027Usage: %s formpost %s\\n%s\u0027, BASENAME,"},{"line_number":1480,"context_line":"                             st_formpost_options, st_formpost_help)"},{"line_number":1481,"context_line":"        return"},{"line_number":1482,"context_line":"    timestamp, max_file_size, path, key \u003d args[:4]"},{"line_number":1483,"context_line":""},{"line_number":1484,"context_line":"    try:"},{"line_number":1485,"context_line":"        sig, expires, code \u003d generate_formpost_sig("}],"source_content_type":"text/x-python","patch_set":9,"id":"4dc85a0f_7e406ce6","line":1482,"in_reply_to":"6ac85751_3722aee5","updated":"2024-09-03 23:16:31.000000000","message":"Done","commit_id":"0a25984870f8a853c671b4c1b93f7c4a4af999a9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2112aa13b1ccfb575baa3f25247f14952fb2b289","unresolved":true,"context_lines":[{"line_number":1394,"context_line":"Generate Form Signature"},{"line_number":1395,"context_line":""},{"line_number":1396,"context_line":"positional arguments:"},{"line_number":1397,"context_line":"  \u003ctime\u003e                The amount of time the form post will be"},{"line_number":1398,"context_line":"                        valid. The time can be specified in three ways:"},{"line_number":1399,"context_line":"                        an integer representing the time in seconds;"},{"line_number":1400,"context_line":"                        a number with a \u0027s\u0027, \u0027m\u0027, \u0027h\u0027, or \u0027d\u0027 suffix to specify"}],"source_content_type":"text/x-python","patch_set":11,"id":"85012fb8_e0881464","line":1397,"range":{"start_line":1397,"start_character":2,"end_line":1397,"end_character":8},"updated":"2024-09-04 22:04:25.000000000","message":"`\u003ctime\u003e`, or `\u003cseconds\u003e`? Speaking of, why does this arg get angle-brackets while the others don\u0027t?","commit_id":"773a39d3bebf23ab6780d90db8491a88c759664e"}],"swiftclient/utils.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    if isinstance(digest, str) and digest in (\u0027sha1\u0027, \u0027sha256\u0027, \u0027sha512\u0027):"},{"line_number":185,"context_line":"        digest \u003d getattr(hashlib, digest)"},{"line_number":186,"context_line":"    if digest not in (hashlib.sha1, hashlib.sha256, hashlib.sha512):"},{"line_number":187,"context_line":"        raise ValueError(\u0027digest must be one of sha1, sha256, or sha512\u0027)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    parts \u003d path_for_body.split(\u0027/\u0027, 4)"},{"line_number":190,"context_line":"    if path_for_body \u003d\u003d \u0027/info\u0027:"}],"source_content_type":"text/x-python","patch_set":7,"id":"80c85022_59ab7f6d","side":"PARENT","line":187,"updated":"2024-02-26 19:57:43.000000000","message":"Cool -- so this moved into `generate_sig` and happens now after all the other validation.","commit_id":"b9fb6ca1d02512d6b87cc74e212a2666f703a8e8"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":true,"context_lines":[{"line_number":139,"context_line":"    if max_file_size \u003c 0:"},{"line_number":140,"context_line":"        raise ValueError(\u0027max_file_size must be \u003e\u003d 0\u0027)"},{"line_number":141,"context_line":"    if max_file_count \u003c 1:"},{"line_number":142,"context_line":"        raise ValueError(\u0027max_file_count must be a \u003e 0\u0027)"},{"line_number":143,"context_line":"    try:"},{"line_number":144,"context_line":"        expires \u003d int(time.time() + int(seconds))"},{"line_number":145,"context_line":"    except ValueError:"}],"source_content_type":"text/x-python","patch_set":7,"id":"8edf3960_75679bf3","line":142,"range":{"start_line":142,"start_character":49,"end_line":142,"end_character":52},"updated":"2024-02-26 19:57:43.000000000","message":"Drop the \"a\" like above.","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7fe23b57f06535dd4ca4fdfe20924b461a41e8c6","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    if max_file_size \u003c 0:"},{"line_number":140,"context_line":"        raise ValueError(\u0027max_file_size must be \u003e\u003d 0\u0027)"},{"line_number":141,"context_line":"    if max_file_count \u003c 1:"},{"line_number":142,"context_line":"        raise ValueError(\u0027max_file_count must be a \u003e 0\u0027)"},{"line_number":143,"context_line":"    try:"},{"line_number":144,"context_line":"        expires \u003d int(time.time() + int(seconds))"},{"line_number":145,"context_line":"    except ValueError:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5c998fda_7bb58241","line":142,"range":{"start_line":142,"start_character":49,"end_line":142,"end_character":52},"in_reply_to":"8edf3960_75679bf3","updated":"2024-09-03 23:16:31.000000000","message":"Done","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    if max_file_count \u003c 1:"},{"line_number":142,"context_line":"        raise ValueError(\u0027max_file_count must be a \u003e 0\u0027)"},{"line_number":143,"context_line":"    try:"},{"line_number":144,"context_line":"        expires \u003d int(time.time() + int(seconds))"},{"line_number":145,"context_line":"    except ValueError:"},{"line_number":146,"context_line":"        expires \u003d 0"},{"line_number":147,"context_line":"    if expires \u003c 1:"}],"source_content_type":"text/x-python","patch_set":7,"id":"abe10c05_a7569c11","line":144,"updated":"2024-02-26 19:57:43.000000000","message":"Future work: Accept an absolute time, like tempurl.","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c4134d92f878827dddc7c659627c9ff021ee3d24","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    if max_file_count \u003c 1:"},{"line_number":142,"context_line":"        raise ValueError(\u0027max_file_count must be a \u003e 0\u0027)"},{"line_number":143,"context_line":"    try:"},{"line_number":144,"context_line":"        expires \u003d int(time.time() + int(seconds))"},{"line_number":145,"context_line":"    except ValueError:"},{"line_number":146,"context_line":"        expires \u003d 0"},{"line_number":147,"context_line":"    if expires \u003c 1:"}],"source_content_type":"text/x-python","patch_set":7,"id":"b7e81194_8cec11ab","line":144,"in_reply_to":"abe10c05_a7569c11","updated":"2024-05-14 18:00:49.000000000","message":"Done.","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":true,"context_lines":[{"line_number":148,"context_line":"        raise ValueError(\u0027expires must be \u003e 0\u0027)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    parts \u003d path.split(\u0027/\u0027, 4)"},{"line_number":151,"context_line":"    # Must be four parts, [\u0027\u0027, \u0027v1\u0027, \u0027a\u0027, \u0027c\u0027], must be a v1 request, have"},{"line_number":152,"context_line":"    # account and container values, and optionally have an object prefix."},{"line_number":153,"context_line":"    if len(parts) \u003c 4 or parts[0] or parts[1] !\u003d \u0027v1\u0027 or not parts[2] or \\"},{"line_number":154,"context_line":"            not parts[3]:"}],"source_content_type":"text/x-python","patch_set":7,"id":"46abb81f_d8bf5ee8","line":151,"range":{"start_line":151,"start_character":6,"end_line":151,"end_character":24},"updated":"2024-02-26 19:57:43.000000000","message":"nit: \"at least\"? Though I realize this was just lifted verbatim from the script in swift/cli/.","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7fe23b57f06535dd4ca4fdfe20924b461a41e8c6","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        raise ValueError(\u0027expires must be \u003e 0\u0027)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    parts \u003d path.split(\u0027/\u0027, 4)"},{"line_number":151,"context_line":"    # Must be four parts, [\u0027\u0027, \u0027v1\u0027, \u0027a\u0027, \u0027c\u0027], must be a v1 request, have"},{"line_number":152,"context_line":"    # account and container values, and optionally have an object prefix."},{"line_number":153,"context_line":"    if len(parts) \u003c 4 or parts[0] or parts[1] !\u003d \u0027v1\u0027 or not parts[2] or \\"},{"line_number":154,"context_line":"            not parts[3]:"}],"source_content_type":"text/x-python","patch_set":7,"id":"40ba3e42_e347c144","line":151,"range":{"start_line":151,"start_character":6,"end_line":151,"end_character":24},"in_reply_to":"46abb81f_d8bf5ee8","updated":"2024-09-03 23:16:31.000000000","message":"Done","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            not parts[3]:"},{"line_number":155,"context_line":"        raise ValueError(\u0027path must point to a container at least\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    results \u003d dict(path\u003dpath, max_file_size\u003dmax_file_size,"},{"line_number":158,"context_line":"                   max_file_count\u003dmax_file_count, expires\u003dexpires,"},{"line_number":159,"context_line":"                   redirect_input\u003d\u0027\u0027)"},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fffa8377_a8c0ca57","line":157,"updated":"2024-02-26 19:57:43.000000000","message":"I was a little confused about why we\u0027d want this extra bag of data instead of just using locals, then noticed the formatting for `return_text`.\n\nNow that swiftclient only supports py36+, maybe we could use f-strings? Meh, could be a follow-up.","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":true,"context_lines":[{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    results \u003d dict(path\u003dpath, max_file_size\u003dmax_file_size,"},{"line_number":158,"context_line":"                   max_file_count\u003dmax_file_count, expires\u003dexpires,"},{"line_number":159,"context_line":"                   redirect_input\u003d\u0027\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    results[\u0027data\u0027] \u003d \u0027%s\\n%s\\n%s\\n%s\\n%s\u0027 % ("},{"line_number":162,"context_line":"        path, redirect, max_file_size, max_file_count, expires)"}],"source_content_type":"text/x-python","patch_set":7,"id":"cc461503_0d5ddda4","line":159,"range":{"start_line":159,"start_character":19,"end_line":159,"end_character":36},"updated":"2024-02-26 19:57:43.000000000","message":"nit: This read a little funny to me -- maybe it\u0027d be better in an `else:` around L176?","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7fe23b57f06535dd4ca4fdfe20924b461a41e8c6","unresolved":false,"context_lines":[{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    results \u003d dict(path\u003dpath, max_file_size\u003dmax_file_size,"},{"line_number":158,"context_line":"                   max_file_count\u003dmax_file_count, expires\u003dexpires,"},{"line_number":159,"context_line":"                   redirect_input\u003d\u0027\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    results[\u0027data\u0027] \u003d \u0027%s\\n%s\\n%s\\n%s\\n%s\u0027 % ("},{"line_number":162,"context_line":"        path, redirect, max_file_size, max_file_count, expires)"}],"source_content_type":"text/x-python","patch_set":7,"id":"92367d2b_36dfcb82","line":159,"range":{"start_line":159,"start_character":19,"end_line":159,"end_character":36},"in_reply_to":"cc461503_0d5ddda4","updated":"2024-09-03 23:16:31.000000000","message":"Done","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":true,"context_lines":[{"line_number":159,"context_line":"                   redirect_input\u003d\u0027\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    results[\u0027data\u0027] \u003d \u0027%s\\n%s\\n%s\\n%s\\n%s\u0027 % ("},{"line_number":162,"context_line":"        path, redirect, max_file_size, max_file_count, expires)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    data \u003d results.get(\u0027data\u0027)"},{"line_number":165,"context_line":"    results[\u0027data\u0027] \u003d data if isinstance(data, bytes) else data.encode(\u0027utf8\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"c56da251_2997b49e","line":162,"range":{"start_line":162,"start_character":8,"end_line":162,"end_character":22},"updated":"2024-02-26 19:57:43.000000000","message":"Do we want to worry about the possibility of either of these being `bytes`?\n\n\\*shrug\\* The existing tool doesn\u0027t worry about it, FWIW","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":true,"context_lines":[{"line_number":162,"context_line":"        path, redirect, max_file_size, max_file_count, expires)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    data \u003d results.get(\u0027data\u0027)"},{"line_number":165,"context_line":"    results[\u0027data\u0027] \u003d data if isinstance(data, bytes) else data.encode(\u0027utf8\u0027)"},{"line_number":166,"context_line":"    results[\u0027sig\u0027] \u003d generate_sig(key, results[\u0027data\u0027], digest)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    file_inputs \u003d []"}],"source_content_type":"text/x-python","patch_set":7,"id":"4844f13f_49c21465","line":165,"range":{"start_line":165,"start_character":59,"end_line":165,"end_character":78},"updated":"2024-02-26 19:57:43.000000000","message":"We should be able to always encode, as everything is `str` now.\n\nBetter yet, we can just punt to `generate_sig` to encode.","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":true,"context_lines":[{"line_number":175,"context_line":"            \u0027\u003cinput type\u003d\"hidden\" name\u003d\"redirect\" value\u003d\"%s\" /\u003e\u0027 % redirect"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    return_text \u003d \"\"\"Sample form:"},{"line_number":178,"context_line":"NOTE: the \u003cform\u003e tag\u0027s \"action\" attribute does not obtain the Swift cluster\u0027s"},{"line_number":179,"context_line":"      hostname. You should manually add it before using the form."},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"\u003cform action\u003d\"%(path)s\" method\u003d\"POST\" enctype\u003d\"multipart/form-data\"\u003e"}],"source_content_type":"text/x-python","patch_set":7,"id":"ea948867_95b5207b","line":178,"range":{"start_line":178,"start_character":51,"end_line":178,"end_character":57},"updated":"2024-02-26 19:57:43.000000000","message":"\"contain\", as in the original?","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7fe23b57f06535dd4ca4fdfe20924b461a41e8c6","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            \u0027\u003cinput type\u003d\"hidden\" name\u003d\"redirect\" value\u003d\"%s\" /\u003e\u0027 % redirect"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    return_text \u003d \"\"\"Sample form:"},{"line_number":178,"context_line":"NOTE: the \u003cform\u003e tag\u0027s \"action\" attribute does not obtain the Swift cluster\u0027s"},{"line_number":179,"context_line":"      hostname. You should manually add it before using the form."},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"\u003cform action\u003d\"%(path)s\" method\u003d\"POST\" enctype\u003d\"multipart/form-data\"\u003e"}],"source_content_type":"text/x-python","patch_set":7,"id":"cd5e9c49_5f46d72a","line":178,"range":{"start_line":178,"start_character":51,"end_line":178,"end_character":57},"in_reply_to":"ea948867_95b5207b","updated":"2024-09-03 23:16:31.000000000","message":"Done","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"54dbc8f4d6f8f0f0127d54b09b247fb6d72a7775","unresolved":true,"context_lines":[{"line_number":178,"context_line":"NOTE: the \u003cform\u003e tag\u0027s \"action\" attribute does not obtain the Swift cluster\u0027s"},{"line_number":179,"context_line":"      hostname. You should manually add it before using the form."},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"\u003cform action\u003d\"%(path)s\" method\u003d\"POST\" enctype\u003d\"multipart/form-data\"\u003e"},{"line_number":182,"context_line":"  %(redirect_input)s"},{"line_number":183,"context_line":"  \u003cinput type\u003d\"hidden\" name\u003d\"max_file_size\" value\u003d\"%(max_file_size)d\" /\u003e"},{"line_number":184,"context_line":"  \u003cinput type\u003d\"hidden\" name\u003d\"max_file_count\" value\u003d\"%(max_file_count)d\" /\u003e"}],"source_content_type":"text/x-python","patch_set":7,"id":"75106c27_4f8443f5","line":181,"updated":"2024-02-26 19:57:43.000000000","message":"I think I\u0027d prefer the preamble go in shell.py, and just have the `\u003cform\u003e` to `\u003c/form\u003e` part get generated/returned here.","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7fe23b57f06535dd4ca4fdfe20924b461a41e8c6","unresolved":false,"context_lines":[{"line_number":178,"context_line":"NOTE: the \u003cform\u003e tag\u0027s \"action\" attribute does not obtain the Swift cluster\u0027s"},{"line_number":179,"context_line":"      hostname. You should manually add it before using the form."},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"\u003cform action\u003d\"%(path)s\" method\u003d\"POST\" enctype\u003d\"multipart/form-data\"\u003e"},{"line_number":182,"context_line":"  %(redirect_input)s"},{"line_number":183,"context_line":"  \u003cinput type\u003d\"hidden\" name\u003d\"max_file_size\" value\u003d\"%(max_file_size)d\" /\u003e"},{"line_number":184,"context_line":"  \u003cinput type\u003d\"hidden\" name\u003d\"max_file_count\" value\u003d\"%(max_file_count)d\" /\u003e"}],"source_content_type":"text/x-python","patch_set":7,"id":"17bb2bf6_e5b7dc20","line":181,"in_reply_to":"75106c27_4f8443f5","updated":"2024-09-03 23:16:31.000000000","message":"Done","commit_id":"601834685c9bc46fc14038dc4ca21ff36d57b071"}]}
