)]}'
{"zuul/manager/__init__.py":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"ebf9700b649b97cbdd3e887f619a42a1dcc372eb","unresolved":false,"context_lines":[{"line_number":689,"context_line":"            build_set.setConfiguration()"},{"line_number":690,"context_line":"        if build_set.merge_state \u003d\u003d build_set.NEW:"},{"line_number":691,"context_line":"            tenant \u003d item.pipeline.tenant"},{"line_number":692,"context_line":"            tpc \u003d tenant.project_configs[item.change.project.canonical_name]"},{"line_number":693,"context_line":"            ready \u003d self.scheduleMerge("},{"line_number":694,"context_line":"                item,"},{"line_number":695,"context_line":"                files\u003d([\u0027zuul.yaml\u0027, \u0027.zuul.yaml\u0027] +"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_e9a52d48","side":"PARENT","line":692,"updated":"2019-07-15 14:35:59.000000000","message":"Unconditional tpc lookup.","commit_id":"41927a38db6ec7b3149ad274b9bbb166a81b1b36"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"90c62067da96d810576fe50bced76621722e1ce8","unresolved":false,"context_lines":[{"line_number":613,"context_line":"        if build_set.merge_state !\u003d build_set.COMPLETE:"},{"line_number":614,"context_line":"            return None"},{"line_number":615,"context_line":"        if build_set.unable_to_merge:"},{"line_number":616,"context_line":"            return fallback_layout"},{"line_number":617,"context_line":"        self.log.debug(\"Preparing dynamic layout for: %s\" % item.change)"},{"line_number":618,"context_line":"        return self._loadDynamicLayout(item)"},{"line_number":619,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_986bb7b5","line":616,"updated":"2019-07-12 22:38:36.000000000","message":"Line 735 doesn\u0027t assume a None result, and it is not redundant (unlike line 737 which is).  This lets us have a layout on a non-live item with a merge conflict, which seems nice because of the consistency.  As far as what happens next, this is very similar to the case with config errors, except unlike in that case, it is not possible for a child change to merge cleanly if its parent does not.  That means that if B-\u003eA, and A is unable to merge, then B will also be unable to merge.  So the end result is the same: we won\u0027t run jobs for B.\n\nI think we could optimize this and make it behave in the same way as the config error case, because the end result is going to be the same.  But somehow, this seems the slightly more \"correct\" way, only because we\u0027re setting the layout on the item since we can.  That might make a difference in what we report in, say, a third change (C) which has a config error and depends on B.  As written, we should report the config error, but if we make this optimization, we won\u0027t have the right data and will probably just report that a parent had a merge failure.\n\nThat\u0027s how I see it, but I hold these beliefs weakly and can probably be swayed easily.  :)","commit_id":"de1a8372a8049fd2ded867ed61bfdc14dd506e45"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"e7a822962588b927dbdf0cd0b8a8470225ec9a24","unresolved":false,"context_lines":[{"line_number":613,"context_line":"        if build_set.merge_state !\u003d build_set.COMPLETE:"},{"line_number":614,"context_line":"            return None"},{"line_number":615,"context_line":"        if build_set.unable_to_merge:"},{"line_number":616,"context_line":"            return fallback_layout"},{"line_number":617,"context_line":"        self.log.debug(\"Preparing dynamic layout for: %s\" % item.change)"},{"line_number":618,"context_line":"        return self._loadDynamicLayout(item)"},{"line_number":619,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_ad0f5335","line":616,"updated":"2019-07-12 22:23:05.000000000","message":"Will this cause confusion below. Specifically around the code I Thought made other code redundant? line 731 assumes a None result on merge failures which won\u0027t happen anymore?","commit_id":"de1a8372a8049fd2ded867ed61bfdc14dd506e45"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"9e60da9d816010aace1e9ef991031b821e3c9a9e","unresolved":false,"context_lines":[{"line_number":695,"context_line":"        # The next section starts between 0 and 2 remote merger"},{"line_number":696,"context_line":"        # operations in parallel as needed."},{"line_number":697,"context_line":"        ready \u003d True"},{"line_number":698,"context_line":"        # If the project is in this tenant, fetch missing files so we"},{"line_number":699,"context_line":"        # know if it updates the config."},{"line_number":700,"context_line":"        if tpc:"},{"line_number":701,"context_line":"            if build_set.files_state \u003d\u003d build_set.NEW:"},{"line_number":702,"context_line":"                ready \u003d self.scheduleFilesChanges(item)"},{"line_number":703,"context_line":"            if build_set.files_state \u003d\u003d build_set.PENDING:"},{"line_number":704,"context_line":"                ready \u003d False"},{"line_number":705,"context_line":"        # If this change alters config or is live, schedule merge and"},{"line_number":706,"context_line":"        # build a layout."},{"line_number":707,"context_line":"        if build_set.merge_state \u003d\u003d build_set.NEW:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_1a7014dc","line":704,"range":{"start_line":698,"start_character":0,"end_line":704,"end_character":29},"updated":"2019-07-15 04:25:56.000000000","message":"This is not only about config changes but also to make file filters work on pull requests with \u003e300 files (this is the case when we don\u0027t know the file list upfront). If this PR is on a project without config this will probably break because tpc evaluates to false.","commit_id":"de1a8372a8049fd2ded867ed61bfdc14dd506e45"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"ebf9700b649b97cbdd3e887f619a42a1dcc372eb","unresolved":false,"context_lines":[{"line_number":701,"context_line":"            if build_set.files_state \u003d\u003d build_set.NEW:"},{"line_number":702,"context_line":"                ready \u003d self.scheduleFilesChanges(item)"},{"line_number":703,"context_line":"            if build_set.files_state \u003d\u003d build_set.PENDING:"},{"line_number":704,"context_line":"                ready \u003d False"},{"line_number":705,"context_line":"        # If this change alters config or is live, schedule merge and"},{"line_number":706,"context_line":"        # build a layout."},{"line_number":707,"context_line":"        if build_set.merge_state \u003d\u003d build_set.NEW:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_8964b923","line":704,"updated":"2019-07-15 14:35:59.000000000","message":"tpc has a value for every project that appears in the tenant config (even if we don\u0027t load any config from it).  The current code assumes that the project of every item this function is run on appears in the config (see line 692 of the old side) and that is true because this was only run on live changes (and a live change must be for a project in the config).  However, we now want to run this on some non-live changes, so we need to check whether their projects are in the tenant (if they aren\u0027t, we don\u0027t need to do any merges since they can\u0027t have config or match file matchers).","commit_id":"de1a8372a8049fd2ded867ed61bfdc14dd506e45"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"b142d906f7066b3870e38cc9f049675350044cc6","unresolved":false,"context_lines":[{"line_number":701,"context_line":"            if build_set.files_state \u003d\u003d build_set.NEW:"},{"line_number":702,"context_line":"                ready \u003d self.scheduleFilesChanges(item)"},{"line_number":703,"context_line":"            if build_set.files_state \u003d\u003d build_set.PENDING:"},{"line_number":704,"context_line":"                ready \u003d False"},{"line_number":705,"context_line":"        # If this change alters config or is live, schedule merge and"},{"line_number":706,"context_line":"        # build a layout."},{"line_number":707,"context_line":"        if build_set.merge_state \u003d\u003d build_set.NEW:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_9485b05c","line":704,"in_reply_to":"7faddb67_8964b923","updated":"2019-07-15 14:43:03.000000000","message":"oh right, that makes sense","commit_id":"de1a8372a8049fd2ded867ed61bfdc14dd506e45"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"6e0afe9b73020df8a2924528a69f5b61d5b5485a","unresolved":false,"context_lines":[{"line_number":735,"context_line":"        if build_set.unable_to_merge:"},{"line_number":736,"context_line":"            return False"},{"line_number":737,"context_line":"        if build_set.config_errors:"},{"line_number":738,"context_line":"            return False"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"        # We don\u0027t need to build a job graph for a non-live item, we"},{"line_number":741,"context_line":"        # just need the layout."}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_6da95b22","line":738,"updated":"2019-07-12 22:03:05.000000000","message":"I believe so, but I left it here for belts and suspenders (in case of a future refactor in getLayout that changed that assumption).","commit_id":"de1a8372a8049fd2ded867ed61bfdc14dd506e45"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"9cb0b618206d686062687b5bff3d3d19410cc7c3","unresolved":false,"context_lines":[{"line_number":735,"context_line":"        if build_set.unable_to_merge:"},{"line_number":736,"context_line":"            return False"},{"line_number":737,"context_line":"        if build_set.config_errors:"},{"line_number":738,"context_line":"            return False"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"        # We don\u0027t need to build a job graph for a non-live item, we"},{"line_number":741,"context_line":"        # just need the layout."}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_ed9c6b0f","line":738,"updated":"2019-07-12 21:57:50.000000000","message":"Is this config_errors check redundant with the return False on line 731 above?","commit_id":"de1a8372a8049fd2ded867ed61bfdc14dd506e45"}]}
