)]}'
{"diskimage_builder/block_device/config.py":[{"author":{"_account_id":6133,"name":"yolanda.robla","email":"yroblamo@redhat.com","username":"yolanda.robla"},"change_message_id":"1725a811c7faa657c2e0ed28e0e99eb209988ffd","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    # key that needs to be recursed, or it is a value that is part of"},{"line_number":76,"context_line":"    # this config entry."},{"line_number":77,"context_line":"    for nk, nv in values.items():"},{"line_number":78,"context_line":"        if nk \u003d\u003d \"partitions\":"},{"line_number":79,"context_line":"            # \"partitions\" is a special key of the \"partitioning\""},{"line_number":80,"context_line":"            # object.  It is a list.  Each list-entry gets treated"},{"line_number":81,"context_line":"            # as a top-level entry, so we need to recurse it\u0027s"}],"source_content_type":"text/x-python","patch_set":13,"id":"ff0f0b1f_c68f2ecb","line":78,"range":{"start_line":78,"start_character":10,"end_line":78,"end_character":11},"updated":"2017-05-23 06:44:35.000000000","message":"we may hit a similar case with volumes when it\u0027s ready. Maybe we can do it in a more generic way, like adding the \"special\" keys to a list.","commit_id":"362c5e3b39081af9d1cf13ba978e15ab81a8dbc1"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"c5496f9ff883060badc1d56ac2ccda46dd6a4cc1","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    # key that needs to be recursed, or it is a value that is part of"},{"line_number":76,"context_line":"    # this config entry."},{"line_number":77,"context_line":"    for nk, nv in values.items():"},{"line_number":78,"context_line":"        if nk \u003d\u003d \"partitions\":"},{"line_number":79,"context_line":"            # \"partitions\" is a special key of the \"partitioning\""},{"line_number":80,"context_line":"            # object.  It is a list.  Each list-entry gets treated"},{"line_number":81,"context_line":"            # as a top-level entry, so we need to recurse it\u0027s"}],"source_content_type":"text/x-python","patch_set":13,"id":"ff0f0b1f_098ad9bd","line":78,"range":{"start_line":78,"start_character":10,"end_line":78,"end_character":11},"in_reply_to":"ff0f0b1f_c68f2ecb","updated":"2017-05-23 07:29:36.000000000","message":"I do not believe we should have any more special keys, and I want to remove this ... but even still, i\u0027d much prefer \n\n if nk in [\u0027partitions\u0027, \u0027foo\u0027]:\n   ...\n\nthan adding classes, more recursive walking in more places, etc etc.","commit_id":"362c5e3b39081af9d1cf13ba978e15ab81a8dbc1"},{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"ad2ef52e3555e944c8096e004008e6bd5717ea76","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    # key that needs to be recursed, or it is a value that is part of"},{"line_number":75,"context_line":"    # this config entry."},{"line_number":76,"context_line":"    for nk, nv in values.items():"},{"line_number":77,"context_line":"        if nk \u003d\u003d \"partitions\":"},{"line_number":78,"context_line":"            # \"partitions\" is a special key of the \"partitioning\""},{"line_number":79,"context_line":"            # object.  It is a list.  Each list-entry gets treated"},{"line_number":80,"context_line":"            # as a top-level entry, so we need to recurse it\u0027s"}],"source_content_type":"text/x-python","patch_set":15,"id":"ff0f0b1f_71da454b","line":77,"updated":"2017-05-23 18:56:46.000000000","message":"I don\u0027t really like this special case handling in the generic method.  What about some kind of entry point in the classes (here partitioning class) and move this functionality to the class which should know about?\n(IMHO this list will grow over time and it is not much fun to have a split of functionality.)","commit_id":"de0ee74977e58bd52c0660b13af9400be5d91a5b"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"1b900582da8dc2b41ab8acd5eecc6cc33475eeb5","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    # key that needs to be recursed, or it is a value that is part of"},{"line_number":75,"context_line":"    # this config entry."},{"line_number":76,"context_line":"    for nk, nv in values.items():"},{"line_number":77,"context_line":"        if nk \u003d\u003d \"partitions\":"},{"line_number":78,"context_line":"            # \"partitions\" is a special key of the \"partitioning\""},{"line_number":79,"context_line":"            # object.  It is a list.  Each list-entry gets treated"},{"line_number":80,"context_line":"            # as a top-level entry, so we need to recurse it\u0027s"}],"source_content_type":"text/x-python","patch_set":15,"id":"ff0f0b1f_afd4f420","line":77,"in_reply_to":"ff0f0b1f_71da454b","updated":"2017-05-23 20:15:02.000000000","message":"I don\u0027t like this special-case handling at all.  What you\u0027re implying is that other plugins will create even even more, and different, tree-\u003egraph conversion methods! \n\nThere should be very clear boundary here.  the tree-config is supposed to be a \"convenience\" view of the canonical configuration graph.  plugins should have *no* idea that a tree even exists.  \n\nit\u0027s only because plugins like partitioning break the graph that we need this at all.  if partitions had edge relationships, we would not need this at all because the regular parsing method would work.  We see the flow on-effects of this with things like mounting, where we can\u0027t get the order right from the graph (because the topological sort can\u0027t say \"/var\" comes before \"/var/log\" because the partition nodes don\u0027t have that relationship) so we end up doing stuff like \"sort_mount_points()\"\n\nSo no ... I very purposely don\u0027t want plugins to know that \"tree configurations\" even exist.  All they know is the graph.  If more hacks are required, at least keep them in one place.","commit_id":"de0ee74977e58bd52c0660b13af9400be5d91a5b"},{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"c722acd58ae101cd6eac99c0010f282453773091","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"ff0f0b1f_e3452017","updated":"2017-05-25 16:57:29.000000000","message":"I think \u0027graph\u0027 is misleading here: its a directed graph; e.g. topological sort is only valid for digraphs.\n\nAlso I would completely abstract this file from the extension manager and plugins.  What about passing instead in a list of names (strings) to \u0027config_tree_to_graph()\u0027?","commit_id":"7612a3abf153e3365164c82db7154ce3f5308b4a"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"b872cacc91075313b1a7cd7941f0e1d28bd48ce3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"ff0f0b1f_a674cb9d","in_reply_to":"ff0f0b1f_e3452017","updated":"2017-05-26 00:12:33.000000000","message":"in the old code it\u0027s \"_config_tree_to_digraph\" but it\u0027s called from \"create_graph\".  since we\u0027re testing \"create_graph\" all the test-classes are just called \"Graph\" so i don\u0027t want to change all that.  if you feel strongly, do a change ontop of all this that does a consistent s/graph/digraph/.\n\npassing the strings means more fiddling around in the unit tests creating the string list before we can call the config parsing, including directly importing stevedore there.  seems unnecessary overheads.  \n\nwhat should actually happen is the reverse and move create_graph out of blockdevice.py into here -- and then *it* is completely abstracted from the plugins and just works on the graph and the objects in it","commit_id":"7612a3abf153e3365164c82db7154ce3f5308b4a"},{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"c722acd58ae101cd6eac99c0010f282453773091","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"logger \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"_extensions \u003d extension.ExtensionManager("},{"line_number":24,"context_line":"    namespace\u003d\u0027diskimage_builder.block_device.plugin\u0027,"},{"line_number":25,"context_line":"    invoke_on_load\u003dFalse)"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"ff0f0b1f_c3fb3c45","line":23,"updated":"2017-05-25 16:57:29.000000000","message":"Hmmm.... global?","commit_id":"7612a3abf153e3365164c82db7154ce3f5308b4a"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"b872cacc91075313b1a7cd7941f0e1d28bd48ce3","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"logger \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"_extensions \u003d extension.ExtensionManager("},{"line_number":24,"context_line":"    namespace\u003d\u0027diskimage_builder.block_device.plugin\u0027,"},{"line_number":25,"context_line":"    invoke_on_load\u003dFalse)"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"ff0f0b1f_e661a3d5","line":23,"in_reply_to":"ff0f0b1f_c3fb3c45","updated":"2017-05-26 00:12:33.000000000","message":"It\u0027s read-only and static","commit_id":"7612a3abf153e3365164c82db7154ce3f5308b4a"},{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"c722acd58ae101cd6eac99c0010f282453773091","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"# check if a given name is registered as a plugin"},{"line_number":29,"context_line":"def is_a_plugin(name):"},{"line_number":30,"context_line":"    return any("},{"line_number":31,"context_line":"        _extensions.map(lambda x: x.name \u003d\u003d name))"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"ff0f0b1f_a38cc87f","line":29,"updated":"2017-05-25 16:57:29.000000000","message":"Use comment as doc-string?","commit_id":"7612a3abf153e3365164c82db7154ce3f5308b4a"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"b872cacc91075313b1a7cd7941f0e1d28bd48ce3","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"# check if a given name is registered as a plugin"},{"line_number":29,"context_line":"def is_a_plugin(name):"},{"line_number":30,"context_line":"    return any("},{"line_number":31,"context_line":"        _extensions.map(lambda x: x.name \u003d\u003d name))"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"ff0f0b1f_e6b6433f","line":29,"in_reply_to":"ff0f0b1f_a38cc87f","updated":"2017-05-26 00:12:33.000000000","message":"Done","commit_id":"7612a3abf153e3365164c82db7154ce3f5308b4a"},{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"c722acd58ae101cd6eac99c0010f282453773091","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    #    type: ext4"},{"line_number":53,"context_line":"    #    label: 1234"},{"line_number":54,"context_line":"    assert(len(config.items()) \u003d\u003d 1)"},{"line_number":55,"context_line":"    for k, v in config.items():"},{"line_number":56,"context_line":"        key \u003d k"},{"line_number":57,"context_line":"        values \u003d v"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"ff0f0b1f_a34a88a9","line":55,"updated":"2017-05-25 16:57:29.000000000","message":"What do you think about\n\n    [(k, v)] \u003d config.items()\n\ninstead of the for loop?","commit_id":"7612a3abf153e3365164c82db7154ce3f5308b4a"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"b872cacc91075313b1a7cd7941f0e1d28bd48ce3","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    #    type: ext4"},{"line_number":53,"context_line":"    #    label: 1234"},{"line_number":54,"context_line":"    assert(len(config.items()) \u003d\u003d 1)"},{"line_number":55,"context_line":"    for k, v in config.items():"},{"line_number":56,"context_line":"        key \u003d k"},{"line_number":57,"context_line":"        values \u003d v"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"ff0f0b1f_86d66727","line":55,"in_reply_to":"ff0f0b1f_a34a88a9","updated":"2017-05-26 00:12:33.000000000","message":"for two lines i\u0027d rather be explicit than use a clever, but a little mind-bending multiple unpack","commit_id":"7612a3abf153e3365164c82db7154ce3f5308b4a"},{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"c722acd58ae101cd6eac99c0010f282453773091","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    # If we don\u0027t have a base, we take the parent base; first element"},{"line_number":60,"context_line":"    # can have no base, however."},{"line_number":61,"context_line":"    if (\u0027base\u0027 not in values):"},{"line_number":62,"context_line":"        if (parent_base is not None):"},{"line_number":63,"context_line":"            this[\u0027base\u0027] \u003d parent_base"},{"line_number":64,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":17,"id":"ff0f0b1f_03e5b40a","line":61,"updated":"2017-05-25 16:57:29.000000000","message":"Too much C / C++ / Java ;-)\n(No need for so many parens...)","commit_id":"7612a3abf153e3365164c82db7154ce3f5308b4a"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"b872cacc91075313b1a7cd7941f0e1d28bd48ce3","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    # If we don\u0027t have a base, we take the parent base; first element"},{"line_number":60,"context_line":"    # can have no base, however."},{"line_number":61,"context_line":"    if (\u0027base\u0027 not in values):"},{"line_number":62,"context_line":"        if (parent_base is not None):"},{"line_number":63,"context_line":"            this[\u0027base\u0027] \u003d parent_base"},{"line_number":64,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":17,"id":"ff0f0b1f_06e25702","line":61,"in_reply_to":"ff0f0b1f_03e5b40a","updated":"2017-05-26 00:12:33.000000000","message":"Done","commit_id":"7612a3abf153e3365164c82db7154ce3f5308b4a"},{"author":{"_account_id":21741,"name":"Andreas Florath","email":"andreas@florath.net","username":"florath"},"change_message_id":"c722acd58ae101cd6eac99c0010f282453773091","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    # If we don\u0027t have a base, we take the parent base; first element"},{"line_number":60,"context_line":"    # can have no base, however."},{"line_number":61,"context_line":"    if (\u0027base\u0027 not in values):"},{"line_number":62,"context_line":"        if (parent_base is not None):"},{"line_number":63,"context_line":"            this[\u0027base\u0027] \u003d parent_base"},{"line_number":64,"context_line":"    else:"},{"line_number":65,"context_line":"        this[\u0027base\u0027] \u003d values[\u0027base\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"ff0f0b1f_e3e1a0fe","line":62,"updated":"2017-05-25 16:57:29.000000000","message":"Same here.","commit_id":"7612a3abf153e3365164c82db7154ce3f5308b4a"},{"author":{"_account_id":7118,"name":"Ian Wienand","email":"iwienand@redhat.com","username":"iwienand"},"change_message_id":"b872cacc91075313b1a7cd7941f0e1d28bd48ce3","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    # If we don\u0027t have a base, we take the parent base; first element"},{"line_number":60,"context_line":"    # can have no base, however."},{"line_number":61,"context_line":"    if (\u0027base\u0027 not in values):"},{"line_number":62,"context_line":"        if (parent_base is not None):"},{"line_number":63,"context_line":"            this[\u0027base\u0027] \u003d parent_base"},{"line_number":64,"context_line":"    else:"},{"line_number":65,"context_line":"        this[\u0027base\u0027] \u003d values[\u0027base\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"ff0f0b1f_e6ee43ec","line":62,"in_reply_to":"ff0f0b1f_e3e1a0fe","updated":"2017-05-26 00:12:33.000000000","message":"Done","commit_id":"7612a3abf153e3365164c82db7154ce3f5308b4a"}]}
