)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"1bcfffa9f7344e32eabb0ec384f84060c8c5757a","unresolved":false,"context_lines":[{"line_number":21,"context_line":" - Job D runs successfully"},{"line_number":22,"context_line":" - Job E runs because it has a soft dependency on B, C, and D."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Scenario B (is the implementation fixed by this patch):"},{"line_number":25,"context_line":" - Job A runs successfully and returns zuul.child_jobs \u003d [ Job D, Job E]"},{"line_number":26,"context_line":" - Jobs B and C do not run because of job A (the \"root job\")"},{"line_number":27,"context_line":"   returns zuul.child_jobs not containing them"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7faddb67_9cefc0af","line":24,"updated":"2019-08-22 08:55:24.000000000","message":"nit: it would make sense to describe what\u0027s the wrong current behavior.","commit_id":"4b4786236bcd3e386b41c832e91b5ae438e4dfa8"}],"tests/fixtures/config/data-return/git/common-config/zuul.yaml":[{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"af25ba66d8d3cbcc8570edcf5724033f2463fa63","unresolved":false,"context_lines":[{"line_number":84,"context_line":"      jobs:"},{"line_number":85,"context_line":"        - data-return"},{"line_number":86,"context_line":"        - data-return-relative:"},{"line_number":87,"context_line":"            dependencies:"},{"line_number":88,"context_line":"              - data-return"},{"line_number":89,"context_line":"        - child:"},{"line_number":90,"context_line":"            dependencies:"},{"line_number":91,"context_line":"              - data-return"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"7faddb67_3c0d6c8e","line":88,"range":{"start_line":87,"start_character":0,"end_line":88,"end_character":27},"updated":"2019-08-23 13:41:59.000000000","message":"is this necessary?","commit_id":"4b4786236bcd3e386b41c832e91b5ae438e4dfa8"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"af25ba66d8d3cbcc8570edcf5724033f2463fa63","unresolved":false,"context_lines":[{"line_number":149,"context_line":"              - data-return-cd"},{"line_number":150,"context_line":"        - data-return-d:"},{"line_number":151,"context_line":"            dependencies:"},{"line_number":152,"context_line":"              #- name: data-return-a"},{"line_number":153,"context_line":"              #  soft: true"},{"line_number":154,"context_line":"              - name: data-return-b"},{"line_number":155,"context_line":"                soft: true"},{"line_number":156,"context_line":"              - name: data-return-c"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"7faddb67_1c7f50df","line":153,"range":{"start_line":152,"start_character":0,"end_line":153,"end_character":27},"updated":"2019-08-23 13:41:59.000000000","message":"debug leftover?","commit_id":"4b4786236bcd3e386b41c832e91b5ae438e4dfa8"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"af25ba66d8d3cbcc8570edcf5724033f2463fa63","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                soft: true"},{"line_number":156,"context_line":"              - name: data-return-c"},{"line_number":157,"context_line":"                soft: true"},{"line_number":158,"context_line":"              #- data-return-c"},{"line_number":159,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":1,"id":"7faddb67_bc6ddc2f","line":158,"range":{"start_line":158,"start_character":14,"end_line":158,"end_character":30},"updated":"2019-08-23 13:41:59.000000000","message":"that should be removed probably","commit_id":"4b4786236bcd3e386b41c832e91b5ae438e4dfa8"}],"zuul/model.py":[{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"6b89c3bb77ceffb59c582b69befc9e6634569802","unresolved":false,"context_lines":[{"line_number":1459,"context_line":"        if \u0027zuul\u0027 in v:"},{"line_number":1460,"context_line":"            del v[\u0027zuul\u0027]"},{"line_number":1461,"context_line":"        self.log.debug(\"Update parent data of %s:\\n From: %s\\n   To: %s\","},{"line_number":1462,"context_line":"                       self.name, str(self.parent_data), str(v))"},{"line_number":1463,"context_line":"        self.parent_data \u003d v"},{"line_number":1464,"context_line":"        vx \u003d Job._deepUpdate(self.parent_data, self.variables)"},{"line_number":1465,"context_line":"        self.log.debug(\"Update variables of %s: \\n    %s\\n  + %s\\n \u003d\u003e %s\","}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_9ce02099","line":1462,"updated":"2019-08-22 09:00:33.000000000","message":"I left the debug messages here in case this needs to be debugged again. Not sure if it\u0027s ok to have \"\\n\" here.","commit_id":"4b4786236bcd3e386b41c832e91b5ae438e4dfa8"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"1b54dae3d9c5bead44642c95d95d05fb8fc03793","unresolved":false,"context_lines":[{"line_number":1459,"context_line":"        if \u0027zuul\u0027 in v:"},{"line_number":1460,"context_line":"            del v[\u0027zuul\u0027]"},{"line_number":1461,"context_line":"        self.log.debug(\"Update parent data of %s:\\n From: %s\\n   To: %s\","},{"line_number":1462,"context_line":"                       self.name, str(self.parent_data), str(v))"},{"line_number":1463,"context_line":"        self.parent_data \u003d v"},{"line_number":1464,"context_line":"        vx \u003d Job._deepUpdate(self.parent_data, self.variables)"},{"line_number":1465,"context_line":"        self.log.debug(\"Update variables of %s: \\n    %s\\n  + %s\\n \u003d\u003e %s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_c66562e4","line":1462,"updated":"2019-08-22 09:08:13.000000000","message":"I left the debug messages here in case this needs to be debugged again. Not sure if it\u0027s ok to have \"\\n\" here.","commit_id":"e43e8f41bea21952e09aa2366606011414926f5c"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"af25ba66d8d3cbcc8570edcf5724033f2463fa63","unresolved":false,"context_lines":[{"line_number":1780,"context_line":"                                    (job.name,))"},{"line_number":1781,"context_line":"                self._dependencies[job.name][dependency.name] \u003d \\"},{"line_number":1782,"context_line":"                    dependency.soft"},{"line_number":1783,"context_line":"                self.log.debug(\"Dependency %s -%s-\u003e %s\", job.name,"},{"line_number":1784,"context_line":"                               \"SOFT\" if dependency.soft else \"HARD\","},{"line_number":1785,"context_line":"                               dependency.name)"},{"line_number":1786,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_14538b3b","line":1783,"updated":"2019-08-23 13:41:59.000000000","message":"If we want to log this we should make sure that the event id is attached to the log. Otherwise it\u0027s usefullness will be limited. To do this I would add an optional zuul_event_id member to this class (for reference see Build class) and annotate the logger accordingly.","commit_id":"d54783ce73dc7a4b635cf566c94bf1ad97975166"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"af25ba66d8d3cbcc8570edcf5724033f2463fa63","unresolved":false,"context_lines":[{"line_number":1799,"context_line":"            if part:"},{"line_number":1800,"context_line":"                ret.add(dependent_name)"},{"line_number":1801,"context_line":""},{"line_number":1802,"context_line":"            self.log.debug(\"Direct dependency %s -%s-\u003e %s: %s part (%s soft)\","},{"line_number":1803,"context_line":"                           dependent_name,"},{"line_number":1804,"context_line":"                           (\"SOFT\" if parents[parent_job] else \"HARD\")"},{"line_number":1805,"context_line":"                           if parent_job in parents else \"X\","},{"line_number":1806,"context_line":"                           parent_job,"},{"line_number":1807,"context_line":"                           \"is\" if part else \"is NOT\","},{"line_number":1808,"context_line":"                           \"skip\" if skip_soft else \"include\")"},{"line_number":1809,"context_line":"        return ret"},{"line_number":1810,"context_line":""},{"line_number":1811,"context_line":"    def getDependentJobsRecursively(self, parent_job, skip_soft\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_541ee374","line":1808,"range":{"start_line":1802,"start_character":0,"end_line":1808,"end_character":62},"updated":"2019-08-23 13:41:59.000000000","message":"Regarding this log I\u0027m not sure if we should keep it as getDirectDependentJobs can be called very often and can potentially spam the log too much.","commit_id":"d54783ce73dc7a4b635cf566c94bf1ad97975166"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"af25ba66d8d3cbcc8570edcf5724033f2463fa63","unresolved":false,"context_lines":[{"line_number":1818,"context_line":"            new_dependent_jobs \u003d current_dependent_jobs - all_dependent_jobs"},{"line_number":1819,"context_line":"            jobs_to_iterate |\u003d new_dependent_jobs"},{"line_number":1820,"context_line":"            all_dependent_jobs |\u003d new_dependent_jobs"},{"line_number":1821,"context_line":"        self.log.debug(\"Dependencies of %s, (%d) %s (%s soft dependencies)\","},{"line_number":1822,"context_line":"                       parent_job,"},{"line_number":1823,"context_line":"                       len(all_dependent_jobs),"},{"line_number":1824,"context_line":"                       \",\".join(all_dependent_jobs),"},{"line_number":1825,"context_line":"                       \"skipping\" if skip_soft else \"including\")"},{"line_number":1826,"context_line":"        return [self.jobs[name] for name in all_dependent_jobs]"},{"line_number":1827,"context_line":""},{"line_number":1828,"context_line":"    def getParentJobsRecursively(self, dependent_job, layout\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_f42a6f8f","line":1825,"range":{"start_line":1821,"start_character":0,"end_line":1825,"end_character":64},"updated":"2019-08-23 13:41:59.000000000","message":"Same with this line.","commit_id":"d54783ce73dc7a4b635cf566c94bf1ad97975166"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"af25ba66d8d3cbcc8570edcf5724033f2463fa63","unresolved":false,"context_lines":[{"line_number":2500,"context_line":""},{"line_number":2501,"context_line":"        failed_job_names \u003d set()  # Jobs that run and failed"},{"line_number":2502,"context_line":"        ignored_job_names \u003d set()  # Jobs that were skipped or canceled"},{"line_number":2503,"context_line":"        unexecuted_job_names \u003d set()  # Jobs that were not started yes"},{"line_number":2504,"context_line":"        jobs_not_started \u003d set()"},{"line_number":2505,"context_line":"        for job in self.job_graph.getJobs():"},{"line_number":2506,"context_line":"            build \u003d self.current_build_set.getBuild(job.name)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_cf00fc03","line":2503,"range":{"start_line":2503,"start_character":67,"end_line":2503,"end_character":70},"updated":"2019-08-23 13:41:59.000000000","message":"nit: yet","commit_id":"d54783ce73dc7a4b635cf566c94bf1ad97975166"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"af25ba66d8d3cbcc8570edcf5724033f2463fa63","unresolved":false,"context_lines":[{"line_number":2507,"context_line":"            if build:"},{"line_number":2508,"context_line":"                if build.result \u003d\u003d \u0027SUCCESS\u0027 or build.paused:"},{"line_number":2509,"context_line":"                    pass"},{"line_number":2510,"context_line":"                elif build.result \u003d\u003d \u0027FAILURE\u0027:"},{"line_number":2511,"context_line":"                    failed_job_names.add(job.name)"},{"line_number":2512,"context_line":"                else:  # elif build.result in (\u0027SKIPPED\u0027, \u0027CANCELED\u0027, ...):"},{"line_number":2513,"context_line":"                    ignored_job_names.add(job.name)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_6fc8e8a7","line":2510,"range":{"start_line":2510,"start_character":38,"end_line":2510,"end_character":45},"updated":"2019-08-23 13:41:59.000000000","message":"There are more ways to signal a failed job like RETRY_LIMIT, POST_FAILURE. Think it would be safer to specifically name the results that are allowed for soft dependencies and work with this information later. As far as I can see the only state that would allow a soft dependency to run would be SKIPPED. Everything else is either failed or not finished yet.","commit_id":"d54783ce73dc7a4b635cf566c94bf1ad97975166"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"af25ba66d8d3cbcc8570edcf5724033f2463fa63","unresolved":false,"context_lines":[{"line_number":2599,"context_line":"                    if req is None:"},{"line_number":2600,"context_line":"                        jobs_not_requested.add(job)"},{"line_number":2601,"context_line":""},{"line_number":2602,"context_line":"        self.log.debug(\"[Find to request] \""},{"line_number":2603,"context_line":"                       \"Failed: %s, ignored: %s, unexecuted: %s\","},{"line_number":2604,"context_line":"                       \", \".join(failed_job_names),"},{"line_number":2605,"context_line":"                       \", \".join(ignored_job_names),"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_0fc37459","line":2602,"range":{"start_line":2602,"start_character":24,"end_line":2602,"end_character":41},"updated":"2019-08-23 13:41:59.000000000","message":"This log will be emitted frequently for every item in every pipeline and thus can massively spam the logs. I think we should only log stuff here (and in findJobsToRun) when a state change happens.","commit_id":"d54783ce73dc7a4b635cf566c94bf1ad97975166"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"af25ba66d8d3cbcc8570edcf5724033f2463fa63","unresolved":false,"context_lines":[{"line_number":2630,"context_line":"                    # make sure that we have it before requesting the nodes."},{"line_number":2631,"context_line":"                    toreq.append(job)"},{"line_number":2632,"context_line":"                    job.queued \u003d True"},{"line_number":2633,"context_line":"        self.log.debug(\"Found jobs to request: %s\","},{"line_number":2634,"context_line":"                       \", \".join(map(lambda j: j.name, toreq)))"},{"line_number":2635,"context_line":"        return toreq"},{"line_number":2636,"context_line":""},{"line_number":2637,"context_line":"    def setResult(self, build):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_af8b4015","line":2634,"range":{"start_line":2633,"start_character":0,"end_line":2634,"end_character":63},"updated":"2019-08-23 13:41:59.000000000","message":"This log line is mostly redundand to the line emitted in provisionNodes (Adding node request ... for job ...) which is emitted for every job in this list. I also think this could massively spam the logs with \u0027Found jobs to request []\u0027 if there are no jobs to request. The reason for this is that it\u0027s called regularly for every item in every pipeline during normal processing. So we should only log things here if we actually have to do stuff here.","commit_id":"d54783ce73dc7a4b635cf566c94bf1ad97975166"}]}
