)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e6261110c4510bdccfd1429eba7266f5ffbd471","unresolved":false,"context_lines":[{"line_number":21,"context_line":"https://bitbucket.org/kmgreen2/pyeclib/pull-request/24/fix-python-3-issues/diff"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"dnspython is no more installed on Python 3, because it is not compatible"},{"line_number":24,"context_line":"with Python 3."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Change-Id: I5c8a9fe7b9635f1acab8f401908975fc6fc58c7a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"9a41bdd9_c915bb49","line":24,"updated":"2015-07-15 16:09:40.000000000","message":"If you add \u0027Depends-On: I93d1e2619e77294ca299c026d57f22f0d9c7cc76\u0027 to the commit message, you can add dnspython3 to requirements-py3.txt","commit_id":"02bd112e90bf4bb2436e87ee49e15441a8e9964a"}],"requirements-py3.txt":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ca37d473e272a857d52f676fbbff88c6dd110bc4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# The order of packages is significant, because pip processes them in the order"},{"line_number":2,"context_line":"# of appearance. Changing the order has an impact on the overall integration"},{"line_number":3,"context_line":"# process, which may cause wedges in the gate later."},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"eventlet\u003e\u003d0.16.1,!\u003d0.17.0"},{"line_number":6,"context_line":"greenlet\u003e\u003d0.3.1"},{"line_number":7,"context_line":"netifaces\u003e\u003d0.5,!\u003d0.10.0,!\u003d0.10.1"}],"source_content_type":"text/plain","patch_set":5,"id":"ba3cc151_0c9038ec","line":4,"updated":"2015-07-08 18:49:07.000000000","message":"Have we looked into dnspython3? It might be good to list it here, if only so we don\u0027t forget about it later. Do we have any idea how much of an API difference there is between the two packages?\n\nNot that this should block us right now, but we\u0027ll need to figure out the dependencies at some point...","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"e135b9ea91b2fc49ab5d86e85bde1b36cab37508","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# The order of packages is significant, because pip processes them in the order"},{"line_number":2,"context_line":"# of appearance. Changing the order has an impact on the overall integration"},{"line_number":3,"context_line":"# process, which may cause wedges in the gate later."},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"eventlet\u003e\u003d0.16.1,!\u003d0.17.0"},{"line_number":6,"context_line":"greenlet\u003e\u003d0.3.1"},{"line_number":7,"context_line":"netifaces\u003e\u003d0.5,!\u003d0.10.0,!\u003d0.10.1"}],"source_content_type":"text/plain","patch_set":5,"id":"ba3cc151_71b93715","line":4,"in_reply_to":"ba3cc151_0c046615","updated":"2015-07-10 08:36:49.000000000","message":"It\u0027s not possible to use dnspython3 right now, it must first be added to global requirements. I proposed https://review.openstack.org/#/c/200416/ for that.\n\nOnce dnspython3 is part of global requirements, I will propose a patch to use it on Python 3 in Swift.","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"9017ce08775ea68222c28ac263819e7ed4d43043","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# The order of packages is significant, because pip processes them in the order"},{"line_number":2,"context_line":"# of appearance. Changing the order has an impact on the overall integration"},{"line_number":3,"context_line":"# process, which may cause wedges in the gate later."},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"eventlet\u003e\u003d0.16.1,!\u003d0.17.0"},{"line_number":6,"context_line":"greenlet\u003e\u003d0.3.1"},{"line_number":7,"context_line":"netifaces\u003e\u003d0.5,!\u003d0.10.0,!\u003d0.10.1"}],"source_content_type":"text/plain","patch_set":5,"id":"ba3cc151_0c046615","line":4,"in_reply_to":"ba3cc151_0c9038ec","updated":"2015-07-09 22:30:35.000000000","message":"\u003e so we don\u0027t forget about it later\n\ndnspython is required to run Swift, I don\u0027t think that we will forget it when we will port more tests on Python 3 ;-)","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"}],"requirements.txt":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"10279018ea06c764e758e30dc1dc7b998796c2ac","unresolved":false,"context_lines":[{"line_number":2,"context_line":"# of appearance. Changing the order has an impact on the overall integration"},{"line_number":3,"context_line":"# process, which may cause wedges in the gate later."},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"pbr\u003e\u003d1.3,\u003c2.0"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"dnspython\u003e\u003d1.12.0;python_version\u003c\u00273.0\u0027"},{"line_number":8,"context_line":"dnspython3\u003e\u003d1.12.0;python_version\u003e\u003d\u00273.0\u0027"}],"source_content_type":"text/plain","patch_set":11,"id":"3a50d1a3_572e198d","line":5,"updated":"2015-07-31 16:19:21.000000000","message":"We need to specify the minimum pbr version in setup.py, otherwise we\u0027ll get errors like in https://bugs.launchpad.net/python-swiftclient/+bug/1476585","commit_id":"a8d2a776aab8fb13135de84f790ffa7dd5470556"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"4ed8fee917404b187bee00441168bbd153c58730","unresolved":false,"context_lines":[{"line_number":2,"context_line":"# of appearance. Changing the order has an impact on the overall integration"},{"line_number":3,"context_line":"# process, which may cause wedges in the gate later."},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"pbr\u003e\u003d1.3,\u003c2.0"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"dnspython\u003e\u003d1.12.0;python_version\u003c\u00273.0\u0027"},{"line_number":8,"context_line":"dnspython3\u003e\u003d1.12.0;python_version\u003e\u003d\u00273.0\u0027"}],"source_content_type":"text/plain","patch_set":11,"id":"3a50d1a3_b2b8c476","line":5,"in_reply_to":"3a50d1a3_572e198d","updated":"2015-07-31 19:13:53.000000000","message":"I ran \"tox -e update ../swift\" in requirements: it updated pbr requirements to \"pbr\u003e\u003d1.3\" in setup.py.\n\n(I ignored other changes in requirements.txt and test-requirements.txt.)","commit_id":"a8d2a776aab8fb13135de84f790ffa7dd5470556"}],"setup.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"f9b3ec4b8e132a361b7fa7b26b2676c3147ea0e9","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    pass"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"setuptools.setup("},{"line_number":28,"context_line":"    setup_requires\u003d[\u0027pbr\u003e\u003d1.3\u0027],"},{"line_number":29,"context_line":"    pbr\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_d249d08f","line":28,"updated":"2015-07-31 19:21:06.000000000","message":"Now that you added pbr 1.3 to requirements.txt, is this needed?","commit_id":"8b09ba0b6097ce9dc8a72e8c29ce369c64ac7fae"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"32d56da3a4b59227161c615acef505c1e298f3c7","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    pass"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"setuptools.setup("},{"line_number":28,"context_line":"    setup_requires\u003d[\u0027pbr\u003e\u003d1.3\u0027],"},{"line_number":29,"context_line":"    pbr\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_423c0fbf","line":28,"in_reply_to":"3a50d1a3_d249d08f","updated":"2015-07-31 20:02:16.000000000","message":"I don\u0027t know how pbr requirements should be specified, so i checked how it was done in nova. In nova, pbr\u003e\u003d1.3 requirement is in setup.py *and* requirements.txt.\n\nsetuptools is not able to upgrade itself, and there are some other annoying corner cases which still require to specify the pbr requirement twice.","commit_id":"8b09ba0b6097ce9dc8a72e8c29ce369c64ac7fae"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"6d0a8c6ab25f205b67c4650101a68d23e315f1c2","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    pass"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"setuptools.setup("},{"line_number":28,"context_line":"    setup_requires\u003d[\u0027pbr\u003e\u003d1.3\u0027],"},{"line_number":29,"context_line":"    pbr\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_62a4ab07","line":28,"in_reply_to":"3a50d1a3_d249d08f","updated":"2015-07-31 20:03:23.000000000","message":"requirements.txt is processed *after* setup.py has loaded the pbr code and executed it. This is semantically correct even though it won\u0027t fix many cases where an upgrade is needed just-in-time.\n\n https://github.com/pypa/pip/issues/2666\n https://bitbucket.org/pypa/setuptools/issues/141/setup_requires-feature-does-not-handle\n\nare related here. I don\u0027t recall if there is a thing for reloading / re-execing or whathave you to get updated setuptools versions - and those of setuptools extensions, but the failures in python setup.py install from this patched environment into an existing virtualenv are symptoms of that problem.","commit_id":"8b09ba0b6097ce9dc8a72e8c29ce369c64ac7fae"}],"swift/common/storage_policy.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ca37d473e272a857d52f676fbbff88c6dd110bc4","unresolved":false,"context_lines":[{"line_number":30,"context_line":"if six.PY3:"},{"line_number":31,"context_line":"    VALID_CHARS \u003d \u0027-\u0027 + string.ascii_letters + string.digits"},{"line_number":32,"context_line":"else:"},{"line_number":33,"context_line":"    VALID_CHARS \u003d \u0027-\u0027 + string.letters + string.digits"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"DEFAULT_POLICY_TYPE \u003d REPL_POLICY \u003d \u0027replication\u0027"},{"line_number":36,"context_line":"EC_POLICY \u003d \u0027erasure_coding\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_e75e4de8","line":33,"updated":"2015-07-08 18:49:07.000000000","message":"Is Swift locale-aware? If not, I feel like PY2 should also use ascii_letters. If it is, then we should have a plan for using locale data in PY3 as well.","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"e135b9ea91b2fc49ab5d86e85bde1b36cab37508","unresolved":false,"context_lines":[{"line_number":30,"context_line":"if six.PY3:"},{"line_number":31,"context_line":"    VALID_CHARS \u003d \u0027-\u0027 + string.ascii_letters + string.digits"},{"line_number":32,"context_line":"else:"},{"line_number":33,"context_line":"    VALID_CHARS \u003d \u0027-\u0027 + string.letters + string.digits"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"DEFAULT_POLICY_TYPE \u003d REPL_POLICY \u003d \u0027replication\u0027"},{"line_number":36,"context_line":"EC_POLICY \u003d \u0027erasure_coding\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_31d64f28","line":33,"in_reply_to":"ba3cc151_2744e344","updated":"2015-07-10 08:36:49.000000000","message":"\u003e According to the code: yes, Swift depends on the current LC_CTYPE locale.\n\nOh sorry, I was wrong. string.letters is only different than string.ascii_letters if locale.setlocale(locale.LC_CTYPE, ...) (or locale.setlocale(locale.LC_ALL, ...)) is called. But locale.setlocale() is *not* called in Swift, so my change doesn\u0027t change the behaviour on Python 3.\n\nhaypo@smithers$ LC_ALL\u003dtr_TR python\nPython 2.7.10 (default, May 27 2015, 18:11:38) \n[GCC 5.1.1 20150422 (Red Hat 5.1.1-1)] on linux2\n\u003e\u003e\u003e import string, locale\n\u003e\u003e\u003e sorted(set(string.letters) ^ set(string.ascii_letters))\n[]\n\u003e\u003e\u003e locale.setlocale(locale.LC_CTYPE, \u0027\u0027)\n\u0027tr_TR\u0027\n\u003e\u003e\u003e sorted(set(string.letters) ^ set(string.ascii_letters))\n[\u0027\\xaa\u0027, \u0027\\xb5\u0027, \u0027\\xba\u0027, \u0027\\xc0\u0027, \u0027\\xc1\u0027, \u0027\\xc2\u0027, \u0027\\xc3\u0027, \u0027\\xc4\u0027, \u0027\\xc5\u0027, \u0027\\xc6\u0027, \u0027\\xc7\u0027, \u0027\\xc8\u0027, \u0027\\xc9\u0027, \u0027\\xca\u0027, \u0027\\xcb\u0027, \u0027\\xcc\u0027, \u0027\\xcd\u0027, \u0027\\xce\u0027, \u0027\\xcf\u0027, \u0027\\xd0\u0027, \u0027\\xd1\u0027, \u0027\\xd2\u0027, \u0027\\xd3\u0027, \u0027\\xd4\u0027, \u0027\\xd5\u0027, \u0027\\xd6\u0027, \u0027\\xd8\u0027, \u0027\\xd9\u0027, \u0027\\xda\u0027, \u0027\\xdb\u0027, \u0027\\xdc\u0027, \u0027\\xdd\u0027, \u0027\\xde\u0027, \u0027\\xdf\u0027, \u0027\\xe0\u0027, \u0027\\xe1\u0027, \u0027\\xe2\u0027, \u0027\\xe3\u0027, \u0027\\xe4\u0027, \u0027\\xe5\u0027, \u0027\\xe6\u0027, \u0027\\xe7\u0027, \u0027\\xe8\u0027, \u0027\\xe9\u0027, \u0027\\xea\u0027, \u0027\\xeb\u0027, \u0027\\xec\u0027, \u0027\\xed\u0027, \u0027\\xee\u0027, \u0027\\xef\u0027, \u0027\\xf0\u0027, \u0027\\xf1\u0027, \u0027\\xf2\u0027, \u0027\\xf3\u0027, \u0027\\xf4\u0027, \u0027\\xf5\u0027, \u0027\\xf6\u0027, \u0027\\xf8\u0027, \u0027\\xf9\u0027, \u0027\\xfa\u0027, \u0027\\xfb\u0027, \u0027\\xfc\u0027, \u0027\\xfd\u0027, \u0027\\xfe\u0027, \u0027\\xff\u0027]\n\nI will modify the code to use ascii_letters on Python 2 and Python 3, to avoid further questions in the future.\n\nNote: setlocale() is called in test/functional/__init__.py to force the LC_COLLATE locale (use the POSIX locale (\"C\") by default, but it\u0027s possible to configure a different collate locale).","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1ccb25e6037260453f3b41aa5e1a970f9e400eac","unresolved":false,"context_lines":[{"line_number":30,"context_line":"if six.PY3:"},{"line_number":31,"context_line":"    VALID_CHARS \u003d \u0027-\u0027 + string.ascii_letters + string.digits"},{"line_number":32,"context_line":"else:"},{"line_number":33,"context_line":"    VALID_CHARS \u003d \u0027-\u0027 + string.letters + string.digits"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"DEFAULT_POLICY_TYPE \u003d REPL_POLICY \u003d \u0027replication\u0027"},{"line_number":36,"context_line":"EC_POLICY \u003d \u0027erasure_coding\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_e634baad","line":33,"in_reply_to":"ba3cc151_2744e344","updated":"2015-07-10 00:27:14.000000000","message":"I agree it\u0027s a bug and not a feature, but we don\u0027t know who may be relying on the buggy behavior. If we paper over the issue like this, it\u0027s *just functional enough* that it might never get cleaned up before we declare PY3-compatibility. *That\u0027s* my fear.\n\nHow about this: drop letters entirely from the PY3 declaration and add a note explaining why. When we try to port this module we\u0027ll have a mess of broken tests, and we\u0027ll *have* to deal with it and fix it properly.\n\nI\u0027ll keep fiddling with my patch; with luck, by the time we\u0027re trying to port this module, VALID_CHARS won\u0027t even be a thing anymore.","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"9017ce08775ea68222c28ac263819e7ed4d43043","unresolved":false,"context_lines":[{"line_number":30,"context_line":"if six.PY3:"},{"line_number":31,"context_line":"    VALID_CHARS \u003d \u0027-\u0027 + string.ascii_letters + string.digits"},{"line_number":32,"context_line":"else:"},{"line_number":33,"context_line":"    VALID_CHARS \u003d \u0027-\u0027 + string.letters + string.digits"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"DEFAULT_POLICY_TYPE \u003d REPL_POLICY \u003d \u0027replication\u0027"},{"line_number":36,"context_line":"EC_POLICY \u003d \u0027erasure_coding\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_2744e344","line":33,"in_reply_to":"ba3cc151_e75e4de8","updated":"2015-07-09 22:30:35.000000000","message":"According to the code: yes, Swift depends on the current LC_CTYPE locale. To me, it\u0027s a bug, not a feature, since VALID_CHARS is used for security:\n\nhttps://github.com/openstack/swift/blob/df134df/swift/common/storage_policy.py#L173","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"219cc7fa80631d2c99d6e3766356042b990339de","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from pyeclib.ec_iface import ECDriver, ECDriverError, VALID_EC_TYPES"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LEGACY_POLICY_NAME \u003d \u0027Policy-0\u0027"},{"line_number":29,"context_line":"VALID_CHARS \u003d \u0027-\u0027 + string.ascii_letters + string.digits"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"DEFAULT_POLICY_TYPE \u003d REPL_POLICY \u003d \u0027replication\u0027"},{"line_number":32,"context_line":"EC_POLICY \u003d \u0027erasure_coding\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_64b4acd0","line":29,"updated":"2015-07-21 18:03:53.000000000","message":"I don\u0027t think Swift calls setlocale() [or whatever function it is] to actually change the locale away from the default, so this probably works. I could easily be wrong, though.","commit_id":"987cdd7c8ed42395786b5b21d7aeb120e0e23654"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"91c0d179c09647091df7a5132d42768bfc27e5fd","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from pyeclib.ec_iface import ECDriver, ECDriverError, VALID_EC_TYPES"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LEGACY_POLICY_NAME \u003d \u0027Policy-0\u0027"},{"line_number":29,"context_line":"VALID_CHARS \u003d \u0027-\u0027 + string.ascii_letters + string.digits"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"DEFAULT_POLICY_TYPE \u003d REPL_POLICY \u003d \u0027replication\u0027"},{"line_number":32,"context_line":"EC_POLICY \u003d \u0027erasure_coding\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_8036a4e5","line":29,"updated":"2015-07-21 09:49:30.000000000","message":"There is a small chance that this makes a policy unusable if it uses non-ascii characters, depending on their locale.\n\nI\u0027m not sure what is the best way to handle this; one possibility might be to continue string.letters on Py2 (so nothing changes here) and add a note/warning somewhere (Changelog?) for Py3 users (amount of users using py3+swift in production should be quite low atm).","commit_id":"987cdd7c8ed42395786b5b21d7aeb120e0e23654"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"8659ec82665d1877ee36222ec16ffba90bfb7a03","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from pyeclib.ec_iface import ECDriver, ECDriverError, VALID_EC_TYPES"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LEGACY_POLICY_NAME \u003d \u0027Policy-0\u0027"},{"line_number":29,"context_line":"VALID_CHARS \u003d \u0027-\u0027 + string.ascii_letters + string.digits"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"DEFAULT_POLICY_TYPE \u003d REPL_POLICY \u003d \u0027replication\u0027"},{"line_number":32,"context_line":"EC_POLICY \u003d \u0027erasure_coding\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_c1f55657","line":29,"in_reply_to":"3a50d1a3_64b4acd0","updated":"2015-07-22 07:18:18.000000000","message":"Thanks Sam, makes sense. I actually tried to use a german umlaut, and you\u0027re right; even without this change Swift won\u0027t accept that name.","commit_id":"987cdd7c8ed42395786b5b21d7aeb120e0e23654"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"afca9c92c21bc7f2087fadf326a44ec1817a9d1b","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from pyeclib.ec_iface import ECDriver, ECDriverError, VALID_EC_TYPES"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LEGACY_POLICY_NAME \u003d \u0027Policy-0\u0027"},{"line_number":29,"context_line":"VALID_CHARS \u003d \u0027-\u0027 + string.ascii_letters + string.digits"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"DEFAULT_POLICY_TYPE \u003d REPL_POLICY \u003d \u0027replication\u0027"},{"line_number":32,"context_line":"EC_POLICY \u003d \u0027erasure_coding\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_3901bfaf","line":29,"in_reply_to":"3a50d1a3_c1f55657","updated":"2015-07-22 12:57:17.000000000","message":"Sorry, I didn\u0027t explain the change deeply in the commit message. Right, string.letters is only updated if you call setlocale(), but setlocale() is not called in Swift.","commit_id":"987cdd7c8ed42395786b5b21d7aeb120e0e23654"}],"swift/common/swob.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ca37d473e272a857d52f676fbbff88c6dd110bc4","unresolved":false,"context_lines":[{"line_number":45,"context_line":"import functools"},{"line_number":46,"context_line":"import inspect"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"import six"},{"line_number":49,"context_line":"from six.moves import urllib"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"from swift.common.utils import reiterate, split_path, Timestamp, pairs, \\"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_07501131","line":48,"updated":"2015-07-08 18:49:07.000000000","message":"Mind making this `from six import StringIO`, just to minimize the diff?","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"e135b9ea91b2fc49ab5d86e85bde1b36cab37508","unresolved":false,"context_lines":[{"line_number":45,"context_line":"import functools"},{"line_number":46,"context_line":"import inspect"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"import six"},{"line_number":49,"context_line":"from six.moves import urllib"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"from swift.common.utils import reiterate, split_path, Timestamp, pairs, \\"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_71713744","line":48,"in_reply_to":"ba3cc151_07501131","updated":"2015-07-10 08:36:49.000000000","message":"Done","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"9017ce08775ea68222c28ac263819e7ed4d43043","unresolved":false,"context_lines":[{"line_number":45,"context_line":"import functools"},{"line_number":46,"context_line":"import inspect"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"import six"},{"line_number":49,"context_line":"from six.moves import urllib"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"from swift.common.utils import reiterate, split_path, Timestamp, pairs, \\"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_87a28ffa","line":48,"in_reply_to":"ba3cc151_07501131","updated":"2015-07-09 22:30:35.000000000","message":"Yeah, I can do that.","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ca37d473e272a857d52f676fbbff88c6dd110bc4","unresolved":false,"context_lines":[{"line_number":934,"context_line":"    @property"},{"line_number":935,"context_line":"    def path(self):"},{"line_number":936,"context_line":"        \"Provides the full path of the request, excluding the QUERY_STRING\""},{"line_number":937,"context_line":"        return urllib.parse.quote(self.environ.get(\u0027SCRIPT_NAME\u0027, \u0027\u0027) +"},{"line_number":938,"context_line":"                                  self.environ[\u0027PATH_INFO\u0027])"},{"line_number":939,"context_line":""},{"line_number":940,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_478db9d1","line":937,"updated":"2015-07-08 18:49:07.000000000","message":"Ouch! We even were importing from the *wrong urllib*! Thank you...","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"e135b9ea91b2fc49ab5d86e85bde1b36cab37508","unresolved":false,"context_lines":[{"line_number":934,"context_line":"    @property"},{"line_number":935,"context_line":"    def path(self):"},{"line_number":936,"context_line":"        \"Provides the full path of the request, excluding the QUERY_STRING\""},{"line_number":937,"context_line":"        return urllib.parse.quote(self.environ.get(\u0027SCRIPT_NAME\u0027, \u0027\u0027) +"},{"line_number":938,"context_line":"                                  self.environ[\u0027PATH_INFO\u0027])"},{"line_number":939,"context_line":""},{"line_number":940,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_71a85778","line":937,"in_reply_to":"ba3cc151_478db9d1","updated":"2015-07-10 08:36:49.000000000","message":"The code was correct on Python 2.\n\nThe new code uses the new magic six.moves.urllib object which provides the Python 3 API even on Python 2.","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e6261110c4510bdccfd1429eba7266f5ffbd471","unresolved":false,"context_lines":[{"line_number":231,"context_line":"            yield k"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    def __len__(self):"},{"line_number":234,"context_line":"        return len(self.environ)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    def _normalize(self, key):"},{"line_number":237,"context_line":"        key \u003d \u0027HTTP_\u0027 + key.replace(\u0027-\u0027, \u0027_\u0027).upper()"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a41bdd9_092ac37e","line":234,"updated":"2015-07-15 16:09:40.000000000","message":"I think we want len(self.keys()) here. self.environ will have many more things than what we can iterate over.","commit_id":"02bd112e90bf4bb2436e87ee49e15441a8e9964a"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"9ec6be08462fcb5362bbfc36fe9f5a585ec897d4","unresolved":false,"context_lines":[{"line_number":231,"context_line":"            yield k"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    def __len__(self):"},{"line_number":234,"context_line":"        return len(self.environ)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    def _normalize(self, key):"},{"line_number":237,"context_line":"        key \u003d \u0027HTTP_\u0027 + key.replace(\u0027-\u0027, \u0027_\u0027).upper()"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a41bdd9_b0d558ba","line":234,"in_reply_to":"9a41bdd9_092ac37e","updated":"2015-07-17 11:10:52.000000000","message":"Done","commit_id":"02bd112e90bf4bb2436e87ee49e15441a8e9964a"}],"swift/common/utils.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ca37d473e272a857d52f676fbbff88c6dd110bc4","unresolved":false,"context_lines":[{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    # NOTE(haypo): rfc822 was replaced with the email module. Disable temporary"},{"line_number":24,"context_line":"    # this import just to get a working \"tox -e py34\". rfc822 will be replaced"},{"line_number":25,"context_line":"    # with email later."},{"line_number":26,"context_line":"    pass"},{"line_number":27,"context_line":"import errno"},{"line_number":28,"context_line":"import fcntl"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_02055f0f","line":25,"updated":"2015-07-08 18:49:07.000000000","message":"From talking to Sam Merritt, this is going to be...painful. FYI.","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"9017ce08775ea68222c28ac263819e7ed4d43043","unresolved":false,"context_lines":[{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    # NOTE(haypo): rfc822 was replaced with the email module. Disable temporary"},{"line_number":24,"context_line":"    # this import just to get a working \"tox -e py34\". rfc822 will be replaced"},{"line_number":25,"context_line":"    # with email later."},{"line_number":26,"context_line":"    pass"},{"line_number":27,"context_line":"import errno"},{"line_number":28,"context_line":"import fcntl"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_0753dfe2","line":25,"in_reply_to":"ba3cc151_02055f0f","updated":"2015-07-09 22:30:35.000000000","message":"I started a patch replacing rfc822 with email. The problem is that the rfc822.Message and email.message.Message don\u0027t have the same API, even on Python 2. rfc822.Message has getheader() method, whereas email.message.Message doesn\u0027t have this method.\n\nHopefully, both classes have the a get() method. So I don\u0027t think that it will be painful.\n\nSince my goal was to write the *shortest* patch to get a working tox -e py34, I prefer to work on this in a separated change.","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1ccb25e6037260453f3b41aa5e1a970f9e400eac","unresolved":false,"context_lines":[{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    # NOTE(haypo): rfc822 was replaced with the email module. Disable temporary"},{"line_number":24,"context_line":"    # this import just to get a working \"tox -e py34\". rfc822 will be replaced"},{"line_number":25,"context_line":"    # with email later."},{"line_number":26,"context_line":"    pass"},{"line_number":27,"context_line":"import errno"},{"line_number":28,"context_line":"import fcntl"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_e267c922","line":25,"in_reply_to":"ba3cc151_0753dfe2","updated":"2015-07-10 00:27:14.000000000","message":"Oh, I don\u0027t mean to say this should be blocking. Just a heads-up :)\n\nThe issue seemed to be a difference between PY2\u0027s rfc822.Message(fp, seekable\u003d0) (which leaves fp at the start of the body) and PY3\u0027s email.parser.Parser.parse(fp, headersonly\u003dTrue) (which doesn\u0027t; worse, it *slurps the whole thing into memory*). It\u0027s something that will need to be addressed eventually, but not right now.","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ca37d473e272a857d52f676fbbff88c6dd110bc4","unresolved":false,"context_lines":[{"line_number":88,"context_line":"logging._lock \u003d logging.threading.RLock()"},{"line_number":89,"context_line":"# setup notice level logging"},{"line_number":90,"context_line":"NOTICE \u003d 25"},{"line_number":91,"context_line":"logging.addLevelName(NOTICE, \u0027NOTICE\u0027)"},{"line_number":92,"context_line":"SysLogHandler.priority_map[\u0027NOTICE\u0027] \u003d \u0027notice\u0027"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"# These are lazily pulled from libc elsewhere"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_0288ff6f","line":91,"updated":"2015-07-08 18:49:07.000000000","message":"Thank you!","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"91c0d179c09647091df7a5132d42768bfc27e5fd","unresolved":false,"context_lines":[{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    # NOTE(haypo): rfc822 was replaced with the email module. Disable temporary"},{"line_number":24,"context_line":"    # this import just to get a working \"tox -e py34\". rfc822 will be replaced"},{"line_number":25,"context_line":"    # with email later."},{"line_number":26,"context_line":"    pass"},{"line_number":27,"context_line":"import errno"},{"line_number":28,"context_line":"import fcntl"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_5b6e4d30","line":25,"updated":"2015-07-21 09:49:30.000000000","message":"Later? Can\u0027t we fix this now, and if not why?","commit_id":"987cdd7c8ed42395786b5b21d7aeb120e0e23654"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"219cc7fa80631d2c99d6e3766356042b990339de","unresolved":false,"context_lines":[{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    # NOTE(haypo): rfc822 was replaced with the email module. Disable temporary"},{"line_number":24,"context_line":"    # this import just to get a working \"tox -e py34\". rfc822 will be replaced"},{"line_number":25,"context_line":"    # with email later."},{"line_number":26,"context_line":"    pass"},{"line_number":27,"context_line":"import errno"},{"line_number":28,"context_line":"import fcntl"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_44b170e0","line":25,"updated":"2015-07-21 18:03:53.000000000","message":"There is a pending change for it. See https://review.openstack.org/203304.\n\nBasically, though, py2 stdlib had this thing that could consume just the MIME headers off a file-like object and leave the body. py3 removed that module and replaced it with something that\u0027s generally much better for parsing emails, but can\u0027t do that header-consuming thing.","commit_id":"987cdd7c8ed42395786b5b21d7aeb120e0e23654"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"8659ec82665d1877ee36222ec16ffba90bfb7a03","unresolved":false,"context_lines":[{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    # NOTE(haypo): rfc822 was replaced with the email module. Disable temporary"},{"line_number":24,"context_line":"    # this import just to get a working \"tox -e py34\". rfc822 will be replaced"},{"line_number":25,"context_line":"    # with email later."},{"line_number":26,"context_line":"    pass"},{"line_number":27,"context_line":"import errno"},{"line_number":28,"context_line":"import fcntl"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_e4b74038","line":25,"in_reply_to":"3a50d1a3_44b170e0","updated":"2015-07-22 07:18:18.000000000","message":"Ah, interesting!\n\nI only played with email.message_from_file shortly, and these lines might be a starting point to fix this in line ~ 3400:\n\n import email\n msg \u003d email.message_from_file(doc_file)\n headers_as_tuple \u003d msg.items()\n\nWill comment on the other review as well.","commit_id":"987cdd7c8ed42395786b5b21d7aeb120e0e23654"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"afca9c92c21bc7f2087fadf326a44ec1817a9d1b","unresolved":false,"context_lines":[{"line_number":22,"context_line":"except ImportError:"},{"line_number":23,"context_line":"    # NOTE(haypo): rfc822 was replaced with the email module. Disable temporary"},{"line_number":24,"context_line":"    # this import just to get a working \"tox -e py34\". rfc822 will be replaced"},{"line_number":25,"context_line":"    # with email later."},{"line_number":26,"context_line":"    pass"},{"line_number":27,"context_line":"import errno"},{"line_number":28,"context_line":"import fcntl"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a50d1a3_190ba38f","line":25,"in_reply_to":"3a50d1a3_e4b74038","updated":"2015-07-22 12:57:17.000000000","message":"rfc822.Message and email.Message don\u0027t have the same API. For example, Swift uses the getheader() method whereas the email module only has a get() method. You can see the required change (getheader \u003d\u003e get) in this patch:\n\nhttps://review.openstack.org/#/c/203304/1/swift/common/utils.py\n\nI\u0027m not confident in writing such patch. So I prefer to do that later.\n\nI tried to write the *shortest* patch to get a working \"tox -e py34\". Sorry, I cannot solve *all* Python 3 issues in a single patch. I already sent a bunch of Python 3 patches, but core reviewers don\u0027t review them, so I\u0027m now trying a new approach.\n\nI even wrote an email to discuss the strategy to port Swift to Python 3:\n\nhttp://lists.openstack.org/pipermail/openstack-dev/2015-July/068739.html","commit_id":"987cdd7c8ed42395786b5b21d7aeb120e0e23654"}],"tox.ini":[{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"d410a5903c42607bff9a8c08d9c0599ab50686e3","unresolved":false,"context_lines":[{"line_number":34,"context_line":"  # NOTE(haypo): minimum hack to port pyeclib to Python 3 until pyeclib gets"},{"line_number":35,"context_line":"  # Python 3 support"},{"line_number":36,"context_line":"  # https://bitbucket.org/kmgreen2/pyeclib/pull-request/24/fix-python-3-issues/diff"},{"line_number":37,"context_line":"  sed -i -e \u0027s/^from \\(enum\\|utils\\)/from .\\1/g\u0027 .tox/py34/lib/python3.4/site-packages/pyeclib/ec_iface.py"},{"line_number":38,"context_line":"  nosetests test/unit/common/test_exceptions.py"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"[testenv:pep8]"}],"source_content_type":"text/x-properties","patch_set":4,"id":"ba3cc151_36247ec3","line":37,"updated":"2015-07-08 10:47:11.000000000","message":"Please use {toxinidir}","commit_id":"443e293fe887dc600f3374b82f3b110cf8da3cd7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ca37d473e272a857d52f676fbbff88c6dd110bc4","unresolved":false,"context_lines":[{"line_number":34,"context_line":"  # NOTE(haypo): minimum hack to port pyeclib to Python 3 until pyeclib gets"},{"line_number":35,"context_line":"  # Python 3 support"},{"line_number":36,"context_line":"  # https://bitbucket.org/kmgreen2/pyeclib/pull-request/24/fix-python-3-issues/diff"},{"line_number":37,"context_line":"  sed -i -e \u0027s/^from \\(enum\\|utils\\)/from .\\1/g\u0027 .tox/py34/lib/python3.4/site-packages/pyeclib/ec_iface.py"},{"line_number":38,"context_line":"  nosetests test/unit/common/test_exceptions.py"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"[testenv:pep8]"}],"source_content_type":"text/x-properties","patch_set":5,"id":"ba3cc151_ddd0b855","line":37,"updated":"2015-07-08 18:49:07.000000000","message":"Can we use `{envsitepackagesdir}` instead of `.tox/py34/lib/python3.4/site-packages`?","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"e135b9ea91b2fc49ab5d86e85bde1b36cab37508","unresolved":false,"context_lines":[{"line_number":34,"context_line":"  # NOTE(haypo): minimum hack to port pyeclib to Python 3 until pyeclib gets"},{"line_number":35,"context_line":"  # Python 3 support"},{"line_number":36,"context_line":"  # https://bitbucket.org/kmgreen2/pyeclib/pull-request/24/fix-python-3-issues/diff"},{"line_number":37,"context_line":"  sed -i -e \u0027s/^from \\(enum\\|utils\\)/from .\\1/g\u0027 .tox/py34/lib/python3.4/site-packages/pyeclib/ec_iface.py"},{"line_number":38,"context_line":"  nosetests test/unit/common/test_exceptions.py"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"[testenv:pep8]"}],"source_content_type":"text/x-properties","patch_set":5,"id":"ba3cc151_3115ef9a","line":37,"in_reply_to":"ba3cc151_ddd0b855","updated":"2015-07-10 08:36:49.000000000","message":"Done","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"9017ce08775ea68222c28ac263819e7ed4d43043","unresolved":false,"context_lines":[{"line_number":34,"context_line":"  # NOTE(haypo): minimum hack to port pyeclib to Python 3 until pyeclib gets"},{"line_number":35,"context_line":"  # Python 3 support"},{"line_number":36,"context_line":"  # https://bitbucket.org/kmgreen2/pyeclib/pull-request/24/fix-python-3-issues/diff"},{"line_number":37,"context_line":"  sed -i -e \u0027s/^from \\(enum\\|utils\\)/from .\\1/g\u0027 .tox/py34/lib/python3.4/site-packages/pyeclib/ec_iface.py"},{"line_number":38,"context_line":"  nosetests test/unit/common/test_exceptions.py"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"[testenv:pep8]"}],"source_content_type":"text/x-properties","patch_set":5,"id":"ba3cc151_c70657cd","line":37,"in_reply_to":"ba3cc151_ddd0b855","updated":"2015-07-09 22:30:35.000000000","message":"Oh cool, I didn\u0027t know this variable. Sure, it looks much better than hardcoded path.","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ca37d473e272a857d52f676fbbff88c6dd110bc4","unresolved":false,"context_lines":[{"line_number":35,"context_line":"  # Python 3 support"},{"line_number":36,"context_line":"  # https://bitbucket.org/kmgreen2/pyeclib/pull-request/24/fix-python-3-issues/diff"},{"line_number":37,"context_line":"  sed -i -e \u0027s/^from \\(enum\\|utils\\)/from .\\1/g\u0027 .tox/py34/lib/python3.4/site-packages/pyeclib/ec_iface.py"},{"line_number":38,"context_line":"  nosetests test/unit/common/test_exceptions.py"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"[testenv:pep8]"},{"line_number":41,"context_line":"commands \u003d"}],"source_content_type":"text/x-properties","patch_set":5,"id":"ba3cc151_5ed9ff55","line":38,"updated":"2015-07-08 18:49:07.000000000","message":"Is there any way that we can make this a blacklist instead of a whitelist? I want to force any new files to be written with PY3 compatibility in mind. I realize this will be a fairly long blacklist currently...","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"9017ce08775ea68222c28ac263819e7ed4d43043","unresolved":false,"context_lines":[{"line_number":35,"context_line":"  # Python 3 support"},{"line_number":36,"context_line":"  # https://bitbucket.org/kmgreen2/pyeclib/pull-request/24/fix-python-3-issues/diff"},{"line_number":37,"context_line":"  sed -i -e \u0027s/^from \\(enum\\|utils\\)/from .\\1/g\u0027 .tox/py34/lib/python3.4/site-packages/pyeclib/ec_iface.py"},{"line_number":38,"context_line":"  nosetests test/unit/common/test_exceptions.py"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"[testenv:pep8]"},{"line_number":41,"context_line":"commands \u003d"}],"source_content_type":"text/x-properties","patch_set":5,"id":"ba3cc151_87adaf85","line":38,"in_reply_to":"ba3cc151_5ed9ff55","updated":"2015-07-09 22:30:35.000000000","message":"I don\u0027t like the idea of forcing developers to write code compatible with Python 3 *today* in Swift. Since almost no Swift code in compatible with Python 3, it will be hard to test that new code works on Python 3, and it may need to modify existing code to port it.\n\nI expect the blacklist to be very long. I prefer the whitelist approach, already adopted by all other OpenStack projects.","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1ccb25e6037260453f3b41aa5e1a970f9e400eac","unresolved":false,"context_lines":[{"line_number":35,"context_line":"  # Python 3 support"},{"line_number":36,"context_line":"  # https://bitbucket.org/kmgreen2/pyeclib/pull-request/24/fix-python-3-issues/diff"},{"line_number":37,"context_line":"  sed -i -e \u0027s/^from \\(enum\\|utils\\)/from .\\1/g\u0027 .tox/py34/lib/python3.4/site-packages/pyeclib/ec_iface.py"},{"line_number":38,"context_line":"  nosetests test/unit/common/test_exceptions.py"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"[testenv:pep8]"},{"line_number":41,"context_line":"commands \u003d"}],"source_content_type":"text/x-properties","patch_set":5,"id":"ba3cc151_e02342a9","line":38,"in_reply_to":"ba3cc151_87adaf85","updated":"2015-07-10 00:27:14.000000000","message":"Fair enough.","commit_id":"de9fbeee22947ba11adb9cee0f86272745692083"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"de520b8e6d4e11cb88134914678ca58f3e5dbbcd","unresolved":false,"context_lines":[{"line_number":35,"context_line":"  # Python 3 support"},{"line_number":36,"context_line":"  # https://bitbucket.org/kmgreen2/pyeclib/pull-request/24/fix-python-3-issues/diff"},{"line_number":37,"context_line":"  sed -i -e \u0027s/^from \\(enum\\|utils\\)/from .\\1/g\u0027 {envsitepackagesdir}/pyeclib/ec_iface.py"},{"line_number":38,"context_line":"  nosetests test/unit/common/test_exceptions.py"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"[testenv:pep8]"},{"line_number":41,"context_line":"commands \u003d"}],"source_content_type":"text/x-properties","patch_set":8,"id":"3a50d1a3_b9386fef","line":38,"updated":"2015-07-22 13:01:25.000000000","message":"Good news: my pull request was merged! I\u0027m still waiting for a 1.0.8 release including this change.","commit_id":"987cdd7c8ed42395786b5b21d7aeb120e0e23654"}]}
