)]}'
{"bin/disk-image-create":[{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"73fc0dd7f4d5fb331db748091bfcd28cf0853b22","unresolved":false,"context_lines":[{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"set -eE"},{"line_number":18,"context_line":"set -x"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"# Prevent perl from complaining a lot, but also remove any unexpected side-effects"},{"line_number":21,"context_line":"# of $LANG varying between build hosts"}],"source_content_type":"application/x-shellscript","patch_set":12,"id":"9abb7d3a_5e5c50ed","line":18,"updated":"2016-06-02 20:49:52.000000000","message":"This should be removed.\n\nWhat about a solution like the one used in the element scripts?\n\nif [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then\n    set -x\nfi\n\n(Think I did the same think at least twice...)","commit_id":"5f28f7d7d58ff9a62efc62707d7d9cc073580d44"},{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"e5a847b10e7ded661c6d5c75b4a5d683b392bd17","unresolved":false,"context_lines":[{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"set -eE"},{"line_number":18,"context_line":"set -x"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"# Prevent perl from complaining a lot, but also remove any unexpected side-effects"},{"line_number":21,"context_line":"# of $LANG varying between build hosts"}],"source_content_type":"application/x-shellscript","patch_set":12,"id":"9abb7d3a_af5870fb","line":18,"in_reply_to":"9abb7d3a_5e5c50ed","updated":"2016-06-03 16:55:59.000000000","message":"Maybe my proposed alternative is rubbish: there is already the \u0027-x\u0027 switch to \u0027disk-image-create\u0027 script.","commit_id":"5f28f7d7d58ff9a62efc62707d7d9cc073580d44"},{"author":{"_account_id":10035,"name":"greghaynes","email":"greg@greghaynes.net","username":"greghaynes"},"change_message_id":"2e0616ca2f773236ec4aa3ddfa60386cce9953c0","unresolved":false,"context_lines":[{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"set -eE"},{"line_number":18,"context_line":"set -x"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"# Prevent perl from complaining a lot, but also remove any unexpected side-effects"},{"line_number":21,"context_line":"# of $LANG varying between build hosts"}],"source_content_type":"application/x-shellscript","patch_set":12,"id":"7aa08908_02b2a8e4","line":18,"in_reply_to":"9abb7d3a_af5870fb","updated":"2016-06-09 06:27:29.000000000","message":"This is just a mistake on my part - I added this in while deving.","commit_id":"5f28f7d7d58ff9a62efc62707d7d9cc073580d44"}],"bin/generate-hooks":[{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"ec5264f5507d550d91c8bbf50d2be2eb2d5a434f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"3aaa91ec_1462110a","updated":"2016-06-24 19:10:35.000000000","message":"What about using the same approach using an entry point as in\nChange-Id: Ic0c03995667f320a27ac30441279f3e6abb6bca8?","commit_id":"d053803057361f6d301e8dab228c0f6a2ec64139"}],"diskimage_builder/generate_hooks.py":[{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"f5068abcee35604a3c34a9e29047cdffd605f6d5","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import os"},{"line_number":16,"context_line":"import shutil"},{"line_number":17,"context_line":"import sys"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from diskimage_builder import element_dependencies"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a5de9d1_92c3ef56","line":18,"updated":"2016-01-31 23:16:51.000000000","message":"the code seems fine, but please import logging and log out some of those copies and directory walks that are happening.\n\nseveral times with these python scripts that look like bash scripts i\u0027ve been left totally blind as to what\u0027s happening due to a complete lack of logging and it\u0027s a real pain","commit_id":"45a48402deff454f32a3d125110c240bb9aea8cf"},{"author":{"_account_id":10035,"name":"greghaynes","email":"greg@greghaynes.net","username":"greghaynes"},"change_message_id":"555ef3b19c7eb0eb906722436d5e794ac457e183","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import os"},{"line_number":16,"context_line":"import shutil"},{"line_number":17,"context_line":"import sys"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from diskimage_builder import element_dependencies"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_394657c0","line":18,"in_reply_to":"7a5de9d1_92c3ef56","updated":"2016-02-03 01:35:09.000000000","message":"SGTM - stuff like that is the entire point of moving this to python","commit_id":"45a48402deff454f32a3d125110c240bb9aea8cf"},{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"73fc0dd7f4d5fb331db748091bfcd28cf0853b22","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import argparse"},{"line_number":14,"context_line":"import logging"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":"import shutil"}],"source_content_type":"text/x-python","patch_set":12,"id":"9abb7d3a_9ed7d8be","line":14,"updated":"2016-06-02 20:49:52.000000000","message":"What is your idea about a common Logging class / initialization. I don\u0027t want the standard format, because I\u0027d like to have a timestamp. What do you think about something like [1] in a python lib directory that can be used by all python tools?\n\nI know that the implementation is not perfect, but it\u0027s maybe a starting point.\n\n[1] https://review.openstack.org/#/c/319591/5/elements/block-device/pylib/block-device/Logger.py","commit_id":"5f28f7d7d58ff9a62efc62707d7d9cc073580d44"},{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"e5a847b10e7ded661c6d5c75b4a5d683b392bd17","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import argparse"},{"line_number":14,"context_line":"import logging"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":"import shutil"}],"source_content_type":"text/x-python","patch_set":12,"id":"9abb7d3a_4fec6429","line":14,"in_reply_to":"9abb7d3a_9ed7d8be","updated":"2016-06-03 16:55:59.000000000","message":"Must correct me here:\nThis attempt of logging implementation is not the one I\u0027d go for now ;-) It has some disadvantages, like the need to pass always the logger to the subclasses and the fixed configuration.\nI just wrote a small logger configuration, that is easy to use, flexible and fits into the DIB ecosystem [1]. Maybe we could use it in the python scripts for DIB?\n\n[1] https://review.openstack.org/#/c/325409/","commit_id":"5f28f7d7d58ff9a62efc62707d7d9cc073580d44"},{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"73fc0dd7f4d5fb331db748091bfcd28cf0853b22","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from diskimage_builder import element_dependencies"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def copy_hook_dir(src, dest):"},{"line_number":24,"context_line":"    if os.path.isfile(src):"},{"line_number":25,"context_line":"        logging.debug(\u0027Copying file \"%s\" to \"%s\"\u0027, src, dest)"},{"line_number":26,"context_line":"        shutil.copy2(src, dest)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9abb7d3a_3e2a2ce8","line":23,"updated":"2016-06-02 20:49:52.000000000","message":"What do you think about using \u0027distutils.dir_util.copy_tree\u0027 here? IMHO this does exactly what you are doing here.","commit_id":"5f28f7d7d58ff9a62efc62707d7d9cc073580d44"},{"author":{"_account_id":10035,"name":"greghaynes","email":"greg@greghaynes.net","username":"greghaynes"},"change_message_id":"276132d3d007e88ca26b1c2aff453b23fd6cc682","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from diskimage_builder import element_dependencies"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def copy_hook_dir(src, dest):"},{"line_number":24,"context_line":"    if os.path.isfile(src):"},{"line_number":25,"context_line":"        logging.debug(\u0027Copying file \"%s\" to \"%s\"\u0027, src, dest)"},{"line_number":26,"context_line":"        shutil.copy2(src, dest)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_f5bf18fa","line":23,"in_reply_to":"7aa08908_030d87e7","updated":"2016-06-16 04:12:52.000000000","message":"I tried this out and theres an issue - it seems we cant rely on that sub module always being available: http://logs.openstack.org/39/271139/13/check/gate-dib-dsvm-functests-ubuntu-trusty/6f3e8a1/console.html#_2016-06-15_19_51_38_389\n\nI suspect we need to install the distutils package to get that submodule, but I\u0027d rather not add that as an in-chroot dep, so lets just stick with this if thats ok?","commit_id":"5f28f7d7d58ff9a62efc62707d7d9cc073580d44"},{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"11fe39f303585959e4858a13aee2bd30c200db25","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from diskimage_builder import element_dependencies"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def copy_hook_dir(src, dest):"},{"line_number":24,"context_line":"    if os.path.isfile(src):"},{"line_number":25,"context_line":"        logging.debug(\u0027Copying file \"%s\" to \"%s\"\u0027, src, dest)"},{"line_number":26,"context_line":"        shutil.copy2(src, dest)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_4693f64f","line":23,"in_reply_to":"7aa08908_22340448","updated":"2016-06-09 19:33:30.000000000","message":"Ok - then I completely miss something here.\nWould you please add some comments?\n\nMy test case:\n\ncopy_hook_dir(\u0027A\u0027, \u0027Z\u0027)\n\nwith\n\n$ tree A\nA\n├── A1\n│   ├── A1.txt\n│   └── A2\n│       └── A2.txt\n└── A.txt\n\nresult:\n$ tree Z\nZ\n├── A1\n│   ├── A1.txt\n│   └── A2\n│       └── A2.txt\n└── A.txt\n\n$ diff -r A Z \u0026\u0026 echo \"Same\"\nSame\n\n\nMy interpretation was, that the function exists, because the\nshutil.copytree() fails when the destination directory already exists.\n\nThe proposed distutils.dir_util.copy_tree() can be used even if parts of the destination tree already exists.","commit_id":"5f28f7d7d58ff9a62efc62707d7d9cc073580d44"},{"author":{"_account_id":10035,"name":"greghaynes","email":"greg@greghaynes.net","username":"greghaynes"},"change_message_id":"d18d24568a14f538a05ece1b2381969b5ca78e74","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from diskimage_builder import element_dependencies"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def copy_hook_dir(src, dest):"},{"line_number":24,"context_line":"    if os.path.isfile(src):"},{"line_number":25,"context_line":"        logging.debug(\u0027Copying file \"%s\" to \"%s\"\u0027, src, dest)"},{"line_number":26,"context_line":"        shutil.copy2(src, dest)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_030d87e7","line":23,"in_reply_to":"7aa08908_4693f64f","updated":"2016-06-15 04:02:49.000000000","message":"Ah, you are correct. I\u0027ll make use of that :)","commit_id":"5f28f7d7d58ff9a62efc62707d7d9cc073580d44"},{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"fe5a2c937441524cf4ac725f40cf1d67d7d7e8cc","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from diskimage_builder import element_dependencies"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def copy_hook_dir(src, dest):"},{"line_number":24,"context_line":"    if os.path.isfile(src):"},{"line_number":25,"context_line":"        logging.debug(\u0027Copying file \"%s\" to \"%s\"\u0027, src, dest)"},{"line_number":26,"context_line":"        shutil.copy2(src, dest)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_b4b3a109","line":23,"in_reply_to":"7aa08908_f5bf18fa","updated":"2016-06-16 20:46:53.000000000","message":"Of course it\u0027s ok if the other is not universally available.\n\nWhat do you think about renaming this function to somewhat more general? (It copies complete trees - not only hooks.)\nMaybe it\u0027s worth a line of comment?","commit_id":"5f28f7d7d58ff9a62efc62707d7d9cc073580d44"},{"author":{"_account_id":10035,"name":"greghaynes","email":"greg@greghaynes.net","username":"greghaynes"},"change_message_id":"2e0616ca2f773236ec4aa3ddfa60386cce9953c0","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from diskimage_builder import element_dependencies"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def copy_hook_dir(src, dest):"},{"line_number":24,"context_line":"    if os.path.isfile(src):"},{"line_number":25,"context_line":"        logging.debug(\u0027Copying file \"%s\" to \"%s\"\u0027, src, dest)"},{"line_number":26,"context_line":"        shutil.copy2(src, dest)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_22340448","line":23,"in_reply_to":"9abb7d3a_3e2a2ce8","updated":"2016-06-09 06:27:29.000000000","message":"The result here is a bit different than just a plain copytree (we actually use copytree in the else case). I should document the result here a lot better but were basically flattening one level of dirs inside of each element and only one level then recursively copying the rest.","commit_id":"5f28f7d7d58ff9a62efc62707d7d9cc073580d44"},{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"73fc0dd7f4d5fb331db748091bfcd28cf0853b22","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            copy_hook_dir(src, dest)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def generate_hooks(elements, element_dirs, output_path):"},{"line_number":50,"context_line":"    if not os.path.isdir(output_path):"},{"line_number":51,"context_line":"        os.makedirs(output_path)"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9abb7d3a_7eb5d47c","line":49,"updated":"2016-06-02 20:49:52.000000000","message":"I\u0027d add some more loggings in this function: like entry parameters or expanded element list.","commit_id":"5f28f7d7d58ff9a62efc62707d7d9cc073580d44"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"07bf3aac864250bfea1efc65030c3b918f52d606","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from diskimage_builder import element_dependencies, logging_config"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def copy_hook_dir(src, dest):"},{"line_number":24,"context_line":"    if os.path.isfile(src):"},{"line_number":25,"context_line":"        logging.debug(\u0027Copying file \"%s\" to \"%s\"\u0027, src, dest)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3aaa91ec_f5884624","line":22,"updated":"2016-06-30 02:14:19.000000000","message":"this wants a \n\n logger \u003d logging.getLogger(__name__)\n\nand use logger for consistency in output","commit_id":"4ef72212dcdbb2f70f99d4cebe4abc81be3f2c7b"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"aae14fc23120fcb24811e2acfe8f29ea24a46ebc","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    if not os.path.isdir(output_path):"},{"line_number":53,"context_line":"        os.makedirs(output_path)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    deps \u003d element_dependencies.expand_dependencies(elements, element_dirs)"},{"line_number":56,"context_line":"    return [copy_hooks(x, element_dirs, output_path) for x in deps]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3aaa91ec_1537d24d","line":55,"updated":"2016-06-30 02:23:26.000000000","message":"actually, I just thought of something.  I don\u0027t think we should be doing this here ... I\u0027d like dib to do element finding *once*  in a common location and not do it again ... this function walks the tree and introduces the possibility of getting a different answer to when it was done the first time.\n\nBut this fits in well ontop of Ibbd07d082ec827441def2d3f6240df3efdc6eae3 \n\nyou can just yaml.load ELEMENTS_PATH_YAML and walk the elements from that.  I\u0027ve converted svc-map and pkg-map in similar ways with I0a64b45e9f2cfa28e84b2859d76b065a6c4590f0.  this way everything is looking at the same element list.","commit_id":"4ef72212dcdbb2f70f99d4cebe4abc81be3f2c7b"},{"author":{"_account_id":10035,"name":"greghaynes","email":"greg@greghaynes.net","username":"greghaynes"},"change_message_id":"b33c9e18967e5b0fe593a00a3cfc0e032ab0ff9f","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    if not os.path.isdir(output_path):"},{"line_number":53,"context_line":"        os.makedirs(output_path)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    deps \u003d element_dependencies.expand_dependencies(elements, element_dirs)"},{"line_number":56,"context_line":"    return [copy_hooks(x, element_dirs, output_path) for x in deps]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_26756363","line":55,"in_reply_to":"3aaa91ec_1537d24d","updated":"2016-07-12 22:39:37.000000000","message":"makes sense. I\u0027d rather not use env vars in here (i\u0027d really prefer to use python), but I can probably inject something like that in as an arg.","commit_id":"4ef72212dcdbb2f70f99d4cebe4abc81be3f2c7b"},{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"2f2fe2b36126e845e4ecad33c7046d1e07f9099c","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class HookGenerator(object):"},{"line_number":25,"context_line":"    def __init__(self):"},{"line_number":26,"context_line":"        self.logger \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def copy_hook_dir(self, src, dest):"},{"line_number":29,"context_line":"        if os.path.isfile(src):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a6eadb0_9c57cec9","line":26,"updated":"2016-12-19 22:21:51.000000000","message":"I\u0027m confused: should we not use the logger as module global object (as it is used at other places)?","commit_id":"202650ed5fb1f6eb6ec357b4dfadfc06a715840b"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"c9f2134cd972315f1e05ca7ddcdd4bdd0a3842fc","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        if not os.path.isdir(output_path):"},{"line_number":57,"context_line":"            os.makedirs(output_path)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        deps \u003d element_dependencies.expand_dependencies(elements, element_dirs)"},{"line_number":60,"context_line":"        return [self.copy_hooks(x, element_dirs, output_path) for x in deps]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"1a6eadb0_4a3e43db","line":59,"updated":"2016-12-20 03:09:20.000000000","message":"i think this is probably better suited to the v2 branch, and with If97bcd21e45de1b5ed91023fdc441a4617051a6b we have get_elements ... but I\u0027d still say that this walks the elements unnecessarily.  if this is running underneath dib, it can just get the element list from the YAML environment file, and then we *know* it\u0027s consistent with other elements.","commit_id":"202650ed5fb1f6eb6ec357b4dfadfc06a715840b"}],"diskimage_builder/tests/test_generate_hooks.py":[{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"73fc0dd7f4d5fb331db748091bfcd28cf0853b22","unresolved":false,"context_lines":[{"line_number":13,"context_line":"import os"},{"line_number":14,"context_line":"import shutil"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import fixtures"},{"line_number":17,"context_line":"import testtools"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from diskimage_builder import generate_hooks"}],"source_content_type":"text/x-python","patch_set":12,"id":"9abb7d3a_9ec6b847","line":16,"updated":"2016-06-02 20:49:52.000000000","message":"I\u0027m wondering why flake8 does not complain about unsorted imports....","commit_id":"5f28f7d7d58ff9a62efc62707d7d9cc073580d44"},{"author":{"_account_id":10035,"name":"greghaynes","email":"greg@greghaynes.net","username":"greghaynes"},"change_message_id":"276132d3d007e88ca26b1c2aff453b23fd6cc682","unresolved":false,"context_lines":[{"line_number":13,"context_line":"import os"},{"line_number":14,"context_line":"import shutil"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import fixtures"},{"line_number":17,"context_line":"import testtools"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from diskimage_builder import generate_hooks"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_15dc6473","line":16,"in_reply_to":"7aa08908_82005803","updated":"2016-06-16 04:12:52.000000000","message":"Actually, this is used on line 35","commit_id":"5f28f7d7d58ff9a62efc62707d7d9cc073580d44"},{"author":{"_account_id":10035,"name":"greghaynes","email":"greg@greghaynes.net","username":"greghaynes"},"change_message_id":"2e0616ca2f773236ec4aa3ddfa60386cce9953c0","unresolved":false,"context_lines":[{"line_number":13,"context_line":"import os"},{"line_number":14,"context_line":"import shutil"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import fixtures"},{"line_number":17,"context_line":"import testtools"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from diskimage_builder import generate_hooks"}],"source_content_type":"text/x-python","patch_set":12,"id":"7aa08908_82005803","line":16,"in_reply_to":"9abb7d3a_9ec6b847","updated":"2016-06-09 06:27:29.000000000","message":"good find","commit_id":"5f28f7d7d58ff9a62efc62707d7d9cc073580d44"}]}
