)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"24d7f01d96bc614d1a159fc3bd8fbf40280eccc9","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Aarti Kriplani \u003caarti.kriplani@RACKSPACE.COM\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-05-27 16:21:14 +0530"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Added logging for sparse copy"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"After 5 seconds, logs how many bytes have been written already, and how"},{"line_number":10,"context_line":"many are left, so as to be able to track progress of the long running"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAPH%2F%2FnWg%3D","line":7,"updated":"2013-05-29 10:07:49.000000000","message":"maybe add \"xenapi:\" at the beginning.\nIts specific to the xenapi driver.","commit_id":"5361da8c66f4d387d386490543d282f071daa3d1"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"0bda391f47509454a63841ea470b48e3455d5455","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"xenapi: Added logging for sparse copy"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"After 5 seconds, logs how many bytes have been written already, and how"},{"line_number":10,"context_line":"many are left, so as to be able to track progress of the long running"},{"line_number":11,"context_line":"task."},{"line_number":12,"context_line":"Implements blueprint log-progress-of-sparse-dd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAPH%2F%2Fdn4%3D","line":9,"updated":"2013-06-03 12:57:37.000000000","message":"The default appears to be 300 seconds.","commit_id":"a3e0235e89d916fd2ae1e9c3e2455b5af03bcb24"}],"nova/tests/virt/xenapi/test_vm_utils.py":[{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"db4df9b1c29fe78274ef3bf1d1ee0e7750b46baa","unresolved":false,"context_lines":[{"line_number":366,"context_line":"        vm_utils._resize_part_and_fs(\"fake\", 0, 20, 10)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"    def test_log_progress_if_required(self):"},{"line_number":369,"context_line":"        vm_utils.LOG.info(\"BLAH\")"},{"line_number":370,"context_line":"        self.mox.StubOutWithMock(vm_utils.LOG, \"debug\")"},{"line_number":371,"context_line":"        vm_utils.LOG.debug(mox.IgnoreArg(), mox.IgnoreArg())"},{"line_number":372,"context_line":"        current \u003d timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FgtQ%3D","line":369,"updated":"2013-05-31 14:52:33.000000000","message":"Is this necessary?","commit_id":"87be3328caec5e63042b44da297730ee10567eb3"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"db4df9b1c29fe78274ef3bf1d1ee0e7750b46baa","unresolved":false,"context_lines":[{"line_number":368,"context_line":"    def test_log_progress_if_required(self):"},{"line_number":369,"context_line":"        vm_utils.LOG.info(\"BLAH\")"},{"line_number":370,"context_line":"        self.mox.StubOutWithMock(vm_utils.LOG, \"debug\")"},{"line_number":371,"context_line":"        vm_utils.LOG.debug(mox.IgnoreArg(), mox.IgnoreArg())"},{"line_number":372,"context_line":"        current \u003d timeutils.utcnow()"},{"line_number":373,"context_line":"        timeutils.set_time_override(current)"},{"line_number":374,"context_line":"        timeutils.advance_time_seconds(vm_utils.PROGRESS_LOG_INTERVAL + 1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FgtU%3D","line":371,"updated":"2013-05-31 14:52:33.000000000","message":"I\u0027m going to be picky here and ask that you not ignore the args.  It should be easy enough to construct the args that will be sent to LOG.debug() based on the parameters you pass in below.\n\nSame thing for the test below.","commit_id":"87be3328caec5e63042b44da297730ee10567eb3"}],"nova/virt/xenapi/vm_utils.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"24d7f01d96bc614d1a159fc3bd8fbf40280eccc9","unresolved":false,"context_lines":[{"line_number":2110,"context_line":"    bytes_read \u003d 0"},{"line_number":2111,"context_line":"    skipped_bytes \u003d 0"},{"line_number":2112,"context_line":"    left \u003d virtual_size"},{"line_number":2113,"context_line":"    PROGRESS_LOG_INTERVAL \u003d 5"},{"line_number":2114,"context_line":""},{"line_number":2115,"context_line":"    LOG.debug(_(\"Starting sparse_copy src\u003d%(src_path)s dst\u003d%(dst_path)s \""},{"line_number":2116,"context_line":"                \"virtual_size\u003d%(virtual_size)d block_size\u003d%(block_size)d\"),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2FnaE%3D","line":2113,"updated":"2013-05-29 10:07:49.000000000","message":"probably better at the top of the file, but not a big deal.","commit_id":"5361da8c66f4d387d386490543d282f071daa3d1"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"24d7f01d96bc614d1a159fc3bd8fbf40280eccc9","unresolved":false,"context_lines":[{"line_number":2141,"context_line":""},{"line_number":2142,"context_line":"                        data \u003d src.read(min(block_size, left))"},{"line_number":2143,"context_line":"                        greenthread.sleep(0)"},{"line_number":2144,"context_line":"                        datetime_now \u003d datetime.datetime.now()"},{"line_number":2145,"context_line":"                        if (datetime_now - progress_last_log_time).\\"},{"line_number":2146,"context_line":"                            minutes \u003e\u003d PROGRESS_LOG_INTERVAL:"},{"line_number":2147,"context_line":"                            progress_last_log_time \u003d datetime_now"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2FnaM%3D","line":2144,"updated":"2013-05-29 10:07:49.000000000","message":"micro nit, but I would pull this into a method like \"_log_progress_if_required\" just to make things easier to read.","commit_id":"5361da8c66f4d387d386490543d282f071daa3d1"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"7a1b90d7730f4cf17ca0e70a9822a2aa6178a6ba","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import contextlib"},{"line_number":25,"context_line":"import datetime"},{"line_number":26,"context_line":"import decimal"},{"line_number":27,"context_line":"import os"},{"line_number":28,"context_line":"import re"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2FkFY%3D","line":25,"updated":"2013-05-30 13:40:28.000000000","message":"Instead of datetime you should look at openstack/common/timeutils.py.  The utcnow method should work for you and has the set_time_override method to help with testing.","commit_id":"257c73e3154aeff9d2db16a1cfa7674ae9d5a6d5"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"7a1b90d7730f4cf17ca0e70a9822a2aa6178a6ba","unresolved":false,"context_lines":[{"line_number":146,"context_line":"MBR_SIZE_BYTES \u003d MBR_SIZE_SECTORS * SECTOR_SIZE"},{"line_number":147,"context_line":"KERNEL_DIR \u003d \u0027/boot/guest\u0027"},{"line_number":148,"context_line":"MAX_VDI_CHAIN_SIZE \u003d 16"},{"line_number":149,"context_line":"PROGRESS_LOG_INTERVAL \u003d 5"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"class ImageType(object):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2FkGQ%3D","line":149,"updated":"2013-05-30 13:40:28.000000000","message":"Could you add a comment with units here.  5 isn\u0027t very helpful on its own.","commit_id":"257c73e3154aeff9d2db16a1cfa7674ae9d5a6d5"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"1899a656d5541a6d987972b028e4da69dfbbd77c","unresolved":false,"context_lines":[{"line_number":2140,"context_line":"    utils.execute(\u0027tune2fs\u0027, \u0027-j\u0027, partition_path, run_as_root\u003dTrue)"},{"line_number":2141,"context_line":""},{"line_number":2142,"context_line":""},{"line_number":2143,"context_line":"def _log_progress_if_required(left, last_log_time, virtual_size):"},{"line_number":2144,"context_line":"    datetime_now \u003d datetime.datetime.now()"},{"line_number":2145,"context_line":"    if (datetime_now - last_log_time).minutes \\"},{"line_number":2146,"context_line":"            \u003e\u003d PROGRESS_LOG_INTERVAL:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2FkhM%3D","line":2143,"updated":"2013-05-30 10:23:49.000000000","message":"I would love to see a test for at least this function.","commit_id":"257c73e3154aeff9d2db16a1cfa7674ae9d5a6d5"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"1899a656d5541a6d987972b028e4da69dfbbd77c","unresolved":false,"context_lines":[{"line_number":2142,"context_line":""},{"line_number":2143,"context_line":"def _log_progress_if_required(left, last_log_time, virtual_size):"},{"line_number":2144,"context_line":"    datetime_now \u003d datetime.datetime.now()"},{"line_number":2145,"context_line":"    if (datetime_now - last_log_time).minutes \\"},{"line_number":2146,"context_line":"            \u003e\u003d PROGRESS_LOG_INTERVAL:"},{"line_number":2147,"context_line":"        last_log_time \u003d datetime_now"},{"line_number":2148,"context_line":"        complete_pct \u003d float(virtual_size - left) / virtual_size * 100"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2FkhU%3D","line":2145,"updated":"2013-05-30 10:23:49.000000000","message":"I would add an extra variable to make this easer to read, but that is being super picky.","commit_id":"257c73e3154aeff9d2db16a1cfa7674ae9d5a6d5"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"7a1b90d7730f4cf17ca0e70a9822a2aa6178a6ba","unresolved":false,"context_lines":[{"line_number":2149,"context_line":"        LOG.debug(_(\"Sparse copy in progress, \""},{"line_number":2150,"context_line":"                    \"%(complete_pct).2f%% complete. \""},{"line_number":2151,"context_line":"                    \"%(left) bytes left to copy\"),"},{"line_number":2152,"context_line":"                  locals())"},{"line_number":2153,"context_line":"    return last_log_time"},{"line_number":2154,"context_line":""},{"line_number":2155,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPH%2F%2FkGA%3D","line":2152,"updated":"2013-05-30 13:40:28.000000000","message":"Please don\u0027t use locals.  We\u0027re trying to deprecate its usage across the codebase.","commit_id":"257c73e3154aeff9d2db16a1cfa7674ae9d5a6d5"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"5de223ead3be57c6d0264458e4481016c7963be9","unresolved":false,"context_lines":[{"line_number":146,"context_line":"MBR_SIZE_BYTES \u003d MBR_SIZE_SECTORS * SECTOR_SIZE"},{"line_number":147,"context_line":"KERNEL_DIR \u003d \u0027/boot/guest\u0027"},{"line_number":148,"context_line":"MAX_VDI_CHAIN_SIZE \u003d 16"},{"line_number":149,"context_line":"#Interval(in seconds) after which progress of sparse copy should be logged"},{"line_number":150,"context_line":"PROGRESS_LOG_INTERVAL \u003d 300"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2FgxQ%3D","line":149,"updated":"2013-05-31 14:29:54.000000000","message":"Maybe call it something like PROGRESS_INTERNAL_SECONDS, then you don\u0027t need this comment I guess?","commit_id":"87be3328caec5e63042b44da297730ee10567eb3"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"db4df9b1c29fe78274ef3bf1d1ee0e7750b46baa","unresolved":false,"context_lines":[{"line_number":146,"context_line":"MBR_SIZE_BYTES \u003d MBR_SIZE_SECTORS * SECTOR_SIZE"},{"line_number":147,"context_line":"KERNEL_DIR \u003d \u0027/boot/guest\u0027"},{"line_number":148,"context_line":"MAX_VDI_CHAIN_SIZE \u003d 16"},{"line_number":149,"context_line":"#Interval(in seconds) after which progress of sparse copy should be logged"},{"line_number":150,"context_line":"PROGRESS_LOG_INTERVAL \u003d 300"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPH%2F%2Fguo%3D","line":149,"in_reply_to":"AAAAPH%2F%2FgxQ%3D","updated":"2013-05-31 14:52:33.000000000","message":"+1, though I think you meant PROGRESS_INTERVAL_SECONDS.","commit_id":"87be3328caec5e63042b44da297730ee10567eb3"}]}
