)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":30173,"name":"Ian Pittwood","email":"pittwoodian@gmail.com","username":"ianp"},"change_message_id":"4b5d85ce55a8523134bdfe57c9bc81ed9b9981da","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch handles the case where CA certs or authorities are loaded as"},{"line_number":10,"context_line":"byte strings. It also disables parsing YAML documents with python/object"},{"line_number":11,"context_line":"types directly into (non-dict) Python objects (which is PyYaml\u0027s default behavior),"},{"line_number":12,"context_line":"as it creates issues with the PeglegManagedDocument module."},{"line_number":13,"context_line":"The patch also fixes a bug where attempting to re-encrypt an already"},{"line_number":14,"context_line":"encrypted file would result in a serialized python object being written"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"dfbec78f_1246f722","line":11,"updated":"2019-05-09 01:22:46.000000000","message":"72 characters per line","commit_id":"3c060012813a87bf9a2f28f6333c95efa8967ad7"},{"author":{"_account_id":29624,"name":"Alexander Hughes","email":"Alexander.Hughes@pm.me","username":"alexanderhughes"},"change_message_id":"f77a6f1b1a3821bc83300d9f77549f7a0f8581bc","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch handles the case where CA certs or authorities are loaded as"},{"line_number":10,"context_line":"byte strings. It also disables parsing YAML documents with python/object"},{"line_number":11,"context_line":"types directly into (non-dict) Python objects (which is PyYaml\u0027s default behavior),"},{"line_number":12,"context_line":"as it creates issues with the PeglegManagedDocument module."},{"line_number":13,"context_line":"The patch also fixes a bug where attempting to re-encrypt an already"},{"line_number":14,"context_line":"encrypted file would result in a serialized python object being written"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bfb3d3c7_75e4a4e0","line":11,"range":{"start_line":11,"start_character":72,"end_line":11,"end_character":83},"updated":"2019-05-28 19:31:19.000000000","message":"extends over character limit (70)","commit_id":"030797fd955cd6840d95032cb9ad7186c9e15fc3"},{"author":{"_account_id":29401,"name":"Lev Morgan","email":"morgan.lev@gmail.com","username":"levmorgan"},"change_message_id":"9f0d5a974eefe3637f2ded3035e18d2401d86899","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch handles the case where CA certs or authorities are loaded as"},{"line_number":10,"context_line":"byte strings. It also disables parsing YAML documents with python/object"},{"line_number":11,"context_line":"types directly into (non-dict) Python objects (which is PyYaml\u0027s default behavior),"},{"line_number":12,"context_line":"as it creates issues with the PeglegManagedDocument module."},{"line_number":13,"context_line":"The patch also fixes a bug where attempting to re-encrypt an already"},{"line_number":14,"context_line":"encrypted file would result in a serialized python object being written"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bfb3d3c7_95d358d5","line":11,"range":{"start_line":11,"start_character":72,"end_line":11,"end_character":83},"in_reply_to":"bfb3d3c7_75e4a4e0","updated":"2019-05-28 19:33:51.000000000","message":"Done","commit_id":"030797fd955cd6840d95032cb9ad7186c9e15fc3"}],"pegleg/engine/catalog/pki_utility.py":[{"author":{"_account_id":28235,"name":"Aaron Sheffield","email":"ajs@sheffieldfamily.net","username":"aaronsheffield"},"change_message_id":"6ffb19f2b99a5e782bcfcab20c1650f74b96d6f5","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @property"},{"line_number":67,"context_line":"    def ca_config(self):"},{"line_number":68,"context_line":"        if self.duration is None or self.duration \u003c 0:"},{"line_number":69,"context_line":"            raise exceptions.PKICertificateInvalidDuration()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        if not self._ca_config_string:"}],"source_content_type":"text/x-python","patch_set":9,"id":"dfbec78f_395e1276","line":68,"range":{"start_line":68,"start_character":8,"end_line":68,"end_character":53},"updated":"2019-05-15 19:03:08.000000000","message":"I like this change, easier to read.","commit_id":"3c060012813a87bf9a2f28f6333c95efa8967ad7"}],"pegleg/engine/site.py":[{"author":{"_account_id":28235,"name":"Aaron Sheffield","email":"ajs@sheffieldfamily.net","username":"aaronsheffield"},"change_message_id":"14395bb6099c3e67e09f371ba09747aa8053a010","unresolved":false,"context_lines":[{"line_number":195,"context_line":"            try:"},{"line_number":196,"context_line":"                tag \u003d repo.active_branch.name"},{"line_number":197,"context_line":"            except TypeError as e:"},{"line_number":198,"context_line":"                if \"HEAD is a detached symbolic reference\" in str(e):"},{"line_number":199,"context_line":"                    tag \u003d \"Detached HEAD\""},{"line_number":200,"context_line":"                else:"},{"line_number":201,"context_line":"                    raise e"}],"source_content_type":"text/x-python","patch_set":12,"id":"bfb3d3c7_d401c439","line":198,"range":{"start_line":198,"start_character":20,"end_line":198,"end_character":57},"updated":"2019-05-29 13:53:23.000000000","message":"This seems fragile, but I\u0027m not finding a better alternative (error code or something).","commit_id":"d6ead96119c216b8641998965a80157dba4a6d23"}],"pegleg/engine/util/catalog.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c28b22d5a9ce0d2ea3fa12ecbde7fd8dfa624e3d","unresolved":false,"context_lines":[{"line_number":22,"context_line":"__all__ \u003d (\u0027iterate\u0027, )"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def decode_bytes(obj):"},{"line_number":26,"context_line":"    \"\"\"If the argument is bytes, decode it."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    :param Object obj: A string or byte object"},{"line_number":29,"context_line":"    :return: A string representation of obj"},{"line_number":30,"context_line":"    :rtype: str"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":"    if isinstance(obj, bytes):"},{"line_number":34,"context_line":"        return obj.decode(\u0027utf-8\u0027)"},{"line_number":35,"context_line":"    elif isinstance(obj, str):"},{"line_number":36,"context_line":"        return obj"},{"line_number":37,"context_line":"    else:"},{"line_number":38,"context_line":"        raise ValueError(\"ERROR: {} is not bytes or a string.\".format(obj))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def iterate(kind, sitename\u003dNone, documents\u003dNone):"},{"line_number":41,"context_line":"    \"\"\"Retrieve the list of catalog documents by catalog schema ``kind``."}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_db8488d5","line":38,"range":{"start_line":25,"start_character":0,"end_line":38,"end_character":75},"updated":"2019-03-16 01:54:36.000000000","message":"You can alternatively use: http://git.openstack.org/cgit/openstack/oslo.utils/tree/oslo_utils/encodeutils.py#n27","commit_id":"5b747512935a55fdeadddc17cdd9f7fab2b01fc7"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"3d9ac5fb2d2f8d4e54d25891db890a144a8477e2","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"__all__ \u003d (\u0027iterate\u0027, )"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def decode_bytes(obj):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_68e3eca5","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":23},"updated":"2019-03-21 02:20:57.000000000","message":"shouldn\u0027t we add decode_bytes here as well?","commit_id":"6951813d03d1c70993bf3b4bc68e6f7836a97b7b"},{"author":{"_account_id":29401,"name":"Lev Morgan","email":"morgan.lev@gmail.com","username":"levmorgan"},"change_message_id":"f056da98c03dae8444cf87d4b9de4e6c8208f021","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"__all__ \u003d (\u0027iterate\u0027, )"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def decode_bytes(obj):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_8dfa8640","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":23},"in_reply_to":"5fc1f717_68e3eca5","updated":"2019-03-25 15:09:29.000000000","message":"Fixed","commit_id":"6951813d03d1c70993bf3b4bc68e6f7836a97b7b"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"3d9ac5fb2d2f8d4e54d25891db890a144a8477e2","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":"    if isinstance(obj, bytes):"},{"line_number":34,"context_line":"        return obj.decode(\u0027utf-8\u0027)"},{"line_number":35,"context_line":"    elif isinstance(obj, str):"},{"line_number":36,"context_line":"        return obj"},{"line_number":37,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_a802343d","line":34,"range":{"start_line":34,"start_character":26,"end_line":34,"end_character":33},"updated":"2019-03-21 02:20:57.000000000","message":"is the encoding always utf-8, can the system encoding be ascii?","commit_id":"6951813d03d1c70993bf3b4bc68e6f7836a97b7b"},{"author":{"_account_id":29401,"name":"Lev Morgan","email":"morgan.lev@gmail.com","username":"levmorgan"},"change_message_id":"f056da98c03dae8444cf87d4b9de4e6c8208f021","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":"    if isinstance(obj, bytes):"},{"line_number":34,"context_line":"        return obj.decode(\u0027utf-8\u0027)"},{"line_number":35,"context_line":"    elif isinstance(obj, str):"},{"line_number":36,"context_line":"        return obj"},{"line_number":37,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_cd040e4d","line":34,"range":{"start_line":34,"start_character":26,"end_line":34,"end_character":33},"in_reply_to":"5fc1f717_a802343d","updated":"2019-03-25 15:09:29.000000000","message":"utf-8 is the default encoding in Python 3, so it\u0027s probably the way to go unless we have a good reason to use ASCII.\nhttps://docs.python.org/3/howto/unicode.html","commit_id":"6951813d03d1c70993bf3b4bc68e6f7836a97b7b"},{"author":{"_account_id":30173,"name":"Ian Pittwood","email":"pittwoodian@gmail.com","username":"ianp"},"change_message_id":"0c9225cdbc5ef89757f39c937ca6793800377552","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    :param Object obj: A string or byte object"},{"line_number":29,"context_line":"    :return: A string representation of obj"},{"line_number":30,"context_line":"    :rtype: str"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":"    if isinstance(obj, bytes):"},{"line_number":34,"context_line":"        return obj.decode(\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"bfb3d3c7_a610aa58","line":31,"updated":"2019-05-29 12:22:58.000000000","message":"nit: extra line","commit_id":"d6ead96119c216b8641998965a80157dba4a6d23"}],"pegleg/engine/util/files.py":[{"author":{"_account_id":29624,"name":"Alexander Hughes","email":"Alexander.Hughes@pm.me","username":"alexanderhughes"},"change_message_id":"cc7e6a0f6786f8719b8485be64232508e22c41b8","unresolved":false,"context_lines":[{"line_number":323,"context_line":"                    explicit_end\u003dTrue,"},{"line_number":324,"context_line":"                    default_flow_style\u003dFalse)"},{"line_number":325,"context_line":"            else:"},{"line_number":326,"context_line":"                raise ValueError(\u0027data must be str or dict, \u0027"},{"line_number":327,"context_line":"                                 \u0027not {}\u0027.format(type(data)))"},{"line_number":328,"context_line":"    except EnvironmentError as e:"},{"line_number":329,"context_line":"        raise click.ClickError("}],"source_content_type":"text/x-python","patch_set":9,"id":"dfbec78f_82e5acaa","line":326,"range":{"start_line":326,"start_character":34,"end_line":326,"end_character":35},"updated":"2019-05-09 13:50:52.000000000","message":"nit: capitalization","commit_id":"3c060012813a87bf9a2f28f6333c95efa8967ad7"}],"tests/unit/engine/test_secrets.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"22ae28636c0a2d3edae12bc7bd388182fa309193","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    reason\u003d\u0027cfssl must be installed to execute these tests\u0027)"},{"line_number":265,"context_line":"@mock.patch.dict(os.environ, {"},{"line_number":266,"context_line":"    ENV_PASSPHRASE: \u0027ytrr89erARAiPE34692iwUMvWqqBvC\u0027,"},{"line_number":267,"context_line":"    ENV_SALT: \u0027MySecretSalt1234567890][\u0027"},{"line_number":268,"context_line":"})"},{"line_number":269,"context_line":"def test_check_expiry(create_tmp_deployment_files):"},{"line_number":270,"context_line":"    \"\"\" Validates check_expiry \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"5fc1f717_c057b5c9","line":267,"range":{"start_line":267,"start_character":15,"end_line":267,"end_character":37},"updated":"2019-03-27 21:30:38.000000000","message":"Something like test_utils.rand_passphrase(length\u003d24) or whatever the helper function is called would be better but doesn\u0027t really matter.","commit_id":"dbb912e77fcafe712544b0b9de1a681eb415dd4a"}],"tests/unit/engine/util/test_files.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"22ae28636c0a2d3edae12bc7bd388182fa309193","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    with open(os.path.join(temp_path, \"good_yaml.yaml\"), \"w\") as good_yaml:"},{"line_number":57,"context_line":"        good_yaml.write(\"!!python/name:builtins.dict \u0027\u0027\\n\")"},{"line_number":58,"context_line":"    read_files \u003d files.read(os.path.join(temp_path, \"good_yaml.yaml\"))"},{"line_number":59,"context_line":"    assert dict not in read_files"}],"source_content_type":"text/x-python","patch_set":6,"id":"5fc1f717_60fb61bd","line":59,"range":{"start_line":59,"start_character":3,"end_line":59,"end_character":33},"updated":"2019-03-27 21:30:38.000000000","message":"?\n\nYou mean `assert isinstance(read_files, dict)`?","commit_id":"dbb912e77fcafe712544b0b9de1a681eb415dd4a"},{"author":{"_account_id":29401,"name":"Lev Morgan","email":"morgan.lev@gmail.com","username":"levmorgan"},"change_message_id":"082ee1d3c54172135058b1d71c67dc6bdfcb24f0","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    with open(os.path.join(temp_path, \"good_yaml.yaml\"), \"w\") as good_yaml:"},{"line_number":57,"context_line":"        good_yaml.write(\"!!python/name:builtins.dict \u0027\u0027\\n\")"},{"line_number":58,"context_line":"    read_files \u003d files.read(os.path.join(temp_path, \"good_yaml.yaml\"))"},{"line_number":59,"context_line":"    assert dict not in read_files"}],"source_content_type":"text/x-python","patch_set":6,"id":"5fc1f717_46fb38bd","line":59,"range":{"start_line":59,"start_character":3,"end_line":59,"end_character":33},"in_reply_to":"5fc1f717_60fb61bd","updated":"2019-04-05 16:29:24.000000000","message":"Ok, so this is kind of a weird one. My read method is configured to ignore serialized python objects completely and just read the YAML text. I needed something that PyYAML would definitely be able to parse, so I used the built-in dict method. So, with PyYAML\u0027s default behavior, we would get the actual, built-in method dict in read_files.\n\nI\u0027ll try to make this weird-looking test a little clearer, and add in a comment to explain it.","commit_id":"dbb912e77fcafe712544b0b9de1a681eb415dd4a"}]}
