)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"f73e376e0de5a653e465966db098ff31120546ae","unresolved":false,"context_lines":[{"line_number":19,"context_line":"- a change in an environment mapping a resource to a new/different implementation"},{"line_number":20,"context_line":"- a change in the content of a TemplateResource"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"And can distinguish between schema changes (reqiring replacement) and"},{"line_number":23,"context_line":"incremental changes (that can be updated in place)."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Change-Id: I780074a827e3f51dede47a81f15e29dbe4d08804"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAATn%2F%2BHyU%3D","line":22,"updated":"2013-12-02 11:30:37.000000000","message":"typo s/reqiring/requiring/","commit_id":"424b718a089ac65761049ddbc0764d9cbea2f0cf"},{"author":{"_account_id":4715,"name":"Angus Salkeld","email":"asalkeld@redhat.com","username":"asalkeld"},"change_message_id":"aa0aac2bab5e5985ba55ebde673d0614e3875ef3","unresolved":false,"context_lines":[{"line_number":19,"context_line":"- a change in an environment mapping a resource to a new/different implementation"},{"line_number":20,"context_line":"- a change in the content of a TemplateResource"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"And can distinguish between schema changes (reqiring replacement) and"},{"line_number":23,"context_line":"incremental changes (that can be updated in place)."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Change-Id: I780074a827e3f51dede47a81f15e29dbe4d08804"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAATn%2F%2BEeY%3D","line":22,"in_reply_to":"AAAATn%2F%2BHyU%3D","updated":"2013-12-02 21:13:07.000000000","message":"Done","commit_id":"424b718a089ac65761049ddbc0764d9cbea2f0cf"}],"heat/engine/resource.py":[{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"f73e376e0de5a653e465966db098ff31120546ae","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        return ri.name \u003d\u003d resource_type"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def implementation_signature(self):"},{"line_number":212,"context_line":"        return (self.__class__, \u0027v1.0\u0027)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def identifier(self):"},{"line_number":215,"context_line":"        \u0027\u0027\u0027Return an identifier for this resource.\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BHx0%3D","line":212,"updated":"2013-12-02 11:30:37.000000000","message":"This is kind of confusing, so all non template_resources will have a signature of v1.0, and all template resources will have a signature of a hash related to their implementation?\n\nIs there a reason we can\u0027t just have all resources have a hash signature, where the top level (non template-defined) resources hash the parsed_template or something?","commit_id":"424b718a089ac65761049ddbc0764d9cbea2f0cf"},{"author":{"_account_id":4715,"name":"Angus Salkeld","email":"asalkeld@redhat.com","username":"asalkeld"},"change_message_id":"aa0aac2bab5e5985ba55ebde673d0614e3875ef3","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        return ri.name \u003d\u003d resource_type"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def implementation_signature(self):"},{"line_number":212,"context_line":"        return (self.__class__, \u0027v1.0\u0027)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def identifier(self):"},{"line_number":215,"context_line":"        \u0027\u0027\u0027Return an identifier for this resource.\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BEec%3D","line":212,"in_reply_to":"AAAATn%2F%2BHx0%3D","updated":"2013-12-02 21:13:07.000000000","message":"The equivalent for plugins would  be to hash the python file - I might do that. I agree the hard coded \"v1.0\u0027 is a bit odd.","commit_id":"424b718a089ac65761049ddbc0764d9cbea2f0cf"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"4e64f6b3d0629a2d38885c5dfe4a0e06540c9e59","unresolved":false,"context_lines":[{"line_number":243,"context_line":"                                              self.name)"},{"line_number":244,"context_line":"        return ri.name \u003d\u003d resource_type"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def implementation_signature(self):"},{"line_number":247,"context_line":"        class_buf \u003d \u0027\u0027.join(inspect.getsourcelines(self.__class__)[0])"},{"line_number":248,"context_line":"        class_hash \u003d hashlib.sha1(class_buf)"},{"line_number":249,"context_line":"        return (self.__class__.__name__, class_hash.hexdigest())"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2Fsek%3D","line":246,"updated":"2014-01-03 10:27:51.000000000","message":"A docstring describing the purpose of this would be good.","commit_id":"f033244f7b8c1036712dd3c3a90eefcf33b477de"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"4e64f6b3d0629a2d38885c5dfe4a0e06540c9e59","unresolved":false,"context_lines":[{"line_number":488,"context_line":"        if prev_resource is not None:"},{"line_number":489,"context_line":"            (prev_class, prev_ver) \u003d prev_resource.implementation_signature()"},{"line_number":490,"context_line":"            (cur_class, cur_ver) \u003d self.implementation_signature()"},{"line_number":491,"context_line":"            if prev_class !\u003d cur_class:"},{"line_number":492,"context_line":"                raise UpdateReplace(self.name)"},{"line_number":493,"context_line":"            needs_updating \u003d prev_ver !\u003d cur_ver"},{"line_number":494,"context_line":"        if not needs_updating:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FshM%3D","line":491,"updated":"2014-01-03 10:27:51.000000000","message":"I think maybe we need some variable renaming (and a comment) to make it clearer how this works:\n\n  # Replace the resource if the underlying implementation (class name) has changed\n  # but not if the version of an existing implementation has changed\n  if prev_class_name !\u003d cur_class_name:\n\nOr something similar.","commit_id":"f033244f7b8c1036712dd3c3a90eefcf33b477de"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"4e64f6b3d0629a2d38885c5dfe4a0e06540c9e59","unresolved":false,"context_lines":[{"line_number":490,"context_line":"            (cur_class, cur_ver) \u003d self.implementation_signature()"},{"line_number":491,"context_line":"            if prev_class !\u003d cur_class:"},{"line_number":492,"context_line":"                raise UpdateReplace(self.name)"},{"line_number":493,"context_line":"            needs_updating \u003d prev_ver !\u003d cur_ver"},{"line_number":494,"context_line":"        if not needs_updating:"},{"line_number":495,"context_line":"            needs_updating \u003d before !\u003d after"},{"line_number":496,"context_line":"        if not needs_updating:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2Fsfc%3D","line":493,"updated":"2014-01-03 10:27:51.000000000","message":"I personally would prefer the same \"if prev_ver !\u003d cur_ver\" style used above, although it\u0027s an extra line IMO it\u0027s clearer and reads better, or do away with the needs_updating flag as mentioned below.","commit_id":"f033244f7b8c1036712dd3c3a90eefcf33b477de"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"4e64f6b3d0629a2d38885c5dfe4a0e06540c9e59","unresolved":false,"context_lines":[{"line_number":493,"context_line":"            needs_updating \u003d prev_ver !\u003d cur_ver"},{"line_number":494,"context_line":"        if not needs_updating:"},{"line_number":495,"context_line":"            needs_updating \u003d before !\u003d after"},{"line_number":496,"context_line":"        if not needs_updating:"},{"line_number":497,"context_line":"            return"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"        if (self.action, self.status) in ((self.CREATE, self.IN_PROGRESS),"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2Fsfg%3D","line":496,"updated":"2014-01-03 10:27:51.000000000","message":"I\u0027m not sure the needs_updating flag really makes things clearer.  Would it be better to just do:\n\n  if prev_ver \u003d\u003d cur_ver and before \u003d\u003d after:\n    # Template and resource definition unchanged\n    return","commit_id":"f033244f7b8c1036712dd3c3a90eefcf33b477de"}]}
