Skip to content
GitLab
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Register
  • Sign in
  • evolve evolve
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
  • Merge requests 28
    • Merge requests 28
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Container Registry
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Activity
  • Graph
  • Jobs
  • Commits
Collapse sidebar
  • mercurialmercurial
  • evolveevolve
  • Merge requests
  • !474

topic: monkey-patch ctx.branch() correctly in override_context_branch

  • Review changes

  • Download
  • Patches
  • Plain diff
Merged Anton Shestakov requested to merge topic/stable/topic-commit-status into branch/stable Dec 19, 2022
  • Overview 0
  • Commits 2
  • Pipelines 1
  • Changes 2

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.

Assignee
Assign to
Reviewers
Request review from
Time tracking
Source branch: topic/stable/topic-commit-status