)]}'
{"glance/api/property_protections.py":[{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"2dbf90503ab0709850881d375ac26462cb001725","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            if self.__getitem__(key) is not None:"},{"line_number":106,"context_line":"                if self.property_rules.check_property_rules(key, \u0027update\u0027,"},{"line_number":107,"context_line":"                                                            self.context):"},{"line_number":108,"context_line":"                    self.set_modified(True)"},{"line_number":109,"context_line":"                    return dict.__setitem__(self, key, value)"},{"line_number":110,"context_line":"                else:"},{"line_number":111,"context_line":"                    self.set_modified(False)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1af94dfe_5e619b38","line":108,"updated":"2016-03-17 08:26:07.000000000","message":"Property protection layer is optional but transaction layer is not.\nSo we will have issues when working with that in transaction layer.","commit_id":"fd25cf6b31ca54c2353a9244e71e4a5eadf6125f"}],"glance/api/v2/image_data.py":[{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"2dbf90503ab0709850881d375ac26462cb001725","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                                     \"Use the existing user token.\"),"},{"line_number":111,"context_line":"                                 encodeutils.exception_to_unicode(e))"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"                image_repo.save(image, from_state\u003d\u0027queued\u0027)"},{"line_number":114,"context_line":"                image.set_data(data, size)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1af94dfe_58d4131f","line":113,"updated":"2016-03-17 08:26:07.000000000","message":"Could you please clarify if it is related to transaction layer?\nLooks like this need to be a separate patch.\nHere I see one:\nhttps://review.openstack.org/#/c/292855/","commit_id":"fd25cf6b31ca54c2353a9244e71e4a5eadf6125f"}],"glance/db/__init__.py":[{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"2dbf90503ab0709850881d375ac26462cb001725","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            \u0027min_disk\u0027: image.min_disk,"},{"line_number":242,"context_line":"            \u0027min_ram\u0027: image.min_ram,"},{"line_number":243,"context_line":"            \u0027protected\u0027: image.protected,"},{"line_number":244,"context_line":"            \u0027locations\u0027: image.locations,"},{"line_number":245,"context_line":"            \u0027checksum\u0027: image.checksum,"},{"line_number":246,"context_line":"            \u0027owner\u0027: image.owner,"},{"line_number":247,"context_line":"            \u0027disk_format\u0027: image.disk_format,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1af94dfe_7e0d7736","line":244,"updated":"2016-03-17 08:26:07.000000000","message":"AFAIU, each time we are formatting image to db we need to encrypt locations. So would it be reasonable to convert it here instead of updating locations in image:\n\u0027locations\u0027: _encrypt_locations(image.locations)","commit_id":"fd25cf6b31ca54c2353a9244e71e4a5eadf6125f"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"2dbf90503ab0709850881d375ac26462cb001725","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        image.updated_at \u003d new_values[\u0027updated_at\u0027]"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def save(self, image, from_state\u003dNone):"},{"line_number":272,"context_line":"        if (isinstance(image, glance.domain.Image) or"},{"line_number":273,"context_line":"                isinstance(image, glance.db.ImageProxy)):"},{"line_number":274,"context_line":"            locations \u003d self._encrypt_locations(image.locations)"},{"line_number":275,"context_line":"            image.locations \u003d locations"}],"source_content_type":"text/x-python","patch_set":15,"id":"1af94dfe_3251630f","line":272,"updated":"2016-03-17 08:26:07.000000000","message":"Why do we need this check is Transactional Layer is required?\nLooks like this will not work because image will be always from transaction layer.","commit_id":"fd25cf6b31ca54c2353a9244e71e4a5eadf6125f"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"2dbf90503ab0709850881d375ac26462cb001725","unresolved":false,"context_lines":[{"line_number":301,"context_line":"    def remove(self, image):"},{"line_number":302,"context_line":"        image_values \u003d self._format_image_to_db(image)"},{"line_number":303,"context_line":"        try:"},{"line_number":304,"context_line":"            self.db_api.image_update(self.context, image.image_id,"},{"line_number":305,"context_line":"                                     image_values, purge_props\u003dTrue)"},{"line_number":306,"context_line":"        except (exception.ImageNotFound, exception.Forbidden):"},{"line_number":307,"context_line":"            msg \u003d _(\"No image found with ID %s\") % image.image_id"}],"source_content_type":"text/x-python","patch_set":15,"id":"1af94dfe_837110e3","line":304,"updated":"2016-03-17 08:26:07.000000000","message":"looks like you need to rebase because currently remove only updates image status. It is very important for that patch.","commit_id":"fd25cf6b31ca54c2353a9244e71e4a5eadf6125f"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"741f0b5f3b4f3a856c89aa854649c198880d72ad","unresolved":false,"context_lines":[{"line_number":227,"context_line":"            raise exception.ImageSizeLimitExceeded"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        # the updated_at value is not set in the _format_image_to_db"},{"line_number":230,"context_line":"        # function since it is specific to image create"},{"line_number":231,"context_line":"        image_values[\u0027updated_at\u0027] \u003d image.updated_at"},{"line_number":232,"context_line":"        new_values \u003d self.db_api.image_create(self.context, image_values)"},{"line_number":233,"context_line":"        self.db_api.image_tag_set_all(self.context,"}],"source_content_type":"text/x-python","patch_set":28,"id":"7aa08908_e7ec4ef5","line":230,"updated":"2016-06-11 17:14:34.000000000","message":"I think this comment needs to be revised?","commit_id":"ad991358f844a44fa9a5339a6e2966f97f3ac4ab"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"a663ef080ca44aef4a3d8ca3936eb9a0aadef105","unresolved":false,"context_lines":[{"line_number":227,"context_line":"            raise exception.ImageSizeLimitExceeded"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        # the updated_at value is not set in the _format_image_to_db"},{"line_number":230,"context_line":"        # function since it is specific to image create"},{"line_number":231,"context_line":"        image_values[\u0027updated_at\u0027] \u003d image.updated_at"},{"line_number":232,"context_line":"        new_values \u003d self.db_api.image_create(self.context, image_values)"},{"line_number":233,"context_line":"        self.db_api.image_tag_set_all(self.context,"}],"source_content_type":"text/x-python","patch_set":28,"id":"7aa08908_33368a03","line":230,"in_reply_to":"7aa08908_e7ec4ef5","updated":"2016-06-17 11:49:37.000000000","message":"Done","commit_id":"ad991358f844a44fa9a5339a6e2966f97f3ac4ab"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"c0df3159d9b8031d439c0d0b6f1afe31260a9358","unresolved":false,"context_lines":[{"line_number":198,"context_line":"            key \u003d CONF.metadata_encryption_key"},{"line_number":199,"context_line":"            for l in locations:"},{"line_number":200,"context_line":"                l[\u0027url\u0027] \u003d crypt.urlsafe_decrypt(key, l[\u0027url\u0027])"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        return glance.domain.Image("},{"line_number":203,"context_line":"            image_id\u003ddb_image[\u0027id\u0027],"},{"line_number":204,"context_line":"            name\u003ddb_image[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_8cd58a44","line":201,"updated":"2016-06-17 19:13:31.000000000","message":"Unnecessary line :)","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"64e5808aa6706346740905b79fd6e739825049b6","unresolved":false,"context_lines":[{"line_number":198,"context_line":"            key \u003d CONF.metadata_encryption_key"},{"line_number":199,"context_line":"            for l in locations:"},{"line_number":200,"context_line":"                l[\u0027url\u0027] \u003d crypt.urlsafe_decrypt(key, l[\u0027url\u0027])"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        return glance.domain.Image("},{"line_number":203,"context_line":"            image_id\u003ddb_image[\u0027id\u0027],"},{"line_number":204,"context_line":"            name\u003ddb_image[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_410b002c","line":201,"in_reply_to":"7aa08908_8cd58a44","updated":"2016-06-29 15:15:23.000000000","message":"Done","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"c0df3159d9b8031d439c0d0b6f1afe31260a9358","unresolved":false,"context_lines":[{"line_number":230,"context_line":"        # function since it is specific to image create"},{"line_number":231,"context_line":"        image_values[\u0027updated_at\u0027] \u003d image.updated_at"},{"line_number":232,"context_line":"        new_values \u003d self.db_api.image_create(self.context, image_values)"},{"line_number":233,"context_line":"        self.db_api.image_tag_set_all(self.context,"},{"line_number":234,"context_line":"                                      image.image_id, image.tags)"},{"line_number":235,"context_line":"        image.created_at \u003d new_values[\u0027created_at\u0027]"},{"line_number":236,"context_line":"        image.updated_at \u003d new_values[\u0027updated_at\u0027]"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_e2089582","line":233,"updated":"2016-06-17 19:13:31.000000000","message":"Should we call it if tags are empty and there is nothing to add?\n\nI recommend to do the same as in update method","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"64e5808aa6706346740905b79fd6e739825049b6","unresolved":false,"context_lines":[{"line_number":230,"context_line":"        # function since it is specific to image create"},{"line_number":231,"context_line":"        image_values[\u0027updated_at\u0027] \u003d image.updated_at"},{"line_number":232,"context_line":"        new_values \u003d self.db_api.image_create(self.context, image_values)"},{"line_number":233,"context_line":"        self.db_api.image_tag_set_all(self.context,"},{"line_number":234,"context_line":"                                      image.image_id, image.tags)"},{"line_number":235,"context_line":"        image.created_at \u003d new_values[\u0027created_at\u0027]"},{"line_number":236,"context_line":"        image.updated_at \u003d new_values[\u0027updated_at\u0027]"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_ab93255a","line":233,"in_reply_to":"7aa08908_e2089582","updated":"2016-06-29 15:15:23.000000000","message":"Done","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"}],"glance/db/simple/api.py":[{"author":{"_account_id":16683,"name":"Alexey Galkin","email":"agalkin@mirantis.com","username":"agalkin"},"change_message_id":"07b29ddf66dd8a44eba7ca3bb67bd7263eaf2395","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                 \u0027deleted\u0027: False}"},{"line_number":210,"context_line":"         image[\u0027properties\u0027].append(prop)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    #image[\u0027properties\u0027].extend(properties)"},{"line_number":213,"context_line":"    image.update(values)"},{"line_number":214,"context_line":"    return image"},{"line_number":215,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"1a122d0e_f2d9f384","line":212,"updated":"2016-04-22 12:48:02.000000000","message":"it is really necessary here?","commit_id":"1bab20d8ba11d38a2db939447c6e4dcdd3805795"},{"author":{"_account_id":17043,"name":"Timothy Symanczyk","email":"tim@symanczyk.com","username":"timothy_symanczyk"},"change_message_id":"37417d922137080895f73319aa52d514f2a02d98","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    for prop in org_prop:"},{"line_number":198,"context_line":"        key \u003d prop[\u0027name\u0027]"},{"line_number":199,"context_line":"        if key in upd_prop and (prop.get(\u0027value\u0027) !\u003d upd_prop.get(key, None)"},{"line_number":200,"context_line":"                                or prop.get(\u0027value\u0027)):"},{"line_number":201,"context_line":"            updated[key] \u003d upd_prop.get(key)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    for prop in org_prop:"}],"source_content_type":"text/x-python","patch_set":25,"id":"dab17558_b392e49d","line":200,"updated":"2016-05-12 17:10:40.000000000","message":"is this \u0027or\u0027 correct? the like function in sqlalchemy/api.py checks for .deleted here. wondering if this isn\u0027t an opposite check to that?","commit_id":"a9d5e8cb0db683156bdd2271baaafb721186b2f0"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"8c6b472e30cf913f5d1f895e8712e873460dbaea","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    for prop in org_prop:"},{"line_number":198,"context_line":"        key \u003d prop[\u0027name\u0027]"},{"line_number":199,"context_line":"        if key in upd_prop and (prop.get(\u0027value\u0027) !\u003d upd_prop.get(key, None)"},{"line_number":200,"context_line":"                                or prop.get(\u0027value\u0027)):"},{"line_number":201,"context_line":"            updated[key] \u003d upd_prop.get(key)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    for prop in org_prop:"}],"source_content_type":"text/x-python","patch_set":25,"id":"bab6814e_b08d347e","line":200,"in_reply_to":"dab17558_b392e49d","updated":"2016-05-26 12:52:11.000000000","message":"Thanks for the comment! It is really a bug. Done","commit_id":"a9d5e8cb0db683156bdd2271baaafb721186b2f0"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"f724b0aedf7acdfd45d571c672a869d66c0254ce","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                                or prop.get(\u0027value\u0027)):"},{"line_number":201,"context_line":"            updated[key] \u003d upd_prop.get(key)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    for prop in org_prop:"},{"line_number":204,"context_line":"        key \u003d prop[\u0027name\u0027]"},{"line_number":205,"context_line":"        if key not in upd_prop:"},{"line_number":206,"context_line":"            removed[key] \u003d prop[\u0027value\u0027]"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    for key in upd_prop.keys():"},{"line_number":209,"context_line":"        if key not in [prop[\u0027name\u0027] for prop in org_prop]:"}],"source_content_type":"text/x-python","patch_set":25,"id":"dab17558_927cdab6","line":206,"range":{"start_line":203,"start_character":4,"end_line":206,"end_character":40},"updated":"2016-05-13 09:41:28.000000000","message":"IMO you can get rid of this for loop by adding #205 if condition before #199 like\n\nif key not in upd_prop:\n    removed[key] \u003d prop[\u0027value\u0027]\n    continue","commit_id":"a9d5e8cb0db683156bdd2271baaafb721186b2f0"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"8c6b472e30cf913f5d1f895e8712e873460dbaea","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                                or prop.get(\u0027value\u0027)):"},{"line_number":201,"context_line":"            updated[key] \u003d upd_prop.get(key)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    for prop in org_prop:"},{"line_number":204,"context_line":"        key \u003d prop[\u0027name\u0027]"},{"line_number":205,"context_line":"        if key not in upd_prop:"},{"line_number":206,"context_line":"            removed[key] \u003d prop[\u0027value\u0027]"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    for key in upd_prop.keys():"},{"line_number":209,"context_line":"        if key not in [prop[\u0027name\u0027] for prop in org_prop]:"}],"source_content_type":"text/x-python","patch_set":25,"id":"bab6814e_906630b9","line":206,"range":{"start_line":203,"start_character":4,"end_line":206,"end_character":40},"in_reply_to":"dab17558_927cdab6","updated":"2016-05-26 12:52:11.000000000","message":"Thanks for the comment! It really will be better","commit_id":"a9d5e8cb0db683156bdd2271baaafb721186b2f0"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"c0df3159d9b8031d439c0d0b6f1afe31260a9358","unresolved":false,"context_lines":[{"line_number":215,"context_line":""},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"def _validate_properties(org_props, upd_props):"},{"line_number":218,"context_line":"    \"\"\"Validation properties and convert properties to a common format\"\"\""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    valid_keys \u003d set([\u0027added\u0027, \u0027removed\u0027, \u0027updated\u0027])"},{"line_number":221,"context_line":"    key_prop \u003d set(upd_props.keys())"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_2ccbb654","line":218,"updated":"2016-06-17 19:13:31.000000000","message":"Validate properties","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"64e5808aa6706346740905b79fd6e739825049b6","unresolved":false,"context_lines":[{"line_number":215,"context_line":""},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"def _validate_properties(org_props, upd_props):"},{"line_number":218,"context_line":"    \"\"\"Validation properties and convert properties to a common format\"\"\""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    valid_keys \u003d set([\u0027added\u0027, \u0027removed\u0027, \u0027updated\u0027])"},{"line_number":221,"context_line":"    key_prop \u003d set(upd_props.keys())"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_735ecf13","line":218,"in_reply_to":"7aa08908_2ccbb654","updated":"2016-06-29 15:15:23.000000000","message":"Done","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"}],"glance/db/sqlalchemy/api.py":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"f724b0aedf7acdfd45d571c672a869d66c0254ce","unresolved":false,"context_lines":[{"line_number":969,"context_line":"            updated[key] \u003d upd_prop.get(key)"},{"line_number":970,"context_line":""},{"line_number":971,"context_line":"    for key in org_prop.keys():"},{"line_number":972,"context_line":"        if key not in upd_prop:"},{"line_number":973,"context_line":"            removed[key] \u003d org_prop[key].value"},{"line_number":974,"context_line":""},{"line_number":975,"context_line":"    for key in upd_prop.keys():"},{"line_number":976,"context_line":"        if key not in org_prop.keys():"}],"source_content_type":"text/x-python","patch_set":25,"id":"dab17558_dd2e7341","line":973,"range":{"start_line":972,"start_character":8,"end_line":973,"end_character":46},"updated":"2016-05-13 09:41:28.000000000","message":"ditto, can add this if condition before line #967","commit_id":"a9d5e8cb0db683156bdd2271baaafb721186b2f0"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"8c6b472e30cf913f5d1f895e8712e873460dbaea","unresolved":false,"context_lines":[{"line_number":969,"context_line":"            updated[key] \u003d upd_prop.get(key)"},{"line_number":970,"context_line":""},{"line_number":971,"context_line":"    for key in org_prop.keys():"},{"line_number":972,"context_line":"        if key not in upd_prop:"},{"line_number":973,"context_line":"            removed[key] \u003d org_prop[key].value"},{"line_number":974,"context_line":""},{"line_number":975,"context_line":"    for key in upd_prop.keys():"},{"line_number":976,"context_line":"        if key not in org_prop.keys():"}],"source_content_type":"text/x-python","patch_set":25,"id":"bab6814e_45d9acf2","line":973,"range":{"start_line":972,"start_character":8,"end_line":973,"end_character":46},"in_reply_to":"dab17558_dd2e7341","updated":"2016-05-26 12:52:11.000000000","message":"Done","commit_id":"a9d5e8cb0db683156bdd2271baaafb721186b2f0"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"c0df3159d9b8031d439c0d0b6f1afe31260a9358","unresolved":false,"context_lines":[{"line_number":956,"context_line":"                              delete_time\u003ddelete_time, session\u003dsession)"},{"line_number":957,"context_line":""},{"line_number":958,"context_line":""},{"line_number":959,"context_line":"def _extra_prop_differ(org_prop, upd_prop):"},{"line_number":960,"context_line":"    \"\"\"Convert properties to a common format\"\"\""},{"line_number":961,"context_line":""},{"line_number":962,"context_line":"    updated \u003d {}"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_6cc5be5a","line":959,"updated":"2016-06-17 19:13:31.000000000","message":"Seems like you have the same code here https://review.openstack.org/#/c/272118/29/glance/distinction.py@109\n\nReason?","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"64e5808aa6706346740905b79fd6e739825049b6","unresolved":false,"context_lines":[{"line_number":956,"context_line":"                              delete_time\u003ddelete_time, session\u003dsession)"},{"line_number":957,"context_line":""},{"line_number":958,"context_line":""},{"line_number":959,"context_line":"def _extra_prop_differ(org_prop, upd_prop):"},{"line_number":960,"context_line":"    \"\"\"Convert properties to a common format\"\"\""},{"line_number":961,"context_line":""},{"line_number":962,"context_line":"    updated \u003d {}"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_1c02cf3e","line":959,"in_reply_to":"7aa08908_6cc5be5a","updated":"2016-06-29 15:15:23.000000000","message":"Done","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"c0df3159d9b8031d439c0d0b6f1afe31260a9358","unresolved":false,"context_lines":[{"line_number":1016,"context_line":"    :param session: A SQLAlchemy session to use (if present)"},{"line_number":1017,"context_line":"    \"\"\""},{"line_number":1018,"context_line":"    orig_properties \u003d {}"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"    for prop_ref in image_ref.properties:"},{"line_number":1021,"context_line":"        orig_properties[prop_ref.name] \u003d prop_ref"},{"line_number":1022,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_026b211f","line":1019,"updated":"2016-06-17 19:13:31.000000000","message":"Unnecessary line","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"64e5808aa6706346740905b79fd6e739825049b6","unresolved":false,"context_lines":[{"line_number":1016,"context_line":"    :param session: A SQLAlchemy session to use (if present)"},{"line_number":1017,"context_line":"    \"\"\""},{"line_number":1018,"context_line":"    orig_properties \u003d {}"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"    for prop_ref in image_ref.properties:"},{"line_number":1021,"context_line":"        orig_properties[prop_ref.name] \u003d prop_ref"},{"line_number":1022,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_a4aa7a17","line":1019,"in_reply_to":"7aa08908_026b211f","updated":"2016-06-29 15:15:23.000000000","message":"Done","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"c0df3159d9b8031d439c0d0b6f1afe31260a9358","unresolved":false,"context_lines":[{"line_number":1020,"context_line":"    for prop_ref in image_ref.properties:"},{"line_number":1021,"context_line":"        orig_properties[prop_ref.name] \u003d prop_ref"},{"line_number":1022,"context_line":""},{"line_number":1023,"context_line":"    properties \u003d _validate_properties(orig_properties, properties)"},{"line_number":1024,"context_line":""},{"line_number":1025,"context_line":"    for key, value in six.iteritems(properties.get(\u0027added\u0027, {})):"},{"line_number":1026,"context_line":"        prop_values \u003d {\u0027image_id\u0027: image_ref.id,"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_5d9cee69","line":1023,"updated":"2016-06-17 19:13:31.000000000","message":"Maybe you just create a wrapper around this function and don\u0027t convert old properties to a common format...\n\nLike\n\nif \"added\" in properties and isinstance(properties[\"added\"], dict):\n    \n    _set_properties_for_image_new(...)\n\nelse:\n\n   _set_properties_for_image_old(...)\n\nIn that case you can skip the validation.","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"}],"glance/distinction.py":[{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"3f8778498c7b4d17216a9b3c371d632e7f008f3f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        self.modified_properties \u003d {}"},{"line_number":26,"context_line":"        super(ImageProxy, self).__init__(image)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __setattr__(self, key, value):"},{"line_number":29,"context_line":"        super(domain_proxy.Image, self).__setattr__(key, value)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"7aa08908_fa408b09","line":28,"updated":"2016-06-10 14:56:29.000000000","message":"So, could you please clarify why do we need this?","commit_id":"ad991358f844a44fa9a5339a6e2966f97f3ac4ab"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"3f8778498c7b4d17216a9b3c371d632e7f008f3f","unresolved":false,"context_lines":[{"line_number":32,"context_line":"class ImageRepoProxy(domain_proxy.Repo):"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self, image_repo, context):"},{"line_number":35,"context_line":"        self._original_image \u003d {}"},{"line_number":36,"context_line":"        proxy_kwargs \u003d {\u0027context\u0027: context}"},{"line_number":37,"context_line":"        super(ImageRepoProxy, self).__init__(image_repo,"},{"line_number":38,"context_line":"                                             item_proxy_class\u003dImageProxy,"}],"source_content_type":"text/x-python","patch_set":28,"id":"7aa08908_dd3dc9de","line":35,"updated":"2016-06-10 14:56:29.000000000","message":"if original_image belongs to repo then we can do two subsequent image updates. Example:\nimage_repo.add(image1)\nimage_repo.add(image2)\nimage_repo.save(image1) would produce incorrect update.\nI understand that we don\u0027t have it now but it is potential bug if glance will have some new features.","commit_id":"ad991358f844a44fa9a5339a6e2966f97f3ac4ab"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"3f8778498c7b4d17216a9b3c371d632e7f008f3f","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def add(self, image):"},{"line_number":47,"context_line":"        updated_image \u003d self._convert_to_dict(image)"},{"line_number":48,"context_line":"        image.modified_properties \u003d self._dict_differ(self._original_image,"},{"line_number":49,"context_line":"                                                      updated_image)"},{"line_number":50,"context_line":"        image.modified_properties.pop(\u0027tags\u0027)"},{"line_number":51,"context_line":"        self._original_image \u003d updated_image"}],"source_content_type":"text/x-python","patch_set":28,"id":"7aa08908_1ae2b701","line":48,"updated":"2016-06-10 14:56:29.000000000","message":"modified_properties must be empty for new images AFAIU.\nCould you please clarify what does these modified_propertis mean here?","commit_id":"ad991358f844a44fa9a5339a6e2966f97f3ac4ab"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"c0df3159d9b8031d439c0d0b6f1afe31260a9358","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        updated_image \u003d self._convert_to_dict(image)"},{"line_number":52,"context_line":"        diff \u003d self._dict_differ(image._original_image, updated_image)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        image.modified_properties \u003d self._format_dict_to_db(diff)"},{"line_number":55,"context_line":"        image._original_image \u003d updated_image"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        return self.base.save(image)"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_e27ed519","line":54,"range":{"start_line":54,"start_character":14,"end_line":54,"end_character":15},"updated":"2016-06-17 19:13:31.000000000","message":"it\u0027s better to call it _modified_properties","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"64e5808aa6706346740905b79fd6e739825049b6","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        updated_image \u003d self._convert_to_dict(image)"},{"line_number":52,"context_line":"        diff \u003d self._dict_differ(image._original_image, updated_image)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        image.modified_properties \u003d self._format_dict_to_db(diff)"},{"line_number":55,"context_line":"        image._original_image \u003d updated_image"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        return self.base.save(image)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_739b6f73","line":54,"range":{"start_line":54,"start_character":14,"end_line":54,"end_character":15},"in_reply_to":"7aa08908_e27ed519","updated":"2016-06-29 15:15:23.000000000","message":"Done","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"c0df3159d9b8031d439c0d0b6f1afe31260a9358","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        values \u003d {}"},{"line_number":80,"context_line":"        for key in updated_image.keys():"},{"line_number":81,"context_line":"            upd_value \u003d updated_image.get(key, None)"},{"line_number":82,"context_line":"            org_value \u003d original_image.get(key, None)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"            if key \u003d\u003d \u0027properties\u0027:"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_4cf6025e","line":81,"updated":"2016-06-17 19:13:31.000000000","message":"None is not necessary","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"64e5808aa6706346740905b79fd6e739825049b6","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        values \u003d {}"},{"line_number":80,"context_line":"        for key in updated_image.keys():"},{"line_number":81,"context_line":"            upd_value \u003d updated_image.get(key, None)"},{"line_number":82,"context_line":"            org_value \u003d original_image.get(key, None)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"            if key \u003d\u003d \u0027properties\u0027:"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_3df530cb","line":81,"in_reply_to":"7aa08908_4cf6025e","updated":"2016-06-29 15:15:23.000000000","message":"Done","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"c0df3159d9b8031d439c0d0b6f1afe31260a9358","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            if key \u003d\u003d \u0027locations\u0027 and CONF.show_multiple_locations:"},{"line_number":90,"context_line":"                values[key] \u003d upd_value"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"            if org_value !\u003d upd_value:"},{"line_number":93,"context_line":"                values[key] \u003d upd_value"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        return values"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_6755d71c","line":92,"updated":"2016-06-17 19:13:31.000000000","message":"\u003e\u003e\u003e image \u003d {\u0027locations\u0027: []}\n\n\u003e\u003e\u003e org_value \u003d image[\u0027locations\u0027]\n\n\u003e\u003e\u003e image[\u0027locations\u0027].append(\u0027/etc/fstab\u0027)\n\n\u003e\u003e\u003e image\n\n{\u0027locations\u0027: [\u0027/etc/fstab\u0027]}\n\n\u003e\u003e\u003e upd_value \u003d image[\u0027locations\u0027]\n\n\u003e\u003e\u003e org_value !\u003d upd_value\n\nFalse\n\nLooks like we may never come here if we update locations.","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"64e5808aa6706346740905b79fd6e739825049b6","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            if key \u003d\u003d \u0027locations\u0027 and CONF.show_multiple_locations:"},{"line_number":90,"context_line":"                values[key] \u003d upd_value"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"            if org_value !\u003d upd_value:"},{"line_number":93,"context_line":"                values[key] \u003d upd_value"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        return values"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_abe5e509","line":92,"in_reply_to":"7aa08908_6755d71c","updated":"2016-06-29 15:15:23.000000000","message":"In your case \"org_value \u003d image[\u0027locations\u0027]\" it is done copying the link, for that reason \"org_value !\u003d upd_value \u003d\u003d\u003e False\"\n\nIn this method, parameters \"org_value\" and \"upd_value\" are independent from each other, so the code is working correctly","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"c0df3159d9b8031d439c0d0b6f1afe31260a9358","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        if locations is not None:"},{"line_number":100,"context_line":"            values[\u0027locations\u0027] \u003d self._encrypt_locations(locations)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        is_public \u003d values.pop(\u0027is_public\u0027, None)"},{"line_number":103,"context_line":"        if is_public is not None:"},{"line_number":104,"context_line":"            values[\u0027is_public\u0027] \u003d (is_public \u003d\u003d \u0027public\u0027)"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_e99b6015","line":102,"updated":"2016-06-17 19:13:31.000000000","message":"Image doesn\u0027t contain \u0027is_public\u0027, it\u0027s called \u0027visibility\u0027 https://github.com/openstack/glance/blob/master/glance/domain/__init__.py#L119","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"64e5808aa6706346740905b79fd6e739825049b6","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        if locations is not None:"},{"line_number":100,"context_line":"            values[\u0027locations\u0027] \u003d self._encrypt_locations(locations)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        is_public \u003d values.pop(\u0027is_public\u0027, None)"},{"line_number":103,"context_line":"        if is_public is not None:"},{"line_number":104,"context_line":"            values[\u0027is_public\u0027] \u003d (is_public \u003d\u003d \u0027public\u0027)"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_38c6de49","line":102,"in_reply_to":"7aa08908_e99b6015","updated":"2016-06-29 15:15:23.000000000","message":"Done","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"c0df3159d9b8031d439c0d0b6f1afe31260a9358","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        for key in org_prop:"},{"line_number":117,"context_line":"            if (key in upd_prop) and \\"},{"line_number":118,"context_line":"                    (org_prop.get(key) !\u003d upd_prop.get(key, None)):"},{"line_number":119,"context_line":"                updated[key] \u003d upd_prop.get(key)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"            if key not in upd_prop:"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_894f3c91","line":118,"updated":"2016-06-17 19:13:31.000000000","message":"None is default value in \u0027get\u0027 so you can omit it,","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"64e5808aa6706346740905b79fd6e739825049b6","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        for key in org_prop:"},{"line_number":117,"context_line":"            if (key in upd_prop) and \\"},{"line_number":118,"context_line":"                    (org_prop.get(key) !\u003d upd_prop.get(key, None)):"},{"line_number":119,"context_line":"                updated[key] \u003d upd_prop.get(key)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"            if key not in upd_prop:"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_bd0800db","line":118,"in_reply_to":"7aa08908_894f3c91","updated":"2016-06-29 15:15:23.000000000","message":"Done","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"c0df3159d9b8031d439c0d0b6f1afe31260a9358","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            \u0027container_format\u0027: image.container_format,"},{"line_number":147,"context_line":"            \u0027size\u0027: image.size,"},{"line_number":148,"context_line":"            \u0027virtual_size\u0027: image.virtual_size,"},{"line_number":149,"context_line":"            \u0027is_public\u0027: image.visibility,"},{"line_number":150,"context_line":"            \u0027properties\u0027: dict(image.extra_properties),"},{"line_number":151,"context_line":"            \u0027tags\u0027: set(image.tags)"},{"line_number":152,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_474ffb33","line":149,"updated":"2016-06-17 19:13:31.000000000","message":"what\u0027s the reason to rename it to \u0027is_public\u0027? It\u0027s still a string after all, not a boolean value.","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"64e5808aa6706346740905b79fd6e739825049b6","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            \u0027container_format\u0027: image.container_format,"},{"line_number":147,"context_line":"            \u0027size\u0027: image.size,"},{"line_number":148,"context_line":"            \u0027virtual_size\u0027: image.virtual_size,"},{"line_number":149,"context_line":"            \u0027is_public\u0027: image.visibility,"},{"line_number":150,"context_line":"            \u0027properties\u0027: dict(image.extra_properties),"},{"line_number":151,"context_line":"            \u0027tags\u0027: set(image.tags)"},{"line_number":152,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_9d19c425","line":149,"in_reply_to":"7aa08908_474ffb33","updated":"2016-06-29 15:15:23.000000000","message":"db takes image.visibility as \"is_public\", for example https://github.com/openstack/glance/blob/master/glance/db/__init__.py#L249 that\u0027s why I renamed it)","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"}],"glance/domain/__init__.py":[{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"2dbf90503ab0709850881d375ac26462cb001725","unresolved":false,"context_lines":[{"line_number":277,"context_line":""},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"class ExtraProperties(collections.MutableMapping, dict):"},{"line_number":280,"context_line":"    _modified \u003d False"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def __getitem__(self, key):"},{"line_number":283,"context_line":"        return dict.__getitem__(self, key)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1af94dfe_9eb5e3ef","line":280,"updated":"2016-03-17 08:26:07.000000000","message":"This is not object var instance, it is class var instance. \nSo it will lead to troubles when you have several ExtraProperties.","commit_id":"fd25cf6b31ca54c2353a9244e71e4a5eadf6125f"}],"glance/tests/unit/test_distinction.py":[{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"c0df3159d9b8031d439c0d0b6f1afe31260a9358","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        self.db.image_create(None, self.image)"},{"line_number":115,"context_line":"        self.db.image_tag_set_all(None, uuid, tags)"},{"line_number":116,"context_line":"        return self.image"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def test_add_image(self):"},{"line_number":119,"context_line":"        image \u003d ImageStub(self.image)"},{"line_number":120,"context_line":"        image.image_id \u003d UUID2"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_d853cc14","line":117,"updated":"2016-06-17 19:13:31.000000000","message":"I don\u0027t understand what these tests check... They all just test that data was successfully written in db with your layer, but it\u0027s already verified in other functional and unit tests.\n\nI think you should validate your own layer here, like checking that image.modified_attributes contains only modified attributes, \u0027locations\u0027 work correctly, properties are split in 3 dictionaries: added, updated, removed, and so on!","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"c0df3159d9b8031d439c0d0b6f1afe31260a9358","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                         upd_image.extra_properties)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def test_update_extra_properties(self):"},{"line_number":181,"context_line":"        image_from_bd \u003d self._create_images(uuid\u003dUUID2,"},{"line_number":182,"context_line":"                                            properties\u003d{\u0027king\u0027: \u0027kong\u0027})"},{"line_number":183,"context_line":"        image \u003d ImageStub(image_from_bd)"},{"line_number":184,"context_line":"        self.assertEqual({\u0027king\u0027: \u0027kong\u0027}, image_from_bd[\u0027properties\u0027])"}],"source_content_type":"text/x-python","patch_set":29,"id":"7aa08908_1d55464f","line":181,"updated":"2016-06-17 19:13:31.000000000","message":"image_from_db","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"64e5808aa6706346740905b79fd6e739825049b6","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                         upd_image.extra_properties)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def test_update_extra_properties(self):"},{"line_number":181,"context_line":"        image_from_bd \u003d self._create_images(uuid\u003dUUID2,"},{"line_number":182,"context_line":"                                            properties\u003d{\u0027king\u0027: \u0027kong\u0027})"},{"line_number":183,"context_line":"        image \u003d ImageStub(image_from_bd)"},{"line_number":184,"context_line":"        self.assertEqual({\u0027king\u0027: \u0027kong\u0027}, image_from_bd[\u0027properties\u0027])"}],"source_content_type":"text/x-python","patch_set":29,"id":"3aaa91ec_6b849d0a","line":181,"in_reply_to":"7aa08908_1d55464f","updated":"2016-06-29 15:15:23.000000000","message":"Done","commit_id":"271b186af54027e12ac7fb55806b4367a6d08c6f"}],"glance/tests/unit/v2/test_images_resource.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"741f0b5f3b4f3a856c89aa854649c198880d72ad","unresolved":false,"context_lines":[{"line_number":857,"context_line":"        self.assertEqual(2, len(output2.tags))"},{"line_number":858,"context_line":"        self.assertIn(\u0027king\u0027, output2.tags)"},{"line_number":859,"context_line":"        self.assertIn(\u0027kong\u0027, output2.tags)"},{"line_number":860,"context_line":"        self.assertNotEqual(output1.created_at, output2.updated_at)"},{"line_number":861,"context_line":""},{"line_number":862,"context_line":"    def test_update_replace_property(self):"},{"line_number":863,"context_line":"        request \u003d unit_test_utils.get_fake_request()"}],"source_content_type":"text/x-python","patch_set":28,"id":"7aa08908_e7728e10","line":860,"range":{"start_line":860,"start_character":34,"end_line":860,"end_character":35},"updated":"2016-06-11 17:14:34.000000000","message":"Why use created_at from output1 here instead of output2?  (I\u0027m not saying change it, I\u0027m just trying to understand what you\u0027re looking for.)","commit_id":"ad991358f844a44fa9a5339a6e2966f97f3ac4ab"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"a663ef080ca44aef4a3d8ca3936eb9a0aadef105","unresolved":false,"context_lines":[{"line_number":857,"context_line":"        self.assertEqual(2, len(output2.tags))"},{"line_number":858,"context_line":"        self.assertIn(\u0027king\u0027, output2.tags)"},{"line_number":859,"context_line":"        self.assertIn(\u0027kong\u0027, output2.tags)"},{"line_number":860,"context_line":"        self.assertNotEqual(output1.created_at, output2.updated_at)"},{"line_number":861,"context_line":""},{"line_number":862,"context_line":"    def test_update_replace_property(self):"},{"line_number":863,"context_line":"        request \u003d unit_test_utils.get_fake_request()"}],"source_content_type":"text/x-python","patch_set":28,"id":"7aa08908_93693efb","line":860,"range":{"start_line":860,"start_character":34,"end_line":860,"end_character":35},"in_reply_to":"7aa08908_e7728e10","updated":"2016-06-17 11:49:37.000000000","message":"oh, it\u0027s a typo) although there is no difference, because it is one and the same image","commit_id":"ad991358f844a44fa9a5339a6e2966f97f3ac4ab"}],"glance/transaction.py":[{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"2b7f2bea253d002de78bc7f32c47f28a97402cd5","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            modified_props[\u0027is_public\u0027] \u003d \\"},{"line_number":75,"context_line":"                modified_props.pop(\u0027visibility\u0027) \u003d\u003d \u0027public\u0027"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        if modified_props.get(\u0027image_id\u0027):"},{"line_number":78,"context_line":"            modified_props[\u0027id\u0027] \u003d modified_props.pop(\u0027image_id\u0027)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        if image.extra_properties:"}],"source_content_type":"text/x-python","patch_set":10,"id":"9aed3d3a_7b04a47d","line":77,"updated":"2016-02-26 14:20:55.000000000","message":"Not necessary - we can\u0027t change image_id in v2. So it\u0027ll never be rewritten.","commit_id":"7f3d4748961ae78d751e1f0e8a9f3e5926980ef5"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"28df0e22d70da46fc4287c0e6c6cdd250e6823c3","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def save(self, image, from_state\u003dNone):"},{"line_number":84,"context_line":"        modified_props \u003d image.get_modified_props().copy()"},{"line_number":85,"context_line":"        modified_props[\u0027status\u0027] \u003d image.status"},{"line_number":86,"context_line":"        modified_props[\u0027locations\u0027] \u003d image.locations"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        if modified_props.get(\u0027visibility\u0027):"},{"line_number":89,"context_line":"            modified_props[\u0027is_public\u0027] \u003d \\"}],"source_content_type":"text/x-python","patch_set":14,"id":"3afc51ec_3852fddd","line":86,"updated":"2016-03-14 15:34:09.000000000","message":"you update locations every time. Can we update them in db only if they\u0027re modified?","commit_id":"716c08d22d9eccf8df6f5d8e7c4c1e1aa9709f36"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"28df0e22d70da46fc4287c0e6c6cdd250e6823c3","unresolved":false,"context_lines":[{"line_number":119,"context_line":"class TransactionImageTagsProxy(object):"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def __init__(self, image):"},{"line_number":122,"context_line":"        orig_set \u003d image.image.tags"},{"line_number":123,"context_line":"        if orig_set is None:"},{"line_number":124,"context_line":"            orig_set \u003d set([])"},{"line_number":125,"context_line":"        self.tags \u003d orig_set"}],"source_content_type":"text/x-python","patch_set":14,"id":"3afc51ec_520d273d","line":122,"updated":"2016-03-14 15:34:09.000000000","message":"Seems like we can write just \u0027image.tags\u0027 and it will proxy us to initial object.","commit_id":"716c08d22d9eccf8df6f5d8e7c4c1e1aa9709f36"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"2dbf90503ab0709850881d375ac26462cb001725","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class ImageProxy(domain_proxy.Image):"},{"line_number":37,"context_line":"    _modified_properties \u003d {}"},{"line_number":38,"context_line":"    _modified_tags \u003d False"},{"line_number":39,"context_line":"    _modified_status \u003d False"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1af94dfe_7e71f7df","line":37,"updated":"2016-03-17 08:26:07.000000000","message":"Same: it doesn\u0027t belong to proxy instance.","commit_id":"fd25cf6b31ca54c2353a9244e71e4a5eadf6125f"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"39be6ae6b078179c1017b857085b4cecb6b320b4","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class ImageProxy(domain_proxy.Image):"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    modified_properties \u003d {}"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self, image, context):"},{"line_number":27,"context_line":"        super(ImageProxy, self).__init__(image)"}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_c5fc0c41","line":24,"updated":"2016-05-06 08:26:59.000000000","message":"this needs to be instance of object not class","commit_id":"5551f4767c0ce2efdfece89c00cc2a48ea04a19a"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"39be6ae6b078179c1017b857085b4cecb6b320b4","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    modified_properties \u003d {}"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self, image, context):"},{"line_number":27,"context_line":"        super(ImageProxy, self).__init__(image)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __setattr__(self, key, value):"},{"line_number":30,"context_line":"        super(domain_proxy.Image, self).__setattr__(key, value)"}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_059574e3","line":27,"updated":"2016-05-06 08:26:59.000000000","message":"Once you have proxy you need image factory","commit_id":"5551f4767c0ce2efdfece89c00cc2a48ea04a19a"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"39be6ae6b078179c1017b857085b4cecb6b320b4","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class ImageRepoProxy(domain_proxy.Repo):"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    _original_image \u003d {}"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __init__(self, image_repo, context):"},{"line_number":38,"context_line":"        proxy_kwargs \u003d {\u0027context\u0027: context}"}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_22e22e04","line":35,"updated":"2016-05-06 08:26:59.000000000","message":"Looks like _original_image should not be an instance of Repo but need to be instance of ImageProxy","commit_id":"5551f4767c0ce2efdfece89c00cc2a48ea04a19a"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"f724b0aedf7acdfd45d571c672a869d66c0254ce","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                updated[key] \u003d upd_prop.get(key)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        for key in org_prop:"},{"line_number":121,"context_line":"            if key not in upd_prop:"},{"line_number":122,"context_line":"                removed[key] \u003d org_prop[key]"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        for key in upd_prop:"},{"line_number":125,"context_line":"            if key not in org_prop:"}],"source_content_type":"text/x-python","patch_set":25,"id":"dab17558_7ddb07ee","line":122,"range":{"start_line":121,"start_character":12,"end_line":122,"end_character":44},"updated":"2016-05-13 09:41:28.000000000","message":"ditto, can add this if condition before line #967","commit_id":"a9d5e8cb0db683156bdd2271baaafb721186b2f0"},{"author":{"_account_id":16658,"name":"Darja Shakhray","email":"damalyavkina@gmail.com","username":"dshakhray"},"change_message_id":"8c6b472e30cf913f5d1f895e8712e873460dbaea","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                updated[key] \u003d upd_prop.get(key)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        for key in org_prop:"},{"line_number":121,"context_line":"            if key not in upd_prop:"},{"line_number":122,"context_line":"                removed[key] \u003d org_prop[key]"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        for key in upd_prop:"},{"line_number":125,"context_line":"            if key not in org_prop:"}],"source_content_type":"text/x-python","patch_set":25,"id":"bab6814e_45008c34","line":122,"range":{"start_line":121,"start_character":12,"end_line":122,"end_character":44},"in_reply_to":"dab17558_7ddb07ee","updated":"2016-05-26 12:52:11.000000000","message":"Done","commit_id":"a9d5e8cb0db683156bdd2271baaafb721186b2f0"}]}
