)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cc4885835d2f56de552df890818ac59bbf5c3cb7","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Sergey Nikitin \u003csnikitin@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-04-10 12:30:30 +0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Code which get elements of tree in ldap moved to one common method"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Code which use \u0027search_s \u0027 in ldap backends moved"},{"line_number":10,"context_line":"to a new method to escape duplication of code."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAW3%2F%2FiGE%3D","line":7,"updated":"2014-04-13 16:18:26.000000000","message":"change \"get\" to \"gets\"\n\nchange \"one common\" to \"a common\"","commit_id":"1a1b5bd4eb67c7b6514ffad7c8af3c76df48c46b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cc4885835d2f56de552df890818ac59bbf5c3cb7","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Code which get elements of tree in ldap moved to one common method"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Code which use \u0027search_s \u0027 in ldap backends moved"},{"line_number":10,"context_line":"to a new method to escape duplication of code."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I5b9b89d452d6031b54ccb15cdbd9129939d29f7f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAW3%2F%2FiF8%3D","line":9,"updated":"2014-04-13 16:18:26.000000000","message":"change \"use\" to \"uses\"\n\nalso, remove extra space after search_s","commit_id":"1a1b5bd4eb67c7b6514ffad7c8af3c76df48c46b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cc4885835d2f56de552df890818ac59bbf5c3cb7","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Code which get elements of tree in ldap moved to one common method"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Code which use \u0027search_s \u0027 in ldap backends moved"},{"line_number":10,"context_line":"to a new method to escape duplication of code."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I5b9b89d452d6031b54ccb15cdbd9129939d29f7f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAW3%2F%2FiGA%3D","line":10,"updated":"2014-04-13 16:18:26.000000000","message":"change \"escape\" to \"remove\"","commit_id":"1a1b5bd4eb67c7b6514ffad7c8af3c76df48c46b"}],"keystone/assignment/backends/ldap.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ba74175d96a651d2b97cc1ac55f52eedd86df058","unresolved":false,"context_lines":[{"line_number":610,"context_line":""},{"line_number":611,"context_line":"    def list_project_roles_for_user(self, user_dn, project_subtree):"},{"line_number":612,"context_line":"        roles \u003d self._ldap_get_list(project_subtree, ldap.SCOPE_SUBTREE,"},{"line_number":613,"context_line":"                                    {self.member_attribute: user_dn})"},{"line_number":614,"context_line":"        res \u003d []"},{"line_number":615,"context_line":"        for role_dn, _ in roles:"},{"line_number":616,"context_line":"            # ldap.dn.dn2str returns an array, where the first"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAW3%2F%2F49s%3D","line":613,"updated":"2014-04-09 17:13:21.000000000","message":"suggest passing the optional attributes as named. Is {self.member_attribute: user_dn} the search query_params or attrlist?","commit_id":"2dca945979e6ba484eb7b0cf3e66ad682d92a9de"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"9daf4e98201eb8ac2762f607b41e3a4d27722d33","unresolved":false,"context_lines":[{"line_number":610,"context_line":""},{"line_number":611,"context_line":"    def list_project_roles_for_user(self, user_dn, project_subtree):"},{"line_number":612,"context_line":"        roles \u003d self._ldap_get_list(project_subtree, ldap.SCOPE_SUBTREE,"},{"line_number":613,"context_line":"                                    {self.member_attribute: user_dn})"},{"line_number":614,"context_line":"        res \u003d []"},{"line_number":615,"context_line":"        for role_dn, _ in roles:"},{"line_number":616,"context_line":"            # ldap.dn.dn2str returns an array, where the first"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAW3%2F%2F3wU%3D","line":613,"in_reply_to":"AAAAW3%2F%2F49s%3D","updated":"2014-04-09 19:19:41.000000000","message":"{self.member_attribute: user_dn} is a query_params, but I did\u0027t point it out because this attrubute is on the third place.\nPerhaps you\u0027re right and it\u0027s better to add the name of attribute","commit_id":"2dca945979e6ba484eb7b0cf3e66ad682d92a9de"}],"keystone/common/ldap/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ba74175d96a651d2b97cc1ac55f52eedd86df058","unresolved":false,"context_lines":[{"line_number":927,"context_line":"        finally:"},{"line_number":928,"context_line":"            conn.unbind_s()"},{"line_number":929,"context_line":""},{"line_number":930,"context_line":"    def _ldap_get_list(self, obj_dn, scope, query_params\u003dNone, attrlist\u003dNone):"},{"line_number":931,"context_line":"        conn \u003d self.get_connection()"},{"line_number":932,"context_line":"        query \u003d u\u0027(objectClass\u003d%s)\u0027 % self.object_class"},{"line_number":933,"context_line":"        if query_params:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAW3%2F%2F44E%3D","line":930,"updated":"2014-04-09 17:13:21.000000000","message":"Should a test be added in /keystone/tests/test_backend_ldap.py to make sure this specific method in BaseLdap doesn\u0027t regress, since backend code relies on it.","commit_id":"2dca945979e6ba484eb7b0cf3e66ad682d92a9de"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"b9752d7b42a4578b4250d141dbe71fb34686a16a","unresolved":false,"context_lines":[{"line_number":927,"context_line":"        finally:"},{"line_number":928,"context_line":"            conn.unbind_s()"},{"line_number":929,"context_line":""},{"line_number":930,"context_line":"    def _ldap_get_list(self, obj_dn, scope, query_params\u003dNone, attrlist\u003dNone):"},{"line_number":931,"context_line":"        conn \u003d self.get_connection()"},{"line_number":932,"context_line":"        query \u003d u\u0027(objectClass\u003d%s)\u0027 % self.object_class"},{"line_number":933,"context_line":"        if query_params:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAW3%2F%2F0NY%3D","line":930,"in_reply_to":"AAAAW3%2F%2F33U%3D","updated":"2014-04-10 08:27:56.000000000","message":"Well, I checked code coverage of BaseLdap and found out that methods like _ldap_get, _ladp_get_all and _ldap_get_list are covered by tests indirectly. That\u0027s why I want to add direct tests for this methods in another patch soon.","commit_id":"2dca945979e6ba484eb7b0cf3e66ad682d92a9de"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"9daf4e98201eb8ac2762f607b41e3a4d27722d33","unresolved":false,"context_lines":[{"line_number":927,"context_line":"        finally:"},{"line_number":928,"context_line":"            conn.unbind_s()"},{"line_number":929,"context_line":""},{"line_number":930,"context_line":"    def _ldap_get_list(self, obj_dn, scope, query_params\u003dNone, attrlist\u003dNone):"},{"line_number":931,"context_line":"        conn \u003d self.get_connection()"},{"line_number":932,"context_line":"        query \u003d u\u0027(objectClass\u003d%s)\u0027 % self.object_class"},{"line_number":933,"context_line":"        if query_params:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAW3%2F%2F33U%3D","line":930,"in_reply_to":"AAAAW3%2F%2F44E%3D","updated":"2014-04-09 19:19:41.000000000","message":"Ok. I\u0027ll add a test.","commit_id":"2dca945979e6ba484eb7b0cf3e66ad682d92a9de"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"597ae3d5c7f708e8ca2e24d1b8ffe53c554e8ab5","unresolved":false,"context_lines":[{"line_number":927,"context_line":"        finally:"},{"line_number":928,"context_line":"            conn.unbind_s()"},{"line_number":929,"context_line":""},{"line_number":930,"context_line":"    def _ldap_get_list(self, obj_dn, scope, query_params\u003dNone, attrlist\u003dNone):"},{"line_number":931,"context_line":"        conn \u003d self.get_connection()"},{"line_number":932,"context_line":"        query \u003d u\u0027(objectClass\u003d%s)\u0027 % self.object_class"},{"line_number":933,"context_line":"        if query_params:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FxmE%3D","line":930,"updated":"2014-04-10 13:49:32.000000000","message":"In the following review, \n\nhttps://review.openstack.org/#/c/86578/\n\nself.delete_tree_nodes is a public method. I am thinking since the code in this review and the review linked above serve similar purpose, they should follow similar convention.","commit_id":"1a1b5bd4eb67c7b6514ffad7c8af3c76df48c46b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cc4885835d2f56de552df890818ac59bbf5c3cb7","unresolved":false,"context_lines":[{"line_number":927,"context_line":"        finally:"},{"line_number":928,"context_line":"            conn.unbind_s()"},{"line_number":929,"context_line":""},{"line_number":930,"context_line":"    def _ldap_get_list(self, obj_dn, scope, query_params\u003dNone, attrlist\u003dNone):"},{"line_number":931,"context_line":"        conn \u003d self.get_connection()"},{"line_number":932,"context_line":"        query \u003d u\u0027(objectClass\u003d%s)\u0027 % self.object_class"},{"line_number":933,"context_line":"        if query_params:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FiFs%3D","line":930,"in_reply_to":"AAAAW3%2F%2Frd4%3D","updated":"2014-04-13 16:18:26.000000000","message":"I\u0027m fine with this as a \"private\" method, since that matches the convention set by _ldap_get_all.\n\nchange \"obj_dn\" to \"search_base\"","commit_id":"1a1b5bd4eb67c7b6514ffad7c8af3c76df48c46b"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"3b402342ad4ef9844f9120f74da9499b33261cf1","unresolved":false,"context_lines":[{"line_number":927,"context_line":"        finally:"},{"line_number":928,"context_line":"            conn.unbind_s()"},{"line_number":929,"context_line":""},{"line_number":930,"context_line":"    def _ldap_get_list(self, obj_dn, scope, query_params\u003dNone, attrlist\u003dNone):"},{"line_number":931,"context_line":"        conn \u003d self.get_connection()"},{"line_number":932,"context_line":"        query \u003d u\u0027(objectClass\u003d%s)\u0027 % self.object_class"},{"line_number":933,"context_line":"        if query_params:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2Frd4%3D","line":930,"in_reply_to":"AAAAW3%2F%2FxmE%3D","updated":"2014-04-11 07:33:41.000000000","message":"Done","commit_id":"1a1b5bd4eb67c7b6514ffad7c8af3c76df48c46b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cc4885835d2f56de552df890818ac59bbf5c3cb7","unresolved":false,"context_lines":[{"line_number":933,"context_line":"        if query_params:"},{"line_number":934,"context_line":"            query \u003d (u\u0027(\u0026%s%s)\u0027 %"},{"line_number":935,"context_line":"                     (query, \u0027\u0027.join([\u0027(%s\u003d%s)\u0027 % (k, v)"},{"line_number":936,"context_line":"                                      for k, v in query_params.iteritems()])))"},{"line_number":937,"context_line":"        try:"},{"line_number":938,"context_line":"            return conn.search_s(obj_dn, scope, query, attrlist)"},{"line_number":939,"context_line":"        except ldap.NO_SUCH_OBJECT:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FiE4%3D","line":936,"updated":"2014-04-13 16:18:26.000000000","message":"use six.iteritems for py3 compat -- https://pythonhosted.org/six/#six.iteritems","commit_id":"1a1b5bd4eb67c7b6514ffad7c8af3c76df48c46b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"132c29907fb4469f033a7107dba3c39fceaded0b","unresolved":false,"context_lines":[{"line_number":937,"context_line":"                       attrlist\u003dNone):"},{"line_number":938,"context_line":"        conn \u003d self.get_connection()"},{"line_number":939,"context_line":"        query \u003d u\u0027(objectClass\u003d%s)\u0027 % self.object_class"},{"line_number":940,"context_line":"        if query_params:"},{"line_number":941,"context_line":"            query \u003d (u\u0027(\u0026%s%s)\u0027 %"},{"line_number":942,"context_line":"                     (query, \u0027\u0027.join([\u0027(%s\u003d%s)\u0027 % (k, v) for k, v in"},{"line_number":943,"context_line":"                                      six.iteritems(query_params)])))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAXH%2F%2Fb%2FA%3D","line":940,"updated":"2014-04-21 19:54:02.000000000","message":"Nothing uses this anymore. Should it be deleted and the param removed? It looks like use disappeared between patchset 2 and 3.","commit_id":"defe98e2a1777ba3056ae4a2852198acdb72bf0d"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"bd663b23acb87267922a4bfd327faf4635cd7f75","unresolved":false,"context_lines":[{"line_number":937,"context_line":"                       attrlist\u003dNone):"},{"line_number":938,"context_line":"        conn \u003d self.get_connection()"},{"line_number":939,"context_line":"        query \u003d u\u0027(objectClass\u003d%s)\u0027 % self.object_class"},{"line_number":940,"context_line":"        if query_params:"},{"line_number":941,"context_line":"            query \u003d (u\u0027(\u0026%s%s)\u0027 %"},{"line_number":942,"context_line":"                     (query, \u0027\u0027.join([\u0027(%s\u003d%s)\u0027 % (k, v) for k, v in"},{"line_number":943,"context_line":"                                      six.iteritems(query_params)])))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAXH%2F%2FTeM%3D","line":940,"in_reply_to":"AAAAXH%2F%2FYho%3D","updated":"2014-04-22 16:14:51.000000000","message":"used :)","commit_id":"defe98e2a1777ba3056ae4a2852198acdb72bf0d"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"467f04f41642cd48d29413354f2ddee3312cf096","unresolved":false,"context_lines":[{"line_number":937,"context_line":"                       attrlist\u003dNone):"},{"line_number":938,"context_line":"        conn \u003d self.get_connection()"},{"line_number":939,"context_line":"        query \u003d u\u0027(objectClass\u003d%s)\u0027 % self.object_class"},{"line_number":940,"context_line":"        if query_params:"},{"line_number":941,"context_line":"            query \u003d (u\u0027(\u0026%s%s)\u0027 %"},{"line_number":942,"context_line":"                     (query, \u0027\u0027.join([\u0027(%s\u003d%s)\u0027 % (k, v) for k, v in"},{"line_number":943,"context_line":"                                      six.iteritems(query_params)])))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAXH%2F%2FYho%3D","line":940,"in_reply_to":"AAAAXH%2F%2Fb%2FA%3D","updated":"2014-04-22 07:15:40.000000000","message":"But query_params uses here \nhttps://review.openstack.org/#/c/86302/3/keystone/assignment/backends/ldap.py\n\nline 613-614","commit_id":"defe98e2a1777ba3056ae4a2852198acdb72bf0d"}],"keystone/identity/backends/ldap.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cc4885835d2f56de552df890818ac59bbf5c3cb7","unresolved":false,"context_lines":[{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    def list_group_users(self, group_id):"},{"line_number":341,"context_line":"        \"\"\"Return a list of user dns which are members of a group.\"\"\""},{"line_number":342,"context_line":"        attrs \u003d self._ldap_get_list(self._id_to_dn(group_id),"},{"line_number":343,"context_line":"                                    ldap.SCOPE_BASE,"},{"line_number":344,"context_line":"                                    attrlist\u003d[self.member_attribute])"},{"line_number":345,"context_line":"        users \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FiEk%3D","line":342,"updated":"2014-04-13 16:18:26.000000000","message":"suggest leave the group_dn \u003d self._id_to_dn(group_id) on a separate line. It\u0027ll be easier to debug and there will be fewer changes.","commit_id":"1a1b5bd4eb67c7b6514ffad7c8af3c76df48c46b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cc4885835d2f56de552df890818ac59bbf5c3cb7","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        \"\"\"Return a list of user dns which are members of a group.\"\"\""},{"line_number":342,"context_line":"        attrs \u003d self._ldap_get_list(self._id_to_dn(group_id),"},{"line_number":343,"context_line":"                                    ldap.SCOPE_BASE,"},{"line_number":344,"context_line":"                                    attrlist\u003d[self.member_attribute])"},{"line_number":345,"context_line":"        users \u003d []"},{"line_number":346,"context_line":"        for dn, member in attrs:"},{"line_number":347,"context_line":"            user_dns \u003d member.get(self.member_attribute, [])"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FiEo%3D","line":344,"updated":"2014-04-13 16:18:26.000000000","message":"should be able to pass a tuple here rather than a list.","commit_id":"1a1b5bd4eb67c7b6514ffad7c8af3c76df48c46b"}]}
