)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f15d370e8b119944d34961d4ec200b7a4322d041","unresolved":false,"context_lines":[{"line_number":11,"context_line":"If the search scope is sub, converting from object to id requires a lookup"},{"line_number":12,"context_line":"which is wasteful.  Instead, add the DN to the object, and filter it off"},{"line_number":13,"context_line":"before returning it to the end user."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I2b740412b6ca38dafceb29c6b35556b5869b1658"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAS3%2F%2Fudk%3D","line":14,"updated":"2013-09-20 14:35:37.000000000","message":"Should a bug report be opened for this? Since we are in bug only mode?","commit_id":"6f895e58c8390437c2125a956973c78ef1d9055c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"593ff2e562eea139242ed67fa7df2d5d2994992a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"If the search scope is sub, converting from object to id requires a lookup"},{"line_number":12,"context_line":"which is wasteful.  Instead, add the DN to the object, and filter it off"},{"line_number":13,"context_line":"before returning it to the end user."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I2b740412b6ca38dafceb29c6b35556b5869b1658"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAS3%2F%2Fqu4%3D","line":14,"in_reply_to":"AAAAS3%2F%2Fq2M%3D","updated":"2013-09-23 01:45:04.000000000","message":"Ack, that was the wrong bug.  I lost the one I meant to put here.  Now where did it go.","commit_id":"6f895e58c8390437c2125a956973c78ef1d9055c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"2636515783928962e3faa50889a75d9f5f0411e3","unresolved":false,"context_lines":[{"line_number":11,"context_line":"If the search scope is sub, converting from object to id requires a lookup"},{"line_number":12,"context_line":"which is wasteful.  Instead, add the DN to the object, and filter it off"},{"line_number":13,"context_line":"before returning it to the end user."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I2b740412b6ca38dafceb29c6b35556b5869b1658"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAS3%2F%2Fq2M%3D","line":14,"in_reply_to":"AAAAS3%2F%2FtZE%3D","updated":"2013-09-22 23:28:59.000000000","message":"This is related to https://bugs.launchpad.net/keystone/+bug/1226171\n\nBut it might be actually a separate bug.","commit_id":"6f895e58c8390437c2125a956973c78ef1d9055c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"bf7538900a5c76e36e1aff716f962c9c81d24880","unresolved":false,"context_lines":[{"line_number":11,"context_line":"If the search scope is sub, converting from object to id requires a lookup"},{"line_number":12,"context_line":"which is wasteful.  Instead, add the DN to the object, and filter it off"},{"line_number":13,"context_line":"before returning it to the end user."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I2b740412b6ca38dafceb29c6b35556b5869b1658"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAS3%2F%2FtZE%3D","line":14,"in_reply_to":"AAAAS3%2F%2Fudk%3D","updated":"2013-09-20 19:57:36.000000000","message":"I thought there was one, but didn\u0027t find it on a cursory look.","commit_id":"6f895e58c8390437c2125a956973c78ef1d9055c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ea87e62a37143731c9a66c7aeae42a932437127b","unresolved":false,"context_lines":[{"line_number":12,"context_line":"which is wasteful.  Instead, add the DN to the object, and filter it off"},{"line_number":13,"context_line":"before returning it to the end user."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Bug  47441"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I2b740412b6ca38dafceb29c6b35556b5869b1658"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAS3%2F%2FbyI%3D","line":15,"updated":"2013-09-26 17:57:15.000000000","message":"This seems like the wrong bug, probably a typo.","commit_id":"f362d2901087173ba4701de5165652b298d6baaa"},{"author":{"_account_id":6722,"name":"ChangBo Guo(gcb)","email":"guochbo@cn.ibm.com","username":"guochbo"},"change_message_id":"30a7c5e0c3efd3d85e0372e55df4ecd0bfd5f929","unresolved":false,"context_lines":[{"line_number":12,"context_line":"which is wasteful.  Instead, add the DN to the object, and filter it off"},{"line_number":13,"context_line":"before returning it to the end user."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Bug  47441"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I2b740412b6ca38dafceb29c6b35556b5869b1658"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAS3%2F%2FWOo%3D","line":15,"in_reply_to":"AAAAS3%2F%2FbyI%3D","updated":"2013-09-29 05:12:24.000000000","message":"we\u0027e better  use Closes-Bug: #\n\nhttps://wiki.openstack.org/wiki/GitCommitMessages","commit_id":"f362d2901087173ba4701de5165652b298d6baaa"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f09a67c0678c7c2e40a94cf41e3ee2d80e086bc0","unresolved":false,"context_lines":[{"line_number":12,"context_line":"which is wasteful.  Instead, add the DN to the object, and filter it off"},{"line_number":13,"context_line":"before returning it to the end user."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Fixes Bug  1230260"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I2b740412b6ca38dafceb29c6b35556b5869b1658"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F9%2BUw%3D","line":15,"updated":"2013-12-03 21:28:33.000000000","message":"This doesn\u0027t seem to link to the bug report for me. Also consider changing to:\n\n    Closes-Bug: 1230260","commit_id":"f5a5d477f3053303d407d7ff8cd590f3aa05342d"}],"keystone/assignment/backends/ldap.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3b53d9e670c301464dc14d61d231ebd03f9065a9","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        # NOTE(henry-nash): The LDAP backend is being deprecated, so no"},{"line_number":120,"context_line":"        # support is provided for projects that the user has a role on solely"},{"line_number":121,"context_line":"        # by virtue of group membership."},{"line_number":122,"context_line":"        user_ref \u003d self.identity_api.driver._get_user(user_id)"},{"line_number":123,"context_line":"        user_dn \u003d user_ref[\u0027dn\u0027]"},{"line_number":124,"context_line":"        associations \u003d (self.role.list_project_roles_for_user"},{"line_number":125,"context_line":"                        (user_dn, self.project.tree_dn))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAS3%2F%2FQfo%3D","line":122,"updated":"2013-10-01 12:36:38.000000000","message":"Should the driver grow a get_user method instead of using underscored methods?","commit_id":"f362d2901087173ba4701de5165652b298d6baaa"}],"keystone/common/ldap/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f15d370e8b119944d34961d4ec200b7a4322d041","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            return None"},{"line_number":348,"context_line":"        finally:"},{"line_number":349,"context_line":"            conn.unbind_s()"},{"line_number":350,"context_line":"        if len(res):"},{"line_number":351,"context_line":"            return res[0]"},{"line_number":352,"context_line":"        else:"},{"line_number":353,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FucQ%3D","line":350,"updated":"2013-09-20 14:35:37.000000000","message":"How come we have to determine on the length of \u0027res\u0027? Couldn\u0027t this same things be accomplished with just:\n\nif res:\n    return res[0]\n\nI feel like having the length function in there makes it seem like we are dependent on what the length of res is, but in this case aren\u0027t we just using it to ensure res is something other than \u0027\u0027 an empty string and None?","commit_id":"6f895e58c8390437c2125a956973c78ef1d9055c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"2636515783928962e3faa50889a75d9f5f0411e3","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            return None"},{"line_number":348,"context_line":"        finally:"},{"line_number":349,"context_line":"            conn.unbind_s()"},{"line_number":350,"context_line":"        if len(res):"},{"line_number":351,"context_line":"            return res[0]"},{"line_number":352,"context_line":"        else:"},{"line_number":353,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2Fq2Q%3D","line":350,"in_reply_to":"AAAAS3%2F%2FtZQ%3D","updated":"2013-09-22 23:28:59.000000000","message":"Suggest a comment to indicate the use of it.  It is better than the try/except in my opinion.","commit_id":"6f895e58c8390437c2125a956973c78ef1d9055c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"bf7538900a5c76e36e1aff716f962c9c81d24880","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            return None"},{"line_number":348,"context_line":"        finally:"},{"line_number":349,"context_line":"            conn.unbind_s()"},{"line_number":350,"context_line":"        if len(res):"},{"line_number":351,"context_line":"            return res[0]"},{"line_number":352,"context_line":"        else:"},{"line_number":353,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FtZQ%3D","line":350,"in_reply_to":"AAAAS3%2F%2FucQ%3D","updated":"2013-09-20 19:57:36.000000000","message":"res is an array.  If the Array is empty, return None.  Otherwise, return the first element.  This is the same logic as before, but without the try/except.  THis way is slightly less expensive, and, I thought,  clearer.","commit_id":"6f895e58c8390437c2125a956973c78ef1d9055c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f09a67c0678c7c2e40a94cf41e3ee2d80e086bc0","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    \"\"\"Filter out private items in an entity dict."},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    \u0027dn\u0027 is used in LDAP, but should not be returned to the user"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    :returns: entity_ref"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9%2BUU%3D","line":107,"updated":"2013-12-03 21:28:33.000000000","message":"(NIT): It might be nice to have the docstring parameter for entity_ref documented as well, since that is being passed in and we return it.","commit_id":"f5a5d477f3053303d407d7ff8cd590f3aa05342d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"702e066fe03d0754c5efdf8bb7970f63f221a36e","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    return LdapWrapper"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"def filter_entity(entity_ref):"},{"line_number":119,"context_line":"    \"\"\"Filter out private items in an entity dict."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    :param entity_ref  the entity dictionary. The \u0027dn\u0027 field will be removed."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAVn%2F%2Fork%3D","line":118,"updated":"2014-03-04 23:01:32.000000000","message":"should this be in identity/backends/ldap.py? That\u0027s the only place it\u0027s used.","commit_id":"35b3d67d2015a5e4ddd0f6bff04683dd9f8e6305"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b9ba2c932e816eaa4d5008522749b0fb9e409e02","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    return LdapWrapper"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"def filter_entity(entity_ref):"},{"line_number":119,"context_line":"    \"\"\"Filter out private items in an entity dict."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    :param entity_ref  the entity dictionary. The \u0027dn\u0027 field will be removed."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2FFLM%3D","line":118,"in_reply_to":"AAAAVn%2F%2Fork%3D","updated":"2014-03-20 13:43:34.000000000","message":"No, becasue it will be used in assignments later as well","commit_id":"35b3d67d2015a5e4ddd0f6bff04683dd9f8e6305"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"702e066fe03d0754c5efdf8bb7970f63f221a36e","unresolved":false,"context_lines":[{"line_number":118,"context_line":"def filter_entity(entity_ref):"},{"line_number":119,"context_line":"    \"\"\"Filter out private items in an entity dict."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    :param entity_ref  the entity dictionary. The \u0027dn\u0027 field will be removed."},{"line_number":122,"context_line":"    \u0027dn\u0027 is used in LDAP, but should not be returned to the user"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    :returns: entity_ref"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAVn%2F%2FpDU%3D","line":121,"updated":"2014-03-04 23:01:32.000000000","message":"add a : after entity_ref","commit_id":"35b3d67d2015a5e4ddd0f6bff04683dd9f8e6305"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b9ba2c932e816eaa4d5008522749b0fb9e409e02","unresolved":false,"context_lines":[{"line_number":118,"context_line":"def filter_entity(entity_ref):"},{"line_number":119,"context_line":"    \"\"\"Filter out private items in an entity dict."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    :param entity_ref  the entity dictionary. The \u0027dn\u0027 field will be removed."},{"line_number":122,"context_line":"    \u0027dn\u0027 is used in LDAP, but should not be returned to the user"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    :returns: entity_ref"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2FE7k%3D","line":121,"in_reply_to":"AAAAVn%2F%2FpDU%3D","updated":"2014-03-20 13:43:34.000000000","message":"Done","commit_id":"35b3d67d2015a5e4ddd0f6bff04683dd9f8e6305"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4b39ecd72c4673be89ac1fb7b45604c1b85aafbe","unresolved":false,"context_lines":[{"line_number":119,"context_line":"def filter_entity(entity_ref):"},{"line_number":120,"context_line":"    \"\"\"Filter out private items in an entity dict."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    :param entity_ref  the entity dictionary. The \u0027dn\u0027 field will be removed."},{"line_number":123,"context_line":"    \u0027dn\u0027 is used in LDAP, but should not be returned to the user"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    :returns: entity_ref"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2B3RY%3D","line":122,"updated":"2014-03-22 14:55:22.000000000","message":"add a : after entity_ref for rst\n\nThis should note that the entity_ref will be changed by the call.","commit_id":"78aa9f8e1d2075122f91539821ab51efd2be7d38"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c30b0a9e4954e87ce9602fb9077f8ab2cafd915e","unresolved":false,"context_lines":[{"line_number":119,"context_line":"def filter_entity(entity_ref):"},{"line_number":120,"context_line":"    \"\"\"Filter out private items in an entity dict."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    :param entity_ref  the entity dictionary. The \u0027dn\u0027 field will be removed."},{"line_number":123,"context_line":"    \u0027dn\u0027 is used in LDAP, but should not be returned to the user"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    :returns: entity_ref"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2BuSs%3D","line":122,"in_reply_to":"AAAAWH%2F%2B3RY%3D","updated":"2014-03-24 21:01:40.000000000","message":"Done","commit_id":"78aa9f8e1d2075122f91539821ab51efd2be7d38"}],"keystone/identity/backends/ldap.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f09a67c0678c7c2e40a94cf41e3ee2d80e086bc0","unresolved":false,"context_lines":[{"line_number":42,"context_line":"def filter_user(user_ref):"},{"line_number":43,"context_line":"    \"\"\"Filter out private items in an entity user dict."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    :returns: user_ref"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    \"\"\""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9%2BT4%3D","line":45,"updated":"2013-12-03 21:28:33.000000000","message":"Same comment as entity_ref","commit_id":"f5a5d477f3053303d407d7ff8cd590f3aa05342d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f09a67c0678c7c2e40a94cf41e3ee2d80e086bc0","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        if \u0027name\u0027 in user and old_obj.get(\u0027name\u0027) !\u003d user[\u0027name\u0027]:"},{"line_number":119,"context_line":"            raise exception.Conflict(\u0027Cannot change user name\u0027)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        if \u0027tenant_id\u0027 in user and \\"},{"line_number":122,"context_line":"                old_obj.get(\u0027tenant_id\u0027) !\u003d user[\u0027tenant_id\u0027]:"},{"line_number":123,"context_line":"            if old_obj[\u0027tenant_id\u0027]:"},{"line_number":124,"context_line":"                self.project.remove_user(old_obj[\u0027tenant_id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9%2BTU%3D","line":121,"updated":"2013-12-03 21:28:33.000000000","message":"Wrap in parenthesis instead of using \\ for line continuation: \n\nhttp://docs.openstack.org/developer/hacking/#general","commit_id":"f5a5d477f3053303d407d7ff8cd590f3aa05342d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"433fa52f296a3ab85129e48407d006b172b2ee86","unresolved":false,"context_lines":[{"line_number":376,"context_line":"        query \u003d \u0027(\u0026(objectClass\u003d%s)(%s\u003d%s)%s)\u0027 % (self.object_class,"},{"line_number":377,"context_line":"                                                  self.member_attribute,"},{"line_number":378,"context_line":"                                                  user_dn,"},{"line_number":379,"context_line":"                                                  self.ldap_filter or \u0027\u0027)"},{"line_number":380,"context_line":"        memberships \u003d self.get_all_filtered(query)"},{"line_number":381,"context_line":"        return memberships"},{"line_number":382,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAU3%2F%2FZaQ%3D","line":379,"updated":"2014-02-26 21:24:40.000000000","message":"this search scheme probably won\u0027t work for \u0027memberOf\u0027 search from user object or nested groups. Anyway, incremental improvements. :)","commit_id":"9371f790220262154d3b27f57b7769abca503752"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"702e066fe03d0754c5efdf8bb7970f63f221a36e","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def _ldap_res_to_model_with_dn(self, res):"},{"line_number":218,"context_line":"        model \u003d self._ldap_res_to_model_without_dn(res)"},{"line_number":219,"context_line":"        model[\u0027dn\u0027] \u003d res[0]"},{"line_number":220,"context_line":"        return model"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def __init__(self, conf):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAVn%2F%2Foog%3D","line":219,"updated":"2014-03-04 23:01:32.000000000","message":"move this down into _ldap_res_to_model and get rid of this function.","commit_id":"35b3d67d2015a5e4ddd0f6bff04683dd9f8e6305"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b9ba2c932e816eaa4d5008522749b0fb9e409e02","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def _ldap_res_to_model_with_dn(self, res):"},{"line_number":218,"context_line":"        model \u003d self._ldap_res_to_model_without_dn(res)"},{"line_number":219,"context_line":"        model[\u0027dn\u0027] \u003d res[0]"},{"line_number":220,"context_line":"        return model"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def __init__(self, conf):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2FEls%3D","line":219,"in_reply_to":"AAAAVn%2F%2Foog%3D","updated":"2014-03-20 13:43:34.000000000","message":"Done","commit_id":"35b3d67d2015a5e4ddd0f6bff04683dd9f8e6305"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"702e066fe03d0754c5efdf8bb7970f63f221a36e","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        self.enabled_mask \u003d conf.ldap.user_enabled_mask"},{"line_number":225,"context_line":"        self.enabled_default \u003d conf.ldap.user_enabled_default"},{"line_number":226,"context_line":"        self._ldap_res_to_model_without_dn \u003d self._ldap_res_to_model"},{"line_number":227,"context_line":"        self._ldap_res_to_model \u003d self._ldap_res_to_model_with_dn"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def _ldap_res_to_model(self, res):"},{"line_number":230,"context_line":"        obj \u003d super(UserApi, self)._ldap_res_to_model(res)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAVn%2F%2FooI%3D","line":227,"updated":"2014-03-04 23:01:32.000000000","message":"if remove _ldap_res_to_model_with_dn then then don\u0027t have to do this.","commit_id":"35b3d67d2015a5e4ddd0f6bff04683dd9f8e6305"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"702e066fe03d0754c5efdf8bb7970f63f221a36e","unresolved":false,"context_lines":[{"line_number":281,"context_line":"    immutable_attrs \u003d [\u0027name\u0027]"},{"line_number":282,"context_line":"    model \u003d models.Group"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def _ldap_res_to_model_with_dn(self, res):"},{"line_number":285,"context_line":"        model \u003d self._ldap_res_to_model_without_dn(res)"},{"line_number":286,"context_line":"        model[\u0027dn\u0027] \u003d res[0]"},{"line_number":287,"context_line":"        return model"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAVn%2F%2Fonw%3D","line":284,"updated":"2014-03-04 23:01:32.000000000","message":"override _ldap_res_to_model like is done in UserApi (see line 229)","commit_id":"35b3d67d2015a5e4ddd0f6bff04683dd9f8e6305"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4b39ecd72c4673be89ac1fb7b45604c1b85aafbe","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    def create_user(self, user_id, user):"},{"line_number":89,"context_line":"        self.user.check_allow_create()"},{"line_number":90,"context_line":"        user_ref \u003d self.user.create(user)"},{"line_number":91,"context_line":"        tenant_id \u003d user.get(\u0027tenant_id\u0027)"},{"line_number":92,"context_line":"        if tenant_id is not None:"},{"line_number":93,"context_line":"            self.assignment_api.add_user_to_project(tenant_id, user_id)"},{"line_number":94,"context_line":"        return self.user.filter_attributes(user_ref)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2B3RA%3D","line":91,"updated":"2014-03-22 14:55:22.000000000","message":"what do the changes on lines 91-93 have to do with remembering the DN?","commit_id":"78aa9f8e1d2075122f91539821ab51efd2be7d38"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c30b0a9e4954e87ce9602fb9077f8ab2cafd915e","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    def create_user(self, user_id, user):"},{"line_number":89,"context_line":"        self.user.check_allow_create()"},{"line_number":90,"context_line":"        user_ref \u003d self.user.create(user)"},{"line_number":91,"context_line":"        tenant_id \u003d user.get(\u0027tenant_id\u0027)"},{"line_number":92,"context_line":"        if tenant_id is not None:"},{"line_number":93,"context_line":"            self.assignment_api.add_user_to_project(tenant_id, user_id)"},{"line_number":94,"context_line":"        return self.user.filter_attributes(user_ref)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2BuAM%3D","line":91,"in_reply_to":"AAAAWH%2F%2B3RA%3D","updated":"2014-03-24 21:01:40.000000000","message":"These should not be here: bad git merge.  They were removed in.\n\ndda19c3977cd12bd6694a3bc932539ca2b08aee9","commit_id":"78aa9f8e1d2075122f91539821ab51efd2be7d38"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4b39ecd72c4673be89ac1fb7b45604c1b85aafbe","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        old \u003d self.user.get(user_id)"},{"line_number":101,"context_line":"        if \u0027name\u0027 in user and old.get(\u0027name\u0027) !\u003d user[\u0027name\u0027]:"},{"line_number":102,"context_line":"            raise exception.Conflict(_(\u0027Cannot change user name\u0027))"},{"line_number":103,"context_line":"        if \u0027tenant_id\u0027 in user and old.get(\u0027tenant_id\u0027) !\u003d user[\u0027tenant_id\u0027]:"},{"line_number":104,"context_line":"            if old[\u0027tenant_id\u0027]:"},{"line_number":105,"context_line":"                self.project.remove_user(old[\u0027tenant_id\u0027],"},{"line_number":106,"context_line":"                                         old[\u0027dn\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2B3Q8%3D","line":103,"updated":"2014-03-22 14:55:22.000000000","message":"what do the changes in this method have to do with remembering the DN?","commit_id":"78aa9f8e1d2075122f91539821ab51efd2be7d38"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b3f266f914a2d416bd17b0c76ce6faff79c4562f","unresolved":false,"context_lines":[{"line_number":293,"context_line":"            query \u003d \u0027(objectClass\u003d%s)\u0027 % self.object_class"},{"line_number":294,"context_line":"            group_ref \u003d self.get(group_id)"},{"line_number":295,"context_line":"            group_dn \u003d group_ref[\u0027dn\u0027]"},{"line_number":296,"context_line":"            if group_dn:"},{"line_number":297,"context_line":"                try:"},{"line_number":298,"context_line":"                    conn \u003d self.get_connection()"},{"line_number":299,"context_line":"                    roles \u003d conn.search_s(group_dn, ldap.SCOPE_ONELEVEL,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F%2BnLY%3D","line":296,"updated":"2014-03-25 15:22:06.000000000","message":"why would there not be a dn at this point?","commit_id":"964e4c336e021cdca7d193093e674820ddf75b4a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b3f266f914a2d416bd17b0c76ce6faff79c4562f","unresolved":false,"context_lines":[{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def update(self, group_id, values):"},{"line_number":310,"context_line":"        old_obj \u003d self.get(group_id)"},{"line_number":311,"context_line":"        return super(GroupApi, self).update(group_id, values, old_obj)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def add_user(self, user_dn, group_id, user_id):"},{"line_number":314,"context_line":"        group_ref \u003d self.get(group_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F%2BnLQ%3D","line":311,"updated":"2014-03-25 15:22:06.000000000","message":"no filtering on the result object?","commit_id":"964e4c336e021cdca7d193093e674820ddf75b4a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b3f266f914a2d416bd17b0c76ce6faff79c4562f","unresolved":false,"context_lines":[{"line_number":350,"context_line":"                                                  user_dn,"},{"line_number":351,"context_line":"                                                  self.ldap_filter or \u0027\u0027)"},{"line_number":352,"context_line":"        memberships \u003d self.get_all(query)"},{"line_number":353,"context_line":"        return memberships"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def list_user_groups_filtered(self, user_dn):"},{"line_number":356,"context_line":"        \"\"\"Return a filtered list of groups for which the user is a member.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F%2BnL8%3D","line":353,"updated":"2014-03-25 15:22:06.000000000","message":"no filtering here?","commit_id":"964e4c336e021cdca7d193093e674820ddf75b4a"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"34ddfc6674e47fe0e786481241c465028efa886b","unresolved":false,"context_lines":[{"line_number":360,"context_line":"                                                  user_dn,"},{"line_number":361,"context_line":"                                                  self.ldap_filter or \u0027\u0027)"},{"line_number":362,"context_line":"        memberships \u003d self.get_all_filtered(query)"},{"line_number":363,"context_line":"        return memberships"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"    def list_group_users(self, group_id):"},{"line_number":366,"context_line":"        \"\"\"Return a list of user dns which are members of a group.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAXH%2F%2FOk0%3D","line":363,"updated":"2014-04-23 07:28:12.000000000","message":"Why we need local variable \u0027memberships\u0027 here?\nMaybe it\u0027s better to use:\n\n return self.get_all_filtered(query)","commit_id":"964e4c336e021cdca7d193093e674820ddf75b4a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54c786b4a92f8b5b3ff8b6250accb5a2f1a6bb1a","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        if \u0027id\u0027 in user and user[\u0027id\u0027] !\u003d user_id:"},{"line_number":97,"context_line":"            raise exception.ValidationError(_(\u0027Cannot change user ID\u0027))"},{"line_number":98,"context_line":"        old \u003d self.user.get(user_id)"},{"line_number":99,"context_line":"        if \u0027name\u0027 in user and old.get(\u0027name\u0027) !\u003d user[\u0027name\u0027]:"},{"line_number":100,"context_line":"            raise exception.Conflict(_(\u0027Cannot change user name\u0027))"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        if self.user.enabled_mask:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FG18%3D","line":99,"updated":"2014-04-24 00:03:27.000000000","message":"revert this change it\u0027s unrelated.","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"},{"author":{"_account_id":9098,"name":"Nathan Kinder","email":"nkinder@redhat.com","username":"nkinder"},"change_message_id":"b3591431017b4f9e0a7e6ccb8b1ae70cdd30132b","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        if \u0027id\u0027 in user and user[\u0027id\u0027] !\u003d user_id:"},{"line_number":97,"context_line":"            raise exception.ValidationError(_(\u0027Cannot change user ID\u0027))"},{"line_number":98,"context_line":"        old \u003d self.user.get(user_id)"},{"line_number":99,"context_line":"        if \u0027name\u0027 in user and old.get(\u0027name\u0027) !\u003d user[\u0027name\u0027]:"},{"line_number":100,"context_line":"            raise exception.Conflict(_(\u0027Cannot change user name\u0027))"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        if self.user.enabled_mask:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FF7M%3D","line":99,"in_reply_to":"AAAAXH%2F%2FG18%3D","updated":"2014-04-24 04:06:34.000000000","message":"Done","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54c786b4a92f8b5b3ff8b6250accb5a2f1a6bb1a","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        group[\u0027name\u0027] \u003d clean.group_name(group[\u0027name\u0027])"},{"line_number":123,"context_line":"        return common_ldap.filter_entity(self.group.create(group))"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _get_group(self, group_id):"},{"line_number":126,"context_line":"        return self.group.get(group_id)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def get_group(self, group_id):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FG1s%3D","line":125,"updated":"2014-04-24 00:03:27.000000000","message":"as far as I can tell this new method isn\u0027t used, so remove it.","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"},{"author":{"_account_id":9098,"name":"Nathan Kinder","email":"nkinder@redhat.com","username":"nkinder"},"change_message_id":"b3591431017b4f9e0a7e6ccb8b1ae70cdd30132b","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        group[\u0027name\u0027] \u003d clean.group_name(group[\u0027name\u0027])"},{"line_number":123,"context_line":"        return common_ldap.filter_entity(self.group.create(group))"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _get_group(self, group_id):"},{"line_number":126,"context_line":"        return self.group.get(group_id)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def get_group(self, group_id):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FF7Q%3D","line":125,"in_reply_to":"AAAAXH%2F%2FG1s%3D","updated":"2014-04-24 04:06:34.000000000","message":"Done","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"},{"author":{"_account_id":9098,"name":"Nathan Kinder","email":"nkinder@redhat.com","username":"nkinder"},"change_message_id":"27165d0b51352bc3ef6481b30e5b355bcd685db9","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    def add_user_to_group(self, user_id, group_id):"},{"line_number":142,"context_line":"        user_ref \u003d self._get_user(user_id)"},{"line_number":143,"context_line":"        user_dn \u003d user_ref[\u0027dn\u0027]"},{"line_number":144,"context_line":"        self.get_group(group_id)"},{"line_number":145,"context_line":"        self.group.add_user(user_dn, group_id, user_id)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def remove_user_from_group(self, user_id, group_id):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FI%2F4%3D","line":144,"updated":"2014-04-23 18:35:13.000000000","message":"Is this call doing anything?","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c99989394ea90130801e159f3b26572c5341385d","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    def add_user_to_group(self, user_id, group_id):"},{"line_number":142,"context_line":"        user_ref \u003d self._get_user(user_id)"},{"line_number":143,"context_line":"        user_dn \u003d user_ref[\u0027dn\u0027]"},{"line_number":144,"context_line":"        self.get_group(group_id)"},{"line_number":145,"context_line":"        self.group.add_user(user_dn, group_id, user_id)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def remove_user_from_group(self, user_id, group_id):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FIg8%3D","line":144,"in_reply_to":"AAAAXH%2F%2FI%2F4%3D","updated":"2014-04-23 19:28:25.000000000","message":"to make sure the group exist I suppose","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"},{"author":{"_account_id":9098,"name":"Nathan Kinder","email":"nkinder@redhat.com","username":"nkinder"},"change_message_id":"b3591431017b4f9e0a7e6ccb8b1ae70cdd30132b","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    def add_user_to_group(self, user_id, group_id):"},{"line_number":142,"context_line":"        user_ref \u003d self._get_user(user_id)"},{"line_number":143,"context_line":"        user_dn \u003d user_ref[\u0027dn\u0027]"},{"line_number":144,"context_line":"        self.get_group(group_id)"},{"line_number":145,"context_line":"        self.group.add_user(user_dn, group_id, user_id)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def remove_user_from_group(self, user_id, group_id):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FF7I%3D","line":144,"in_reply_to":"AAAAXH%2F%2FIg8%3D","updated":"2014-04-24 04:06:34.000000000","message":"It\u0027s not needed.  We can use the exception returned from the failed modify operation to determine if the group exists or not.  See the latest patch.","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"},{"author":{"_account_id":9098,"name":"Nathan Kinder","email":"nkinder@redhat.com","username":"nkinder"},"change_message_id":"27165d0b51352bc3ef6481b30e5b355bcd685db9","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    def remove_user_from_group(self, user_id, group_id):"},{"line_number":148,"context_line":"        user_ref \u003d self._get_user(user_id)"},{"line_number":149,"context_line":"        user_dn \u003d user_ref[\u0027dn\u0027]"},{"line_number":150,"context_line":"        self.get_group(group_id)"},{"line_number":151,"context_line":"        self.group.remove_user(user_dn, group_id, user_id)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def list_groups_for_user(self, user_id, hints):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FI%2Fc%3D","line":150,"updated":"2014-04-23 18:35:13.000000000","message":"Is this call doing anything?","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c99989394ea90130801e159f3b26572c5341385d","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    def remove_user_from_group(self, user_id, group_id):"},{"line_number":148,"context_line":"        user_ref \u003d self._get_user(user_id)"},{"line_number":149,"context_line":"        user_dn \u003d user_ref[\u0027dn\u0027]"},{"line_number":150,"context_line":"        self.get_group(group_id)"},{"line_number":151,"context_line":"        self.group.remove_user(user_dn, group_id, user_id)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def list_groups_for_user(self, user_id, hints):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FIgQ%3D","line":150,"in_reply_to":"AAAAXH%2F%2FI%2Fc%3D","updated":"2014-04-23 19:28:25.000000000","message":"same as above","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"},{"author":{"_account_id":9098,"name":"Nathan Kinder","email":"nkinder@redhat.com","username":"nkinder"},"change_message_id":"b3591431017b4f9e0a7e6ccb8b1ae70cdd30132b","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    def remove_user_from_group(self, user_id, group_id):"},{"line_number":148,"context_line":"        user_ref \u003d self._get_user(user_id)"},{"line_number":149,"context_line":"        user_dn \u003d user_ref[\u0027dn\u0027]"},{"line_number":150,"context_line":"        self.get_group(group_id)"},{"line_number":151,"context_line":"        self.group.remove_user(user_dn, group_id, user_id)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def list_groups_for_user(self, user_id, hints):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FF7E%3D","line":150,"in_reply_to":"AAAAXH%2F%2FIgQ%3D","updated":"2014-04-24 04:06:34.000000000","message":"...also not needed.","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"},{"author":{"_account_id":9098,"name":"Nathan Kinder","email":"nkinder@redhat.com","username":"nkinder"},"change_message_id":"27165d0b51352bc3ef6481b30e5b355bcd685db9","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def list_groups_for_user(self, user_id, hints):"},{"line_number":154,"context_line":"        self.get_user(user_id)"},{"line_number":155,"context_line":"        user_dn \u003d self.user._id_to_dn(user_id)"},{"line_number":156,"context_line":"        user_ref \u003d self._get_user(user_id)"},{"line_number":157,"context_line":"        user_dn \u003d user_ref[\u0027dn\u0027]"},{"line_number":158,"context_line":"        return self.group.list_user_groups_filtered(user_dn)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FI7k%3D","line":155,"updated":"2014-04-23 18:35:13.000000000","message":"The above two lines should be removed.  Lines 156-157 are intended to replace them.","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c99989394ea90130801e159f3b26572c5341385d","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def list_groups_for_user(self, user_id, hints):"},{"line_number":154,"context_line":"        self.get_user(user_id)"},{"line_number":155,"context_line":"        user_dn \u003d self.user._id_to_dn(user_id)"},{"line_number":156,"context_line":"        user_ref \u003d self._get_user(user_id)"},{"line_number":157,"context_line":"        user_dn \u003d user_ref[\u0027dn\u0027]"},{"line_number":158,"context_line":"        return self.group.list_user_groups_filtered(user_dn)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FIfo%3D","line":155,"in_reply_to":"AAAAXH%2F%2FI7k%3D","updated":"2014-04-23 19:28:25.000000000","message":"good catch!","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54c786b4a92f8b5b3ff8b6250accb5a2f1a6bb1a","unresolved":false,"context_lines":[{"line_number":358,"context_line":""},{"line_number":359,"context_line":"        query \u003d \u0027(\u0026(objectClass\u003d%s)(%s\u003d%s)%s)\u0027 % (self.object_class,"},{"line_number":360,"context_line":"                                                  self.member_attribute,"},{"line_number":361,"context_line":"                                                  user_dn,"},{"line_number":362,"context_line":"                                                  self.ldap_filter or \u0027\u0027)"},{"line_number":363,"context_line":"        memberships \u003d self.get_all_filtered(query)"},{"line_number":364,"context_line":"        return memberships"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FG0Y%3D","line":361,"updated":"2014-04-24 00:03:27.000000000","message":"escape the user_dn string for a filter -- see line 348","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"},{"author":{"_account_id":9098,"name":"Nathan Kinder","email":"nkinder@redhat.com","username":"nkinder"},"change_message_id":"b3591431017b4f9e0a7e6ccb8b1ae70cdd30132b","unresolved":false,"context_lines":[{"line_number":358,"context_line":""},{"line_number":359,"context_line":"        query \u003d \u0027(\u0026(objectClass\u003d%s)(%s\u003d%s)%s)\u0027 % (self.object_class,"},{"line_number":360,"context_line":"                                                  self.member_attribute,"},{"line_number":361,"context_line":"                                                  user_dn,"},{"line_number":362,"context_line":"                                                  self.ldap_filter or \u0027\u0027)"},{"line_number":363,"context_line":"        memberships \u003d self.get_all_filtered(query)"},{"line_number":364,"context_line":"        return memberships"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FF7Y%3D","line":361,"in_reply_to":"AAAAXH%2F%2FG0Y%3D","updated":"2014-04-24 04:06:34.000000000","message":"Done","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"8df4081894c803defa1337fe25e43923dc365e26","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            # Try to fetch the user to see if it even exists.  This"},{"line_number":178,"context_line":"            # will raise a more accurate exception."},{"line_number":179,"context_line":"            self.get_user(user_id)"},{"line_number":180,"context_line":"            raise exception.NotFound(_(\u0027User not found in group\u0027))"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"# TODO(termie): turn this into a data object and move logic to driver"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAXH%2F%2FFJ0%3D","line":180,"updated":"2014-04-24 07:04:58.000000000","message":"Maybe if you care about exception accuracy you should insert in to this exception message information about user ID and group ID","commit_id":"9629e05f46bfdebaa362423cb495fd730410f687"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b8871353600f49a4713c63a333000a9d50eafe3a","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            # Try to fetch the user to see if it even exists.  This"},{"line_number":178,"context_line":"            # will raise a more accurate exception."},{"line_number":179,"context_line":"            self.get_user(user_id)"},{"line_number":180,"context_line":"            raise exception.NotFound(_(\u0027User not found in group\u0027))"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"# TODO(termie): turn this into a data object and move logic to driver"}],"source_content_type":"text/x-python","patch_set":16,"id":"9ad9bd40_307ae888","line":180,"in_reply_to":"AAAAXH%2F%2FFJ0%3D","updated":"2014-05-01 15:24:19.000000000","message":"++ giving the UUIDs of the group and the user here would be helpful for the end user.","commit_id":"9629e05f46bfdebaa362423cb495fd730410f687"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"8df4081894c803defa1337fe25e43923dc365e26","unresolved":false,"context_lines":[{"line_number":358,"context_line":"                                                  self.member_attribute,"},{"line_number":359,"context_line":"                                                  user_dn_esc,"},{"line_number":360,"context_line":"                                                  self.ldap_filter or \u0027\u0027)"},{"line_number":361,"context_line":"        memberships \u003d self.get_all_filtered(query)"},{"line_number":362,"context_line":"        return memberships"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def list_group_users(self, group_id):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAXH%2F%2FFYY%3D","line":361,"updated":"2014-04-24 07:04:58.000000000","message":"Why we need local variable \u0027memberships\u0027 here? Maybe it\u0027s better to use:\n\n return self.get_all_filtered(query)","commit_id":"9629e05f46bfdebaa362423cb495fd730410f687"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"b105cc3702ffa59931b074ba68a7ef51903363ef","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        except exception.UserNotFound:"},{"line_number":58,"context_line":"            raise AssertionError(_(\u0027Invalid user / password\u0027))"},{"line_number":59,"context_line":"        if not user_id or not password:"},{"line_number":60,"context_line":"            raise AssertionError(_(\u0027Invalid user / password\u0027))"},{"line_number":61,"context_line":"        conn \u003d None"},{"line_number":62,"context_line":"        try:"},{"line_number":63,"context_line":"            conn \u003d self.user.get_connection(user_ref[\u0027dn\u0027],"}],"source_content_type":"text/x-python","patch_set":17,"id":"7adec928_7d90cc95","line":60,"updated":"2014-05-08 20:23:54.000000000","message":"unrelated, but the if statement should be done priority to user lookup to save us a cycle. Maybe we can do this in a separate patch.","commit_id":"401294da9a7babdd6be5c7f19aef0e07811ba09e"}],"keystone/identity/backends/sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b8871353600f49a4713c63a333000a9d50eafe3a","unresolved":false,"context_lines":[{"line_number":202,"context_line":"            # exceptions."},{"line_number":203,"context_line":"            self.get_group(group_id)"},{"line_number":204,"context_line":"            self.get_user(user_id)"},{"line_number":205,"context_line":"            raise exception.NotFound(_(\u0027User not found in group\u0027))"},{"line_number":206,"context_line":"        with session.begin():"},{"line_number":207,"context_line":"            session.delete(membership_ref)"},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"9ad9bd40_6d4adb81","line":205,"updated":"2014-05-01 15:24:19.000000000","message":"Since we have the user_id and group_id we could update the exception to include the ID. That way the user knows what user wasn\u0027t found in what group.","commit_id":"9629e05f46bfdebaa362423cb495fd730410f687"}],"keystone/identity/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f09a67c0678c7c2e40a94cf41e3ee2d80e086bc0","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    :returns: user_ref"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    \"\"\""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    if user_ref:"},{"line_number":52,"context_line":"        user_ref \u003d user_ref.copy()"},{"line_number":53,"context_line":"        user_ref.pop(\u0027password\u0027, None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9%2BTI%3D","line":50,"updated":"2013-12-03 21:28:33.000000000","message":"Just out of curiosity, why add a new line here?","commit_id":"f5a5d477f3053303d407d7ff8cd590f3aa05342d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a44beffad25e35f4f43c50842fa0f5d3bbf5f249","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    \"\"\"Filter out private items in a user dict."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    :param user_ref user dictionary. The values"},{"line_number":56,"context_line":"     \u0027password\u0027, \u0027tenants\u0027 and \u0027groups\u0027 are removed if present."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    :returns: user_ref"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F%2Bxek%3D","line":56,"updated":"2014-01-22 10:02:32.000000000","message":"(nit) was a \u0027bug\u0027 in the comment before, but \u0027domains\u0027 are also removed...","commit_id":"8e71b8bcac84c21bd4df96725bda576a02acae02"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0abd22282611f382f2643c4f8140bfb7fa778afd","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    :returns: user_ref"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    \"\"\""},{"line_number":59,"context_line":"    if user_ref:"},{"line_number":60,"context_line":"        user_ref \u003d user_ref.copy()"},{"line_number":61,"context_line":"        user_ref.pop(\u0027password\u0027, None)"},{"line_number":62,"context_line":"        user_ref.pop(\u0027tenants\u0027, None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAU3%2F%2FZhY%3D","line":59,"updated":"2014-02-26 21:09:18.000000000","message":"(NIT): we could put \u0027password\u0027, \u0027tenants\u0027, \u0027groups\u0027 and \u0027domains\u0027 in a list and iterate over it\n\n    vals_to_remove \u003d [\u0027password\u0027, \u0027tenants\u0027, \u0027groups\u0027, \u0027domains\u0027]\n    user_ref \u003d user_ref.copy()\n    for val in vals_to_remove:\n         if val in user_ref:\n              user_ref.pop(val, None)\n\nless lines and we can maintain all the resources we want to pop in a list.","commit_id":"9371f790220262154d3b27f57b7769abca503752"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"702e066fe03d0754c5efdf8bb7970f63f221a36e","unresolved":false,"context_lines":[{"line_number":53,"context_line":"def filter_user(user_ref):"},{"line_number":54,"context_line":"    \"\"\"Filter out private items in a user dict."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    :param user_ref user dictionary. The values \u0027password\u0027,"},{"line_number":57,"context_line":"     \u0027tenants\u0027, \u0027groups\u0027 and \u0027domains\u0027 are removed if present."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    :returns: user_ref"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAVn%2F%2Fo6I%3D","line":56,"updated":"2014-03-04 23:01:32.000000000","message":"add a : after user_ref","commit_id":"35b3d67d2015a5e4ddd0f6bff04683dd9f8e6305"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"702e066fe03d0754c5efdf8bb7970f63f221a36e","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    \"\"\""},{"line_number":62,"context_line":"    if user_ref:"},{"line_number":63,"context_line":"        user_ref \u003d user_ref.copy()"},{"line_number":64,"context_line":"        for name in _FILTERED_FIELDS:"},{"line_number":65,"context_line":"            user_ref.pop(name, None)"},{"line_number":66,"context_line":"            try:"},{"line_number":67,"context_line":"                user_ref[\u0027extra\u0027].pop(name, None)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAVn%2F%2Fotw%3D","line":64,"updated":"2014-03-04 23:01:32.000000000","message":"I don\u0027t understand this change... looks like it\u0027s just doing the same thing it did before, except also popping from \u0027extra\u0027... is this fixing a different bug?","commit_id":"35b3d67d2015a5e4ddd0f6bff04683dd9f8e6305"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b9ba2c932e816eaa4d5008522749b0fb9e409e02","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    \"\"\""},{"line_number":62,"context_line":"    if user_ref:"},{"line_number":63,"context_line":"        user_ref \u003d user_ref.copy()"},{"line_number":64,"context_line":"        for name in _FILTERED_FIELDS:"},{"line_number":65,"context_line":"            user_ref.pop(name, None)"},{"line_number":66,"context_line":"            try:"},{"line_number":67,"context_line":"                user_ref[\u0027extra\u0027].pop(name, None)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2FEz4%3D","line":64,"in_reply_to":"AAAAVn%2F%2Fotw%3D","updated":"2014-03-20 13:43:34.000000000","message":"It was just a code clean up done as part of adding in the extra values to be popped.  It should also be popping the dn field but that ended up moved into another file because it needs to be filtered out from other entities.  I think this change is worth keeping.","commit_id":"35b3d67d2015a5e4ddd0f6bff04683dd9f8e6305"}],"keystone/tests/test_backend_ldap.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0abd22282611f382f2643c4f8140bfb7fa778afd","unresolved":false,"context_lines":[{"line_number":1120,"context_line":"        domain \u003d self._get_domain_fixture()"},{"line_number":1121,"context_line":"        expected_group_ids \u003d []"},{"line_number":1122,"context_line":"        numgroups \u003d 3"},{"line_number":1123,"context_line":"        for _ in range(numgroups):"},{"line_number":1124,"context_line":"            group \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":1125,"context_line":"                     \u0027domain_id\u0027: domain[\u0027id\u0027]}"},{"line_number":1126,"context_line":"            self.identity_api.create_group(group[\u0027id\u0027], group)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAU3%2F%2FZd8%3D","line":1123,"updated":"2014-02-26 21:09:18.000000000","message":"This logic is repeated quite a bit, maybe it could be pulled out into a separate method?","commit_id":"9371f790220262154d3b27f57b7769abca503752"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"9ae2cfc11177a58b5d2fa81ce6e995814f4e491e","unresolved":false,"context_lines":[{"line_number":1120,"context_line":"        domain \u003d self._get_domain_fixture()"},{"line_number":1121,"context_line":"        expected_group_ids \u003d []"},{"line_number":1122,"context_line":"        numgroups \u003d 3"},{"line_number":1123,"context_line":"        for _ in range(numgroups):"},{"line_number":1124,"context_line":"            group \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":1125,"context_line":"                     \u0027domain_id\u0027: domain[\u0027id\u0027]}"},{"line_number":1126,"context_line":"            self.identity_api.create_group(group[\u0027id\u0027], group)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVX%2F%2F%2BLU%3D","line":1123,"in_reply_to":"AAAAU3%2F%2FZd8%3D","updated":"2014-02-27 03:32:33.000000000","message":"subtle different","commit_id":"9371f790220262154d3b27f57b7769abca503752"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"702e066fe03d0754c5efdf8bb7970f63f221a36e","unresolved":false,"context_lines":[{"line_number":500,"context_line":"                          super(BaseLDAPIdentity, self).test_update_user_name)"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"    def test_attribute_update(self):"},{"line_number":503,"context_line":"        self.skipTest(\"Blank value in a required field is an error in LDAP\")"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"    def test_arbitrary_attributes_are_returned_from_create_user(self):"},{"line_number":506,"context_line":"        self.skipTest(\"Using arbitrary attributes doesn\u0027t work under LDAP\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAVn%2F%2Fo1U%3D","line":503,"updated":"2014-03-04 23:01:32.000000000","message":"what\u0027s this doing here? It should be mentioned in the commit message.","commit_id":"35b3d67d2015a5e4ddd0f6bff04683dd9f8e6305"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b9ba2c932e816eaa4d5008522749b0fb9e409e02","unresolved":false,"context_lines":[{"line_number":500,"context_line":"                          super(BaseLDAPIdentity, self).test_update_user_name)"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"    def test_attribute_update(self):"},{"line_number":503,"context_line":"        self.skipTest(\"Blank value in a required field is an error in LDAP\")"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"    def test_arbitrary_attributes_are_returned_from_create_user(self):"},{"line_number":506,"context_line":"        self.skipTest(\"Using arbitrary attributes doesn\u0027t work under LDAP\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2FExw%3D","line":503,"in_reply_to":"AAAAVn%2F%2Fo1U%3D","updated":"2014-03-20 13:43:34.000000000","message":"Done","commit_id":"35b3d67d2015a5e4ddd0f6bff04683dd9f8e6305"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"702e066fe03d0754c5efdf8bb7970f63f221a36e","unresolved":false,"context_lines":[{"line_number":1131,"context_line":"        # Create some test groups."},{"line_number":1132,"context_line":"        domain \u003d self._get_domain_fixture()"},{"line_number":1133,"context_line":"        expected_group_ids \u003d []"},{"line_number":1134,"context_line":"        numgroups \u003d 3"},{"line_number":1135,"context_line":"        for _ in range(numgroups):"},{"line_number":1136,"context_line":"            group \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":1137,"context_line":"                     \u0027domain_id\u0027: domain[\u0027id\u0027]}"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAVn%2F%2Fovk%3D","line":1134,"updated":"2014-03-04 23:01:32.000000000","message":"is there something important about adding 3 groups or even more than 1 group?","commit_id":"35b3d67d2015a5e4ddd0f6bff04683dd9f8e6305"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b9ba2c932e816eaa4d5008522749b0fb9e409e02","unresolved":false,"context_lines":[{"line_number":1131,"context_line":"        # Create some test groups."},{"line_number":1132,"context_line":"        domain \u003d self._get_domain_fixture()"},{"line_number":1133,"context_line":"        expected_group_ids \u003d []"},{"line_number":1134,"context_line":"        numgroups \u003d 3"},{"line_number":1135,"context_line":"        for _ in range(numgroups):"},{"line_number":1136,"context_line":"            group \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":1137,"context_line":"                     \u0027domain_id\u0027: domain[\u0027id\u0027]}"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2FExM%3D","line":1134,"in_reply_to":"AAAAVn%2F%2Fovk%3D","updated":"2014-03-20 13:43:34.000000000","message":"Just needed to be more than one.","commit_id":"35b3d67d2015a5e4ddd0f6bff04683dd9f8e6305"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b3f266f914a2d416bd17b0c76ce6faff79c4562f","unresolved":false,"context_lines":[{"line_number":1245,"context_line":"        group_ids \u003d set(group[\u0027id\u0027] for group in groups)"},{"line_number":1246,"context_line":"        for group_ref in groups:"},{"line_number":1247,"context_line":"            self.assertNotIn(\u0027dn\u0027, group_ref)"},{"line_number":1248,"context_line":"        self.assertEqual(set(expected_group_ids), group_ids)"},{"line_number":1249,"context_line":""},{"line_number":1250,"context_line":""},{"line_number":1251,"context_line":"class LDAPIdentityEnabledEmulation(LDAPIdentity):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F%2BnKI%3D","line":1248,"updated":"2014-03-25 15:22:06.000000000","message":"it seems like you need to add an \"assertNotIn(\u0027dn\u0027, whatever) into almost every test in this module, not to mention all the tests you\u0027re not overriding","commit_id":"964e4c336e021cdca7d193093e674820ddf75b4a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"54c786b4a92f8b5b3ff8b6250accb5a2f1a6bb1a","unresolved":false,"context_lines":[{"line_number":551,"context_line":"                          super(BaseLDAPIdentity, self).test_update_user_name)"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"    def test_attribute_update(self):"},{"line_number":554,"context_line":"        self.skipTest(\"Blank value in a required field is an error in LDAP\")"},{"line_number":555,"context_line":""},{"line_number":556,"context_line":"    def test_arbitrary_attributes_are_returned_from_create_user(self):"},{"line_number":557,"context_line":"        self.skipTest(\"Using arbitrary attributes doesn\u0027t work under LDAP\")"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FG0A%3D","line":554,"updated":"2014-04-24 00:03:27.000000000","message":"this looks unrelated.","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"},{"author":{"_account_id":9098,"name":"Nathan Kinder","email":"nkinder@redhat.com","username":"nkinder"},"change_message_id":"b3591431017b4f9e0a7e6ccb8b1ae70cdd30132b","unresolved":false,"context_lines":[{"line_number":551,"context_line":"                          super(BaseLDAPIdentity, self).test_update_user_name)"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"    def test_attribute_update(self):"},{"line_number":554,"context_line":"        self.skipTest(\"Blank value in a required field is an error in LDAP\")"},{"line_number":555,"context_line":""},{"line_number":556,"context_line":"    def test_arbitrary_attributes_are_returned_from_create_user(self):"},{"line_number":557,"context_line":"        self.skipTest(\"Using arbitrary attributes doesn\u0027t work under LDAP\")"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FF6g%3D","line":554,"in_reply_to":"AAAAXH%2F%2FG0A%3D","updated":"2014-04-24 04:06:34.000000000","message":"This was discussed in a previous patch revision, and it was decided that it can just be called out in the commit message.  I\u0027m fine splitting it out as a separate patch if desired.","commit_id":"0c81bc906a675fc9c7a89b06d4bd4137f405082f"}]}
