)]}'
{"bin/swift-drive-audit":[{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"ca60d2ae49a46d88fff20b799468701f61f4d3d3","unresolved":false,"context_lines":[{"line_number":63,"context_line":"#For large kern.logs must search from end of file up and stop"},{"line_number":64,"context_line":"# when we have gone too far"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"def backward(f):"},{"line_number":67,"context_line":"    f.seek(0, 2)"},{"line_number":68,"context_line":"    blocksize \u003d 4096"},{"line_number":69,"context_line":"    last_row \u003d \u0027\u0027"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAMH%2F%2F2%2Fc%3D","line":66,"updated":"2012-11-19 21:21:38.000000000","message":"I\u0027d like to see this function moved into swift/common/utils.py so that it can be properly tested.","commit_id":"de052126fa498c91c4c39d44a81919d95457d781"},{"author":{"_account_id":5499,"name":"jola-mirecka","email":"jola.mirecka@hp.com","username":"jola-mirecka"},"change_message_id":"03f80d049f27aa77efc18d8ff23e5a20745f2d4d","unresolved":false,"context_lines":[{"line_number":63,"context_line":"#For large kern.logs must search from end of file up and stop"},{"line_number":64,"context_line":"# when we have gone too far"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"def backward(f):"},{"line_number":67,"context_line":"    f.seek(0, 2)"},{"line_number":68,"context_line":"    blocksize \u003d 4096"},{"line_number":69,"context_line":"    last_row \u003d \u0027\u0027"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAMH%2F%2F1oY%3D","line":66,"in_reply_to":"AAAAMH%2F%2F2%2Fc%3D","updated":"2012-11-20 18:13:56.000000000","message":"yes, planning to do that","commit_id":"de052126fa498c91c4c39d44a81919d95457d781"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"a86fdbccac922b4ae8dea30114581acc8e6263a8","unresolved":false,"context_lines":[{"line_number":64,"context_line":"# when we have gone too far"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"def backward(f):"},{"line_number":67,"context_line":"    f.seek(0, 2)"},{"line_number":68,"context_line":"    blocksize \u003d 4096"},{"line_number":69,"context_line":"    last_row \u003d \u0027\u0027"},{"line_number":70,"context_line":"    while f.tell() !\u003d 0:"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAMH%2F%2F3Fs%3D","line":67,"updated":"2012-11-19 21:34:15.000000000","message":"Could you use \"os.SEEK_END\" instead of an inscrutable \"2\"?","commit_id":"de052126fa498c91c4c39d44a81919d95457d781"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"a86fdbccac922b4ae8dea30114581acc8e6263a8","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    last_row \u003d \u0027\u0027"},{"line_number":70,"context_line":"    while f.tell() !\u003d 0:"},{"line_number":71,"context_line":"        try:"},{"line_number":72,"context_line":"            f.seek(-blocksize, 1)"},{"line_number":73,"context_line":"        except IOError:"},{"line_number":74,"context_line":"            blocksize \u003d f.tell()"},{"line_number":75,"context_line":"            f.seek(-blocksize, 1)"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAMH%2F%2F3Fg%3D","line":72,"updated":"2012-11-19 21:34:15.000000000","message":"os.SEEK_CUR","commit_id":"de052126fa498c91c4c39d44a81919d95457d781"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"a86fdbccac922b4ae8dea30114581acc8e6263a8","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            f.seek(-blocksize, 1)"},{"line_number":73,"context_line":"        except IOError:"},{"line_number":74,"context_line":"            blocksize \u003d f.tell()"},{"line_number":75,"context_line":"            f.seek(-blocksize, 1)"},{"line_number":76,"context_line":"        block \u003d f.read(blocksize)"},{"line_number":77,"context_line":"        f.seek(-blocksize, 1)"},{"line_number":78,"context_line":"        rows \u003d block.split(\u0027\\n\u0027)"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAMH%2F%2F3Fk%3D","line":75,"updated":"2012-11-19 21:34:15.000000000","message":"os.SEEK_CUR","commit_id":"de052126fa498c91c4c39d44a81919d95457d781"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"a86fdbccac922b4ae8dea30114581acc8e6263a8","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            blocksize \u003d f.tell()"},{"line_number":75,"context_line":"            f.seek(-blocksize, 1)"},{"line_number":76,"context_line":"        block \u003d f.read(blocksize)"},{"line_number":77,"context_line":"        f.seek(-blocksize, 1)"},{"line_number":78,"context_line":"        rows \u003d block.split(\u0027\\n\u0027)"},{"line_number":79,"context_line":"        rows[-1] \u003d rows[-1] + last_row"},{"line_number":80,"context_line":"        while rows:"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAMH%2F%2F280%3D","line":77,"updated":"2012-11-19 21:34:15.000000000","message":"more of the same","commit_id":"de052126fa498c91c4c39d44a81919d95457d781"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"ca60d2ae49a46d88fff20b799468701f61f4d3d3","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                    log_time_string, \u0027%Y %b %d %H:%M:%S\u0027)"},{"line_number":109,"context_line":"                if log_time \u003e start_time:"},{"line_number":110,"context_line":"                    for err in error_re:"},{"line_number":111,"context_line":"                        for device in re.findall(err, row):"},{"line_number":112,"context_line":"                            errors[device] \u003d errors.get(device, 0) + 1"},{"line_number":113,"context_line":"                else:"},{"line_number":114,"context_line":"                    all_found \u003d True"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAMH%2F%2F2%2F0%3D","line":111,"updated":"2012-11-19 21:21:38.000000000","message":"why was this switched to using the module-level function rather than the method on the compiled regex?","commit_id":"de052126fa498c91c4c39d44a81919d95457d781"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"38193145921c6e0c4accceb87ed9c2ff6160871a","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            print(\"Unable to open \" + path)"},{"line_number":88,"context_line":"            sys.exit(1)"},{"line_number":89,"context_line":"        for line in backward(f):"},{"line_number":90,"context_line":"            if \u0027[    0.000000]\u0027 in line:"},{"line_number":91,"context_line":"                # Ignore anything before the last boot"},{"line_number":92,"context_line":"                reached_old_logs \u003d True"},{"line_number":93,"context_line":"                break"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAM3%2F%2FNaA%3D","line":90,"updated":"2013-02-02 07:05:00.000000000","message":"From my review on redbo\u0027s patch (https://review.openstack.org/#/c/17914/1/bin/swift-drive-audit):\n\nOn CentOS, the kernel isn\u0027t configured for hi-res timestamps. You can apparently turn that on a couple of ways, but they probably won\u0027t get it enabled within the first microsecond of boot.\nSomething like\n\n if \u0027KERNEL supported cpus:\u0027 in line:\n\nor\n\n if \u0027BIOS-provided physical RAM map:\u0027 in line:\n\nwould be more robust here (those are two lines early in the boot sequence unlikely to be repeated later).\n\nA subsequent patch of his used:\n\n if \u0027[    0.000000]\u0027 in line \\\n         or \u0027KERNEL supported cpus:\u0027 in line \\\n         or \u0027BIOS-provided physical RAM map:\u0027 in line:\n ...","commit_id":"1be07faefe0dd3022c9b954503f2e7fdb765bf78"}],"test/unit/common/test_utils.py":[{"author":{"_account_id":860,"name":"Donagh McCabe","email":"donagh.mccabe@gmail.com","username":"donagh-mccabe"},"change_message_id":"be3788fe6fdb54d0daa00c5accf0f431976660a3","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        blocksize \u003d 25"},{"line_number":156,"context_line":"        lines \u003d [\u0027123456789x12345678\u003e\u003c123456789\\n\u0027,  # block larger than rest"},{"line_number":157,"context_line":"                 \u0027123456789x123\u003e\u003c\\n\u0027,  # block ends just before \\n character"},{"line_number":158,"context_line":"                 \u0027123423456789\\n\u0027,"},{"line_number":159,"context_line":"                 \u002712345678\u003e\u003c\\n\u0027,  # block ends at the end of line"},{"line_number":160,"context_line":"                 \u0027123456789x123456789x12\u003e\\n\u0027,"},{"line_number":161,"context_line":"                 \u0027\u003c6789x123\\n\u0027,  # block ends at the beginning of the line"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2FSE8%3D","line":158,"updated":"2013-01-30 11:23:45.000000000","message":"The \u003e\u003c thing seems inconsistent. For a block ending (actually starting) at the end of line, you cannot do ...\u003e\u003c\\n because that implies the block boundry is one character before \\n","commit_id":"f5c567a2e7efb5fc5259c408ef705afa5232590f"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"38193145921c6e0c4accceb87ed9c2ff6160871a","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                 \u0027123456789x123456789\\n\u0027]"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        with NamedTemporaryFile(\u0027r+w\u0027) as f:"},{"line_number":167,"context_line":"            file_name \u003d f.name"},{"line_number":168,"context_line":"            for line in lines:"},{"line_number":169,"context_line":"                f.write(line)"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FNak%3D","line":167,"updated":"2013-02-02 07:05:00.000000000","message":"Is file_name used anywhere?  Maybe it doesn\u0027t need to be a NamedTemporaryFile...","commit_id":"1be07faefe0dd3022c9b954503f2e7fdb765bf78"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"38193145921c6e0c4accceb87ed9c2ff6160871a","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        with NamedTemporaryFile(\u0027r+w\u0027) as f:"},{"line_number":167,"context_line":"            file_name \u003d f.name"},{"line_number":168,"context_line":"            for line in lines:"},{"line_number":169,"context_line":"                f.write(line)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"            count \u003d len(lines) - 1"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FNaY%3D","line":168,"updated":"2013-02-02 07:05:00.000000000","message":"If you stored elements of lines without trailing newlines, you could use\n\n f.write(\u0027\\n\u0027.join(lines) + \u0027\\n\u0027)\n\nhere, and then have a simpler test below:\n\n self.assertEquals(list(utils.backward(f, blocksize)), list(reversed(lines)))","commit_id":"1be07faefe0dd3022c9b954503f2e7fdb765bf78"},{"author":{"_account_id":5499,"name":"jola-mirecka","email":"jola.mirecka@hp.com","username":"jola-mirecka"},"change_message_id":"0f37eb8e25545c29b2eeeb465cbf5263ba1fd858","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        with NamedTemporaryFile(\u0027r+w\u0027) as f:"},{"line_number":167,"context_line":"            file_name \u003d f.name"},{"line_number":168,"context_line":"            for line in lines:"},{"line_number":169,"context_line":"                f.write(line)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"            count \u003d len(lines) - 1"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2B%2FLQ%3D","line":168,"in_reply_to":"AAAAM3%2F%2FNaY%3D","updated":"2013-02-12 13:10:03.000000000","message":"\u0027\\n\u0027 characters make it easier to count characters in each blocksize; they also end blocks in certain spots","commit_id":"1be07faefe0dd3022c9b954503f2e7fdb765bf78"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"38193145921c6e0c4accceb87ed9c2ff6160871a","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                count -\u003d 1"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        # Empty file case"},{"line_number":177,"context_line":"        with NamedTemporaryFile(\u0027r\u0027) as f:"},{"line_number":178,"context_line":"            count \u003d 0"},{"line_number":179,"context_line":"            for line in utils.backward(f):"},{"line_number":180,"context_line":"                count +\u003d 1"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FNaU%3D","line":177,"updated":"2013-02-02 07:05:00.000000000","message":"This temp file does not appear to need to be named either?","commit_id":"1be07faefe0dd3022c9b954503f2e7fdb765bf78"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"38193145921c6e0c4accceb87ed9c2ff6160871a","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        # Empty file case"},{"line_number":177,"context_line":"        with NamedTemporaryFile(\u0027r\u0027) as f:"},{"line_number":178,"context_line":"            count \u003d 0"},{"line_number":179,"context_line":"            for line in utils.backward(f):"},{"line_number":180,"context_line":"                count +\u003d 1"},{"line_number":181,"context_line":"            self.assertTrue(count \u003d\u003d 0)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2FNac%3D","line":178,"updated":"2013-02-02 07:05:00.000000000","message":"I think this could just be\n\n self.assertEqual([], list(utils.backward(f)))","commit_id":"1be07faefe0dd3022c9b954503f2e7fdb765bf78"}]}
