Mercurial > evolve
view MANIFEST.in @ 6364:e8d85d51c7b2 stable
topic: monkey-patch ctx.branch() correctly in override_context_branch
There's a `for p in ctx.parents()` loop in this block of code, and it's used to
monkey-patch .branch() method for both parents of ctx. It assigns each parent
of ctx to variable `p` (implicitly) and p.branch method to variable `pbranch`
(explicitly).
This worked fine when there's only one p1, but when there were 2 parents, this
code was broken, and our tests didn't catch this because the use of
override_context_branch context manager is quite limited.
The problem is that the newly created function uses `p` and `pbranch`, and the
closures for the new p1.branch() and p2.branch() didn't get created until the
for-loop finished, and the values `p` and `pbranch` could change before that.
In other words, the new .branch method of p1 was effectively identical to p2's
because the values that were available to it were from the second cycle of the
for-loop, when it the loop was at p2.
Now we pass the values to a function that creates the new .branch methods, and
since these values are provided to overridebranch() as arguments, they get
enclosed when the function returns.
This was seen (and tested) during topic namespaces-related work, when
override_context_branch usage was expanded to include some local operations.
author | Anton Shestakov <av6@dwimlabs.net> |
---|---|
date | Thu, 15 Dec 2022 17:07:25 +0400 |
parents | fa2fc0cad459 |
children | 7f95546f584e dd518437d4e0 |
line wrap: on
line source
include CHANGELOG include COPYING include hgext3rd/topic/README include MANIFEST.in include README.rst include setup.py recursive-include hgext3rd *.py recursive-include tests *.py *.sh *.t include docs/makefile include docs/*.py include docs/README include docs/*.rst include docs/static/*.svg include docs/tutorials/*.t include docs/tutorial/standalone.html recursive-include docs/figures *.svg *.png recursive-include docs/tutorial *.css *.js *.md *.py *.rst *.sh *.t exclude docs/tutorial/.netlify exclude .gitlab-ci.yml exclude hgext3rd/evolve/legacy.py exclude .hg-format-source exclude Makefile exclude tests/test-drop.t exclude tests/test-oldconvert.t prune contrib prune debian prune .gitlab prune hgext3rd/evolve/hack