)]}'
{"zuul/model.py":[{"author":{"_account_id":27952,"name":"Felix Edel","email":"felix.edel@bmw.de","username":"felix.schmidt"},"change_message_id":"f09139659566afedec861a6c1b93b59b02b920fb","unresolved":true,"context_lines":[{"line_number":1729,"context_line":"        # in the context of a project-pipeline.  They can not affect"},{"line_number":1730,"context_line":"        # the execution of the job, but only whether the job is run"},{"line_number":1731,"context_line":"        # and how it is reported."},{"line_number":1732,"context_line":"        self.context_attributes \u003d dict("},{"line_number":1733,"context_line":"            voting\u003dTrue,"},{"line_number":1734,"context_line":"            hold_following_changes\u003dFalse,"},{"line_number":1735,"context_line":"            failure_message\u003dNone,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba367f73_4015f25b","line":1732,"updated":"2021-10-18 05:48:33.000000000","message":"Should we move the context_attributes, execution_attributes and other_attributes to the AbstractJob as well?","commit_id":"be845e16f5e7066231e79860e442100f9eab988e"},{"author":{"_account_id":27582,"name":"Simon Westphahl","email":"simon.westphahl@bmw.de","username":"simon.westphahl"},"change_message_id":"56fbbd9bb226b70691a8cd61c40619acaab3e473","unresolved":true,"context_lines":[{"line_number":1729,"context_line":"        # in the context of a project-pipeline.  They can not affect"},{"line_number":1730,"context_line":"        # the execution of the job, but only whether the job is run"},{"line_number":1731,"context_line":"        # and how it is reported."},{"line_number":1732,"context_line":"        self.context_attributes \u003d dict("},{"line_number":1733,"context_line":"            voting\u003dTrue,"},{"line_number":1734,"context_line":"            hold_following_changes\u003dFalse,"},{"line_number":1735,"context_line":"            failure_message\u003dNone,"}],"source_content_type":"text/x-python","patch_set":3,"id":"342b07f2_932a0e80","line":1732,"in_reply_to":"ba367f73_4015f25b","updated":"2021-10-18 10:44:59.000000000","message":"the AbstractJob is again removed in 814281","commit_id":"be845e16f5e7066231e79860e442100f9eab988e"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"2c18925b20d5177e9f5044a0a0a1d44aeed5012d","unresolved":false,"context_lines":[{"line_number":1624,"context_line":"        Combines the data that has been returned by parent jobs with the"},{"line_number":1625,"context_line":"        job variables where job variables have priority over parent data."},{"line_number":1626,"context_line":"        \"\"\""},{"line_number":1627,"context_line":"        return Job._deepUpdate(self.parent_data or {}, self.variables)"},{"line_number":1628,"context_line":""},{"line_number":1629,"context_line":"    def getAffectedProjects(self, tenant):"},{"line_number":1630,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"07641a22_afd43029","line":1627,"updated":"2021-10-28 16:47:25.000000000","message":"Actually that\u0027s just a static method that returns a dictionary.\n\nProbably this should be a util method or something, but I think this one may be tailored to the circumstances of a job, so we\u0027d have to check that.","commit_id":"2d92f72eab07007e9801b515d09a6caf6fc68b83"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"d5c2482d3dbab59c9defa76022d0ebfc369eac39","unresolved":true,"context_lines":[{"line_number":1624,"context_line":"        Combines the data that has been returned by parent jobs with the"},{"line_number":1625,"context_line":"        job variables where job variables have priority over parent data."},{"line_number":1626,"context_line":"        \"\"\""},{"line_number":1627,"context_line":"        return Job._deepUpdate(self.parent_data or {}, self.variables)"},{"line_number":1628,"context_line":""},{"line_number":1629,"context_line":"    def getAffectedProjects(self, tenant):"},{"line_number":1630,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"97ab9d00_64146a34","line":1627,"updated":"2021-10-28 16:41:03.000000000","message":"Should this return a FrozenJob? It seems weird that a FrozenJob can return an unfrozen job. Like some sort of violation of the frozen property.","commit_id":"2d92f72eab07007e9801b515d09a6caf6fc68b83"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"7429b8543f61094151808dbbc3363901ea650e31","unresolved":false,"context_lines":[{"line_number":1624,"context_line":"        Combines the data that has been returned by parent jobs with the"},{"line_number":1625,"context_line":"        job variables where job variables have priority over parent data."},{"line_number":1626,"context_line":"        \"\"\""},{"line_number":1627,"context_line":"        return Job._deepUpdate(self.parent_data or {}, self.variables)"},{"line_number":1628,"context_line":""},{"line_number":1629,"context_line":"    def getAffectedProjects(self, tenant):"},{"line_number":1630,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"562eb9f8_27f0263a","line":1627,"in_reply_to":"07641a22_afd43029","updated":"2021-10-28 16:52:42.000000000","message":"Ah yup it does. The diff context didn\u0027t show the method and I should\u0027ve gone looking for it. I took the implied return type to be the class as it is a class method.","commit_id":"2d92f72eab07007e9801b515d09a6caf6fc68b83"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"2c18925b20d5177e9f5044a0a0a1d44aeed5012d","unresolved":false,"context_lines":[{"line_number":1661,"context_line":"        # in the job graph will take precedence."},{"line_number":1662,"context_line":"        other_vars \u003d other_build.result_data"},{"line_number":1663,"context_line":"        v \u003d self.parent_data or {}"},{"line_number":1664,"context_line":"        v \u003d Job._deepUpdate(v, other_vars)"},{"line_number":1665,"context_line":"        # To avoid running afoul of checks that jobs don\u0027t set zuul"},{"line_number":1666,"context_line":"        # variables, remove them from parent data here."},{"line_number":1667,"context_line":"        v.pop(\u0027zuul\u0027, None)"}],"source_content_type":"text/x-python","patch_set":11,"id":"54b9246b_f2784f6f","line":1664,"updated":"2021-10-28 16:47:25.000000000","message":"Ditto, this is just a dict.","commit_id":"2d92f72eab07007e9801b515d09a6caf6fc68b83"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"d5c2482d3dbab59c9defa76022d0ebfc369eac39","unresolved":true,"context_lines":[{"line_number":1661,"context_line":"        # in the job graph will take precedence."},{"line_number":1662,"context_line":"        other_vars \u003d other_build.result_data"},{"line_number":1663,"context_line":"        v \u003d self.parent_data or {}"},{"line_number":1664,"context_line":"        v \u003d Job._deepUpdate(v, other_vars)"},{"line_number":1665,"context_line":"        # To avoid running afoul of checks that jobs don\u0027t set zuul"},{"line_number":1666,"context_line":"        # variables, remove them from parent data here."},{"line_number":1667,"context_line":"        v.pop(\u0027zuul\u0027, None)"}],"source_content_type":"text/x-python","patch_set":11,"id":"12c544f8_415b2cd9","line":1664,"updated":"2021-10-28 16:41:03.000000000","message":"See above but should we be operating on a FrozenJob here?","commit_id":"2d92f72eab07007e9801b515d09a6caf6fc68b83"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"d5c2482d3dbab59c9defa76022d0ebfc369eac39","unresolved":true,"context_lines":[{"line_number":1668,"context_line":"        # For safety, also drop nodepool and unsafe_vars"},{"line_number":1669,"context_line":"        v.pop(\u0027nodepool\u0027, None)"},{"line_number":1670,"context_line":"        v.pop(\u0027unsafe_vars\u0027, None)"},{"line_number":1671,"context_line":"        self.parent_data \u003d v"},{"line_number":1672,"context_line":""},{"line_number":1673,"context_line":"        secret_other_vars \u003d other_build.secret_result_data"},{"line_number":1674,"context_line":"        v \u003d self.secret_parent_data or {}"}],"source_content_type":"text/x-python","patch_set":11,"id":"cf5f7013_38d32616","line":1671,"updated":"2021-10-28 16:41:03.000000000","message":"If we go to serialize this FrozenJob to ZK I think this wants to be a FrozenJob too? (related to comments above).","commit_id":"2d92f72eab07007e9801b515d09a6caf6fc68b83"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"2c18925b20d5177e9f5044a0a0a1d44aeed5012d","unresolved":false,"context_lines":[{"line_number":1723,"context_line":"    empty_nodeset \u003d NodeSet()"},{"line_number":1724,"context_line":""},{"line_number":1725,"context_line":"    def __init__(self, name):"},{"line_number":1726,"context_line":"        ConfigObject.__init__(self)"},{"line_number":1727,"context_line":"        # These attributes may override even the final form of a job"},{"line_number":1728,"context_line":"        # in the context of a project-pipeline.  They can not affect"},{"line_number":1729,"context_line":"        # the execution of the job, but only whether the job is run"}],"source_content_type":"text/x-python","patch_set":11,"id":"fdabba4f_c64dda8a","line":1726,"updated":"2021-10-28 16:47:25.000000000","message":"I think that\u0027s right; this is probably left over from an earlier design.  Given that it\u0027s not wrong, do we want to bother changing it?","commit_id":"2d92f72eab07007e9801b515d09a6caf6fc68b83"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"d5c2482d3dbab59c9defa76022d0ebfc369eac39","unresolved":true,"context_lines":[{"line_number":1723,"context_line":"    empty_nodeset \u003d NodeSet()"},{"line_number":1724,"context_line":""},{"line_number":1725,"context_line":"    def __init__(self, name):"},{"line_number":1726,"context_line":"        ConfigObject.__init__(self)"},{"line_number":1727,"context_line":"        # These attributes may override even the final form of a job"},{"line_number":1728,"context_line":"        # in the context of a project-pipeline.  They can not affect"},{"line_number":1729,"context_line":"        # the execution of the job, but only whether the job is run"}],"source_content_type":"text/x-python","patch_set":11,"id":"c5f6eee8_58d1766f","line":1726,"updated":"2021-10-28 16:41:03.000000000","message":"Wouldn\u0027t a normal super call continue to do the right thing here since AbstractJob has no __init__?","commit_id":"2d92f72eab07007e9801b515d09a6caf6fc68b83"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"d5c2482d3dbab59c9defa76022d0ebfc369eac39","unresolved":true,"context_lines":[{"line_number":1850,"context_line":"        v \u003d self.__dict__.get(name)"},{"line_number":1851,"context_line":"        if v is None:"},{"line_number":1852,"context_line":"            return self.attributes[name]"},{"line_number":1853,"context_line":"        return v"},{"line_number":1854,"context_line":""},{"line_number":1855,"context_line":"    def _get(self, name):"},{"line_number":1856,"context_line":"        return self.__dict__.get(name)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7680f75c_4411237b","line":1853,"updated":"2021-10-28 16:41:03.000000000","message":"It seems a little weird that the Job class would use special attribute access and AbstractJob and FrozenJob do not. I suppose that is because Job has to build out the total set of attributes and doing it this way simplifies things.","commit_id":"2d92f72eab07007e9801b515d09a6caf6fc68b83"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"2c18925b20d5177e9f5044a0a0a1d44aeed5012d","unresolved":false,"context_lines":[{"line_number":1850,"context_line":"        v \u003d self.__dict__.get(name)"},{"line_number":1851,"context_line":"        if v is None:"},{"line_number":1852,"context_line":"            return self.attributes[name]"},{"line_number":1853,"context_line":"        return v"},{"line_number":1854,"context_line":""},{"line_number":1855,"context_line":"    def _get(self, name):"},{"line_number":1856,"context_line":"        return self.__dict__.get(name)"}],"source_content_type":"text/x-python","patch_set":11,"id":"09f07cca_4172e018","line":1853,"updated":"2021-10-28 16:47:25.000000000","message":"Yes, FrozenJob is a much more \"normal\" class since its attributes have fixed values.","commit_id":"2d92f72eab07007e9801b515d09a6caf6fc68b83"}]}
