)]}'
{"climate/api/oshosts/service.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"f555cece955f1f078773520582baf0b6e5c01865","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        self.manager_rpcapi \u003d manager_rpcapi.ManagerRPCAPI()"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    @policy.protected(\u0027computehosts\u0027, \u0027get\u0027)"},{"line_number":25,"context_line":"    def get_computehosts(self):"},{"line_number":26,"context_line":"        \"\"\"List all existing computehosts.\"\"\""},{"line_number":27,"context_line":"        return self.manager_rpcapi.list_computehosts()"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2BsFg%3D","line":25,"updated":"2014-02-19 19:33:37.000000000","message":"See comments to climate/api/service.py (all of them).","commit_id":"53d4afe8a5eba8c737d7450969daf232655f92d0"}],"climate/api/service.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"f555cece955f1f078773520582baf0b6e5c01865","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    ## Leases operations"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @policy.protected(\u0027leases\u0027, \u0027get\u0027)"},{"line_number":34,"context_line":"    def get_leases(self):"},{"line_number":35,"context_line":"        \"\"\"List all existing leases.\"\"\""},{"line_number":36,"context_line":"        ctx \u003d context.current()"},{"line_number":37,"context_line":"        if policy.enforce(ctx, \u0027admin\u0027, {}, do_raise\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2BsF4%3D","line":34,"updated":"2014-02-19 19:33:37.000000000","message":"Should be renamed to list_leases and the verb for policy should be \u0027list\u0027. We shouldn\u0027t have one rule implicitly affecting two actions.","commit_id":"53d4afe8a5eba8c737d7450969daf232655f92d0"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"f555cece955f1f078773520582baf0b6e5c01865","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        return self.manager_rpcapi.create_lease(data)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @policy.protected(\u0027leases\u0027, \u0027get\u0027)"},{"line_number":58,"context_line":"    def get_lease(self, lease_id):"},{"line_number":59,"context_line":"        \"\"\"Get lease by its ID."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        :param lease_id: ID of the lease in Climate DB."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2BsLI%3D","line":58,"updated":"2014-02-19 19:33:37.000000000","message":"We do another round of policy enforcement here for every operation. That\u0027s not right.\n\nWe actually should fall into infinite recursion here. get_lease calls policy, policy calls get_lease, etc.","commit_id":"53d4afe8a5eba8c737d7450969daf232655f92d0"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"f555cece955f1f078773520582baf0b6e5c01865","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        :param lease_id: ID of the lease in Climate DB."},{"line_number":62,"context_line":"        :type lease_id: str"},{"line_number":63,"context_line":"        \"\"\""},{"line_number":64,"context_line":"        return self.manager_rpcapi.get_lease(lease_id)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @policy.protected(\u0027leases\u0027, \u0027update\u0027)"},{"line_number":67,"context_line":"    def update_lease(self, lease_id, data):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2BsGw%3D","line":64,"updated":"2014-02-19 19:33:37.000000000","message":"I\u0027d suggest assigning this method to some internal variable like self._get_resource and using it in the policy.protected.\n\nIn fact, we can add a class-level variable for default resource_name and use first part of method name (before first \u0027_\u0027) as a verb. This way we won\u0027t need any arguments in many places.","commit_id":"53d4afe8a5eba8c737d7450969daf232655f92d0"}],"climate/api/v1/oshosts/service.py":[{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"7d0b0ab2616e26fcbda48c210f7b1cf03795cb0a","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        return self.manager_rpcapi.create_computehost(data)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @policy.protected(\u0027oshosts\u0027, \u0027get\u0027)"},{"line_number":44,"context_line":"    def get_computehost(self, computehost_id):"},{"line_number":45,"context_line":"        \"\"\"Get computehost by its ID."},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F%2BH8A%3D","line":43,"updated":"2014-03-29 03:59:31.000000000","message":"I think oshosts should be replaced by computehosts.\nIn policy.protected you are trying to get kwargs[extension[:-1]_id], which for this service should be computehost not oshost.","commit_id":"dcd9ed0addaf88f5bd93686733330455f13f8cc9"}],"climate/policy.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"f555cece955f1f078773520582baf0b6e5c01865","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                             **extra)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def protected(extension, action\u003dNone, api\u003d\u0027climate\u0027, ctx\u003dNone):"},{"line_number":98,"context_line":"    \"\"\"Wraps API calls with role based access controls (RBAC)."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    This handles both the protection of the API parameters as well as any"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2Bs9U%3D","line":97,"updated":"2014-02-19 19:33:37.000000000","message":"There\u0027s no way we can have context available in the time we run decorator.","commit_id":"53d4afe8a5eba8c737d7450969daf232655f92d0"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"f555cece955f1f078773520582baf0b6e5c01865","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    def wrapper(f):"},{"line_number":104,"context_line":"        @functools.wraps(f)"},{"line_number":105,"context_line":"        def inner(self, *args, **kwargs):"},{"line_number":106,"context_line":"            cur_ctx \u003d ctx or context.current()"},{"line_number":107,"context_line":"            if action is None:"},{"line_number":108,"context_line":"                act \u003d \u0027%s:%s\u0027 % (api, extension)"},{"line_number":109,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2BsTs%3D","line":106,"updated":"2014-02-19 19:33:37.000000000","message":"If we\u0027re going to clean this up anyway, why not make enforce() get context by its own?","commit_id":"53d4afe8a5eba8c737d7450969daf232655f92d0"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"f555cece955f1f078773520582baf0b6e5c01865","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                act \u003d \u0027%s:%s:%s\u0027 % (api, extension, action)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"            if enforce(cur_ctx, \u0027admin\u0027, {}, do_raise\u003dFalse):"},{"line_number":113,"context_line":"                LOG.warning(_(\u0027RBAC: Bypassing authorization\u0027))"},{"line_number":114,"context_line":"            else:"},{"line_number":115,"context_line":"                target \u003d {}"},{"line_number":116,"context_line":"                resource_name \u003d extension[:-1]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2Bs8g%3D","line":113,"updated":"2014-02-19 19:33:37.000000000","message":"We don\u0027t need this (in Keystone they can\u0027t get rid of it, we can).","commit_id":"53d4afe8a5eba8c737d7450969daf232655f92d0"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"f555cece955f1f078773520582baf0b6e5c01865","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                if (hasattr(self, \u0027get_%s\u0027 % resource_name) and"},{"line_number":120,"context_line":"                        resource_id in kwargs):"},{"line_number":121,"context_line":"                    get_fn \u003d getattr(self, \u0027get_%s\u0027 % resource_name)"},{"line_number":122,"context_line":"                    resource_id \u003d \u0027%s_id\u0027 % resource_name"},{"line_number":123,"context_line":"                    target \u003d get_fn(kwargs[resource_id])"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"                target.update(kwargs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2Bs8A%3D","line":122,"updated":"2014-02-19 19:33:37.000000000","message":"Duplicates line 117","commit_id":"53d4afe8a5eba8c737d7450969daf232655f92d0"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"f555cece955f1f078773520582baf0b6e5c01865","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                        resource_id in kwargs):"},{"line_number":121,"context_line":"                    get_fn \u003d getattr(self, \u0027get_%s\u0027 % resource_name)"},{"line_number":122,"context_line":"                    resource_id \u003d \u0027%s_id\u0027 % resource_name"},{"line_number":123,"context_line":"                    target \u003d get_fn(kwargs[resource_id])"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"                target.update(kwargs)"},{"line_number":126,"context_line":"                if target:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2BsWE%3D","line":123,"updated":"2014-02-19 19:33:37.000000000","message":"I think this should be wrapped into try-except in \"ask for forgiveness\" way:\n\n    try:\n        resource_id \u003d kwargs[\u0027%s_id\u0027 % resource_name]\n        get_fn \u003d getattr(self, \u0027get_%s\u0027 % resource_name)\n    except (AttributeError, KeyError):\n        target \u003d {}\n    else:\n        target \u003d get_fn(resource_id)","commit_id":"53d4afe8a5eba8c737d7450969daf232655f92d0"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"f555cece955f1f078773520582baf0b6e5c01865","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"                target.update(kwargs)"},{"line_number":126,"context_line":"                if target:"},{"line_number":127,"context_line":"                    enforce(cur_ctx, act, flatten(target))"},{"line_number":128,"context_line":"                    LOG.debug(_(\u0027RBAC: Authorization granted\u0027))"},{"line_number":129,"context_line":"            return f(self, *args, **kwargs)"},{"line_number":130,"context_line":"        return inner"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2BsU8%3D","line":127,"updated":"2014-02-19 19:33:37.000000000","message":"We shouldn\u0027t bypass policy enforcement if we have no target.","commit_id":"53d4afe8a5eba8c737d7450969daf232655f92d0"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"f555cece955f1f078773520582baf0b6e5c01865","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            items.extend(flatten(v, new_key).items())"},{"line_number":146,"context_line":"        else:"},{"line_number":147,"context_line":"            items.append((new_key, v))"},{"line_number":148,"context_line":"    return dict(items)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2BsOU%3D","line":148,"updated":"2014-02-19 19:33:37.000000000","message":"Let\u0027s make this better:\n\n    semis, result \u003d [(\u0027\u0027, d)], []\n    while semis:\n        new_semis \u003d []\n        for key, dct in semis.iteritems():\n            for k, v in dct.iteritems():\n                new_key \u003d key + \u0027.\u0027 + k if key else k\n                if isinstance(v, collections.MutableMapping):\n                    new_semis.append((new_key, v))\n                else:\n                    result.append((new_key, v))\n        semis \u003d new_semis\n    return dict(result)","commit_id":"53d4afe8a5eba8c737d7450969daf232655f92d0"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ebd4102fa489dc6960429c0f34e1fd49e812375f","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                             **extra)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def protected(extension, action\u003dNone, api\u003d\u0027climate\u0027):"},{"line_number":97,"context_line":"    \"\"\"Wraps API calls with role based access controls (RBAC)."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    This handles both the protection of the API parameters as well as any"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2BaeQ%3D","line":96,"updated":"2014-02-21 10:03:58.000000000","message":"why are you renaming this method ? the authorize() name was coming from other projects.","commit_id":"6f4d22804aed714d0fa265110b021f52a931e4e7"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"5cf6c91dac8e77f394687c56c2784254f32f699f","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                             **extra)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def protected(extension, action\u003dNone, api\u003d\u0027climate\u0027):"},{"line_number":97,"context_line":"    \"\"\"Wraps API calls with role based access controls (RBAC)."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    This handles both the protection of the API parameters as well as any"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2BaXc%3D","line":96,"in_reply_to":"AAAAUX%2F%2BaeQ%3D","updated":"2014-02-21 10:13:36.000000000","message":"It was some kind of inspiration from Keystone, cause potentially we\u0027ll need also filter_protected stuff, and i don\u0027t like how \u0027filter_authorize\u0027 looks like :?","commit_id":"6f4d22804aed714d0fa265110b021f52a931e4e7"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ebd4102fa489dc6960429c0f34e1fd49e812375f","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            except (AttributeError, KeyError):"},{"line_number":117,"context_line":"                target \u003d {}"},{"line_number":118,"context_line":"            else:"},{"line_number":119,"context_line":"                target \u003d get_fn(resource_id) if get_fn is not None else {}"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"            target.update(kwargs)"},{"line_number":122,"context_line":"            enforce(cur_ctx.to_dict(), act, flatten(target))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2BabI%3D","line":119,"updated":"2014-02-21 10:03:58.000000000","message":"Here is ***the** thing : you place an RPC call each time for getting the target. That deserves to be thought about in terms of performance/risks. Anyway, the DB is responsible for not showing objects that are not matching the tenant","commit_id":"6f4d22804aed714d0fa265110b021f52a931e4e7"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"e57bd560623a7fb9bf12079d80ef787697195db7","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            except (AttributeError, KeyError):"},{"line_number":117,"context_line":"                target \u003d {}"},{"line_number":118,"context_line":"            else:"},{"line_number":119,"context_line":"                target \u003d get_fn(resource_id) if get_fn is not None else {}"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"            target.update(kwargs)"},{"line_number":122,"context_line":"            enforce(cur_ctx.to_dict(), act, flatten(target))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2BaVM%3D","line":119,"in_reply_to":"AAAAUX%2F%2BaWQ%3D","updated":"2014-02-21 10:15:15.000000000","message":"I mixed words in sentence - \u0027We can only compare actual object (target) with what we got from user request. \u0027","commit_id":"6f4d22804aed714d0fa265110b021f52a931e4e7"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"5cf6c91dac8e77f394687c56c2784254f32f699f","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            except (AttributeError, KeyError):"},{"line_number":117,"context_line":"                target \u003d {}"},{"line_number":118,"context_line":"            else:"},{"line_number":119,"context_line":"                target \u003d get_fn(resource_id) if get_fn is not None else {}"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"            target.update(kwargs)"},{"line_number":122,"context_line":"            enforce(cur_ctx.to_dict(), act, flatten(target))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2BaWQ%3D","line":119,"in_reply_to":"AAAAUX%2F%2BabI%3D","updated":"2014-02-21 10:13:36.000000000","message":"We can only compare with actual object (target) what we got from user request. Frankly speaking I have no idea how we can get object without actual object getting as only Manager communicates with DB.","commit_id":"6f4d22804aed714d0fa265110b021f52a931e4e7"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ebd4102fa489dc6960429c0f34e1fd49e812375f","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    return wrapper"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"def flatten(d):"},{"line_number":130,"context_line":"    \"\"\"Flatten a nested dictionary."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    Converts a dictionary with nested values to a single level flat"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2Baeo%3D","line":129,"updated":"2014-02-21 10:03:58.000000000","message":"I\u0027m not sure this should reside here, but rather in climate.utils\n\nIdeally, we should verify if nothing is present in oslo for this.","commit_id":"6f4d22804aed714d0fa265110b021f52a931e4e7"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"5cf6c91dac8e77f394687c56c2784254f32f699f","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    return wrapper"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"def flatten(d):"},{"line_number":130,"context_line":"    \"\"\"Flatten a nested dictionary."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    Converts a dictionary with nested values to a single level flat"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2BaV8%3D","line":129,"in_reply_to":"AAAAUX%2F%2Baeo%3D","updated":"2014-02-21 10:13:36.000000000","message":"This thing will be used only here. Do you think it\u0027ll be used somewhere apse to move it to utils module?","commit_id":"6f4d22804aed714d0fa265110b021f52a931e4e7"},{"author":{"_account_id":9225,"name":"Cristian A Sanchez","email":"cabsanchez@gmail.com","username":"casanch1"},"change_message_id":"8f2e60227888031d2fea60fb3b581f191e2e02f7","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    return wrapper"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"def flatten(d):"},{"line_number":130,"context_line":"    \"\"\"Flatten a nested dictionary."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    Converts a dictionary with nested values to a single level flat"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAXH%2F%2FS6I%3D","line":129,"updated":"2014-04-22 17:27:16.000000000","message":"I think this function should be in the some tools module like utils/tools.py","commit_id":"dcd9ed0addaf88f5bd93686733330455f13f8cc9"}],"etc/policy.json":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ebd4102fa489dc6960429c0f34e1fd49e812375f","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    \"climate:plugins:get\": \"@\","},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    \"climate:computehosts:get\": \"rule:admin_or_owner\","},{"line_number":18,"context_line":"    \"climate:computehosts:list\": \"rule:admin_or_owner\","},{"line_number":19,"context_line":"    \"climate:computehosts:create\": \"rule:admin_api\","},{"line_number":20,"context_line":"    \"climate:computehosts:delete\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":3,"id":"AAAAUX%2F%2BacI%3D","line":17,"updated":"2014-02-21 10:03:58.000000000","message":"oshosts is referring to the URL /os-hosts/ \nI don\u0027t think it\u0027s good to change","commit_id":"6f4d22804aed714d0fa265110b021f52a931e4e7"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"5cf6c91dac8e77f394687c56c2784254f32f699f","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    \"climate:plugins:get\": \"@\","},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    \"climate:computehosts:get\": \"rule:admin_or_owner\","},{"line_number":18,"context_line":"    \"climate:computehosts:list\": \"rule:admin_or_owner\","},{"line_number":19,"context_line":"    \"climate:computehosts:create\": \"rule:admin_api\","},{"line_number":20,"context_line":"    \"climate:computehosts:delete\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":3,"id":"AAAAUX%2F%2BaVk%3D","line":17,"in_reply_to":"AAAAUX%2F%2BacI%3D","updated":"2014-02-21 10:13:36.000000000","message":"in this patch set this change is really not needed, so I may revert it.","commit_id":"6f4d22804aed714d0fa265110b021f52a931e4e7"}]}
