)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"7fb61b4731790769b0cfc52cccd7125ae5413a80","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Bin Zhou \u003czhou.bin9@zte.com.cn\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-06-12 10:25:54 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"refactor QemuImgInfo"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"QemuImgInfo is realized by parsing the output string of \u0027qemu-img info"},{"line_number":10,"context_line":"**.img\u0027 line by line, it\u0027s complicated and improvment can be done. The"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7aa08908_d8e01099","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":20},"updated":"2016-06-12 05:51:30.000000000","message":"I think this doesn\u0027t refactor QemuImgInfo, just provide extra parameter \u0027format\u0027 to support json format of command output.","commit_id":"595719528c6dd61826d10468780571668afad3ac"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"48de2a824a3d4fa00871dc5dec0a68bbf3d62da0","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Bin Zhou \u003czhou.bin9@zte.com.cn\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-06-15 15:18:08 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"refactor QemuImgInfo"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"QemuImgInfo is realized by parsing the output string of \u0027qemu-img info"},{"line_number":10,"context_line":"**.img\u0027 line by line, it\u0027s complicated and improvment can be done. The"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7aa08908_04f06d65","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":20},"updated":"2016-06-17 09:05:25.000000000","message":"what about change to? \n\nSupport json format output from qemu command","commit_id":"d58aa12bb7609e2989b2be8d5a0285b981277908"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"48de2a824a3d4fa00871dc5dec0a68bbf3d62da0","unresolved":false,"context_lines":[{"line_number":9,"context_line":"QemuImgInfo is realized by parsing the output string of \u0027qemu-img info"},{"line_number":10,"context_line":"**.img\u0027 line by line, it\u0027s complicated and improvment can be done. The"},{"line_number":11,"context_line":"command \u0027qemu-img info **.img --output json\u0027 will produce json style"},{"line_number":12,"context_line":"output and arguments can be parsed easily by calling json.loads. This"},{"line_number":13,"context_line":"refactor will get rid of the frustrating regular expression and string"},{"line_number":14,"context_line":"functions."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: Iefa139dc4bcea864cb86371d8a24df0e4695169c"},{"line_number":17,"context_line":"Closes-Bug:#1590252"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7aa08908_a476b9d5","line":14,"range":{"start_line":12,"start_character":64,"end_line":14,"end_character":10},"updated":"2016-06-17 09:05:25.000000000","message":"This is not refactor, but add support json format output parsing.","commit_id":"d58aa12bb7609e2989b2be8d5a0285b981277908"}],"oslo_utils/imageutils.py":[{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"78df5de39569a0f0b6827b4fd7ab432429601f26","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __init__(self, cmd_output\u003dNone, format\u003d\u0027human\u0027):"},{"line_number":45,"context_line":"        if format \u003d\u003d \u0027json\u0027:"},{"line_number":46,"context_line":"            print cmd_output"},{"line_number":47,"context_line":"            details \u003d json.loads(cmd_output or \u0027\u0027)"},{"line_number":48,"context_line":"            self.image \u003d details.get(\u0027filename\u0027)"},{"line_number":49,"context_line":"            self.backing_file \u003d details.get(\u0027backing-filename\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_0db858c7","line":46,"updated":"2016-06-08 10:19:01.000000000","message":"Ahem","commit_id":"426efabdc9588c9be6b49ccd38c216023141960b"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"82b377837f4a9785a67ef6924a9688a7d6087eef","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    def __init__(self, cmd_output\u003dNone, format\u003d\u0027human\u0027):"},{"line_number":45,"context_line":"        if format \u003d\u003d \u0027json\u0027:"},{"line_number":46,"context_line":"            print cmd_output"},{"line_number":47,"context_line":"            details \u003d json.loads(cmd_output or \u0027\u0027)"},{"line_number":48,"context_line":"            self.image \u003d details.get(\u0027filename\u0027)"},{"line_number":49,"context_line":"            self.backing_file \u003d details.get(\u0027backing-filename\u0027)"},{"line_number":50,"context_line":"            self.file_format \u003d details.get(\u0027format\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_57c75495","line":47,"updated":"2016-06-09 05:20:03.000000000","message":"So i\u0027m pretty sure u don\u0027t want cmd_output or \u0027\u0027 or perhaps u want cmd_output or \u0027{}\u0027 because if its a empty string this method will crash.\n\n    \u003e\u003e\u003e import json\n    \u003e\u003e\u003e details \u003d json.loads(\"\")\n    Traceback (most recent call last):\n      File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n      File \"/usr/lib/python2.7/json/__init__.py\", line 338, in loads\n        return _default_decoder.decode(s)\n      File \"/usr/lib/python2.7/json/decoder.py\", line 366, in decode\n        obj, end \u003d self.raw_decode(s, idx\u003d_w(s, 0).end())\n      File \"/usr/lib/python2.7/json/decoder.py\", line 384, in raw_decode\n        raise ValueError(\"No JSON object could be decoded\")\n    ValueError: No JSON object could be decoded\n\nIs that the intention?","commit_id":"426efabdc9588c9be6b49ccd38c216023141960b"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"46932787d8210b6334ced406c2213c2e4a6f847b","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            self.disk_size \u003d details.get(\u0027actual-size\u0027)"},{"line_number":54,"context_line":"            self.snapshots \u003d details.get(\u0027snapshots\u0027, [])"},{"line_number":55,"context_line":"            self.encrypted \u003d details.get(\u0027encrypted\u0027)"},{"line_number":56,"context_line":"        else:"},{"line_number":57,"context_line":"            details \u003d self._parse(cmd_output or \u0027\u0027)"},{"line_number":58,"context_line":"            self.image \u003d details.get(\u0027image\u0027)"},{"line_number":59,"context_line":"            self.backing_file \u003d details.get(\u0027backing_file\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_d091c7f2","line":56,"updated":"2016-06-08 10:32:11.000000000","message":"we should deprecate this path using Ifd83cd74ac397e7bc6def11a38b46de5dff2acfa","commit_id":"426efabdc9588c9be6b49ccd38c216023141960b"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"d2a38534d607ab51705cf0ca60dda74959415269","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            self.disk_size \u003d details.get(\u0027actual-size\u0027)"},{"line_number":54,"context_line":"            self.snapshots \u003d details.get(\u0027snapshots\u0027, [])"},{"line_number":55,"context_line":"            self.encrypted \u003d details.get(\u0027encrypted\u0027)"},{"line_number":56,"context_line":"        else:"},{"line_number":57,"context_line":"            details \u003d self._parse(cmd_output or \u0027\u0027)"},{"line_number":58,"context_line":"            self.image \u003d details.get(\u0027image\u0027)"},{"line_number":59,"context_line":"            self.backing_file \u003d details.get(\u0027backing_file\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_1e9f6eb5","line":56,"in_reply_to":"7aa08908_d091c7f2","updated":"2016-06-09 23:31:53.000000000","message":"Sounds like that decision is up to nova (or glance) right? What version(s) of qemu-img do they expect?","commit_id":"426efabdc9588c9be6b49ccd38c216023141960b"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"4ab0bb97a6af32bec5bf7077820bdd9917e329b6","unresolved":false,"context_lines":[{"line_number":19,"context_line":"Helper methods to deal with images."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":".. versionadded:: 3.1"},{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import json"},{"line_number":25,"context_line":"import re"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_64801cc0","line":22,"updated":"2016-06-13 22:54:16.000000000","message":"Might make sense to have a versionchanged here denoting the json format acceptance.","commit_id":"58aad27e28a00474c426eccd3fee02d417ec4a13"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"48de2a824a3d4fa00871dc5dec0a68bbf3d62da0","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":".. versionadded:: 3.1"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":".. versionchanged:: 3.2"},{"line_number":24,"context_line":"   add command `qemu-img info`\u0027s output format json."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"\"\"\""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_449b9566","line":24,"range":{"start_line":23,"start_character":0,"end_line":24,"end_character":52},"updated":"2016-06-17 09:05:25.000000000","message":"this should be for class docstring , not a module docstring.\nso put this in line 40 ?\n\n .. versionchanged:: 3.2\n   add paramter format.","commit_id":"d58aa12bb7609e2989b2be8d5a0285b981277908"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"48de2a824a3d4fa00871dc5dec0a68bbf3d62da0","unresolved":false,"context_lines":[{"line_number":35,"context_line":"class QemuImgInfo(object):"},{"line_number":36,"context_line":"    \"\"\"Parse Qemu image information from command `qemu-img info`\u0027s output."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    The instance of :class:`QemuImgInfo` has properties: `image`,"},{"line_number":39,"context_line":"    `backing_file`, `file_format`, `virtual_size`, `cluster_size`,"},{"line_number":40,"context_line":"    `disk_size`, `snapshots` and `encrypted`."},{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":"    BACKING_FILE_RE \u003d re.compile((r\"^(.*?)\\s*\\(actual\\s+path\\s*:\""},{"line_number":43,"context_line":"                                  r\"\\s+(.*?)\\)\\s*$\"), re.I)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_7e05810e","line":40,"range":{"start_line":38,"start_character":0,"end_line":40,"end_character":45},"updated":"2016-06-17 09:05:25.000000000","message":"need add more doc about new parameter, then user can know how to use it.","commit_id":"d58aa12bb7609e2989b2be8d5a0285b981277908"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"292852c842177f6b2271bfb283709803d8409012","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":".. versionadded:: 3.1"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":".. versionchanged:: 3.2"},{"line_number":24,"context_line":"   add paramter format."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a9d85d2_ad5f3d74","line":23,"range":{"start_line":23,"start_character":20,"end_line":23,"end_character":23},"updated":"2016-06-18 17:57:22.000000000","message":"The latest released oslo.utils is 3.13.0. So this needs to be 3.14 or later if its released again before this patch merges.","commit_id":"2066e6edf479caceb19d0ad78817303c42dc7a98"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"292852c842177f6b2271bfb283709803d8409012","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    The instance of :class:`QemuImgInfo` has properties: `image`,"},{"line_number":39,"context_line":"    `backing_file`, `file_format`, `virtual_size`, `cluster_size`,"},{"line_number":40,"context_line":"    `disk_size`, `snapshots` and `encrypted`."},{"line_number":41,"context_line":"    add command `qemu-img info`\u0027s output format, the format can be set to"},{"line_number":42,"context_line":"    \u0027json\u0027 or \u0027human\u0027. With \u0027json\u0027 format output, command \u0027qemu-img info"},{"line_number":43,"context_line":"    --output json\u0027 should be called."},{"line_number":44,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a9d85d2_ed594590","line":41,"range":{"start_line":41,"start_character":4,"end_line":41,"end_character":47},"updated":"2016-06-18 17:57:22.000000000","message":"Not sure I understand this statement as written. I think it just needs to mention that the format parameter and the effects of human vs. json.","commit_id":"2066e6edf479caceb19d0ad78817303c42dc7a98"}],"oslo_utils/tests/test_imageutils.py":[{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"7fb61b4731790769b0cfc52cccd7125ae5413a80","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        self.assertEqual(len(image_info.snapshots), 0)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"class ImageUtilsJSONTestCase(test_base.BaseTestCase):"},{"line_number":205,"context_line":"    def test_qemu_img_info_json_format(self):"},{"line_number":206,"context_line":"        img_output \u003d \u0027{\\"},{"line_number":207,"context_line":"                       \"virtual-size\": 41126400,\\"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_b802643c","line":204,"range":{"start_line":204,"start_character":51,"end_line":204,"end_character":53},"updated":"2016-06-12 05:51:30.000000000","message":"Please add  empty output test case.","commit_id":"595719528c6dd61826d10468780571668afad3ac"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"4ab0bb97a6af32bec5bf7077820bdd9917e329b6","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"class ImageUtilsJSONTestCase(test_base.BaseTestCase):"},{"line_number":205,"context_line":"    def test_qemu_img_info_json_format(self):"},{"line_number":206,"context_line":"        img_output \u003d \u0027{\\"},{"line_number":207,"context_line":"                       \"virtual-size\": 41126400,\\"},{"line_number":208,"context_line":"                       \"filename\": \"fake_img\",\\"},{"line_number":209,"context_line":"                       \"cluster-size\": 65536,\\"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_a427a410","line":206,"updated":"2016-06-13 22:54:16.000000000","message":"Please use multi-line strings instead of \\","commit_id":"58aad27e28a00474c426eccd3fee02d417ec4a13"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"4ab0bb97a6af32bec5bf7077820bdd9917e329b6","unresolved":false,"context_lines":[{"line_number":211,"context_line":"                       \"actual-size\": 13168640\\"},{"line_number":212,"context_line":"                      }\u0027"},{"line_number":213,"context_line":"        image_info \u003d imageutils.QemuImgInfo(img_output, format\u003d\u0027json\u0027)"},{"line_number":214,"context_line":"        self.assertEqual(image_info.virtual_size, 41126400)"},{"line_number":215,"context_line":"        self.assertEqual(image_info.image, \u0027fake_img\u0027)"},{"line_number":216,"context_line":"        self.assertEqual(image_info.cluster_size, 65536)"},{"line_number":217,"context_line":"        self.assertEqual(image_info.file_format, \u0027qcow2\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_2413b4b9","line":214,"range":{"start_line":214,"start_character":13,"end_line":214,"end_character":24},"updated":"2016-06-13 22:54:16.000000000","message":"Order of arguments for assertEqual should be (expected, actual)","commit_id":"58aad27e28a00474c426eccd3fee02d417ec4a13"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"4ab0bb97a6af32bec5bf7077820bdd9917e329b6","unresolved":false,"context_lines":[{"line_number":220,"context_line":"    def test_qemu_img_info_json_format_blank(self):"},{"line_number":221,"context_line":"        img_output \u003d \u0027{}\u0027"},{"line_number":222,"context_line":"        image_info \u003d imageutils.QemuImgInfo(img_output, format\u003d\u0027json\u0027)"},{"line_number":223,"context_line":"        self.assertEqual(image_info.virtual_size, None)"},{"line_number":224,"context_line":"        self.assertEqual(image_info.image, None)"},{"line_number":225,"context_line":"        self.assertEqual(image_info.cluster_size, None)"},{"line_number":226,"context_line":"        self.assertEqual(image_info.file_format, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_440ec08c","line":223,"updated":"2016-06-13 22:54:16.000000000","message":"Why not use assertIsNone() ?","commit_id":"58aad27e28a00474c426eccd3fee02d417ec4a13"}]}
