Skip to content
Snippets Groups Projects
Martin von Zweigbergk's avatar
Martin von Zweigbergk authored
copies._filter() filters out copies whose source file does not exist
in the start commit or whose target file does not exist in the end
commit. We do that after chaining copies with dirstate copies or
backward renames from another branch. We also do at the end of the
changeset-centric copy tracing. The filtering means that we will
remove copies to/from files that did not exist in some intermediate
commit. That is inconsistent with what we do if a file has been
deleted and then re-added (we allow updating across that).

Copying the two first examples from issue6163:

  @  4 'rename x to y'
  |
  o  3 'add x again'
  |
  o  2 'remove x'
  |
  | o  1 'modify x'
  |/
  o  0 'add x'

  @  4 'rename x to y'
  |
  o  3 'add x again'
  |
  | o  2 'modify x'
  | |
  | o  1 'add x'
  |/
  o  0 'base'

When doing `hg rebase -r 1 -d 4` in the first case, it succeeds, but
`hg rebase -r 2 -d 4` in the second case does not. That's because we
chain and filter via commit 0, which does not have file 'x' in the
second case. IMO, that's clearly inconsistent. So this patch removes
the filtering step so it only happens at the end. If a file was
temporarily removed, whether via a merge base or not, it will now
still be considered the same file. That fixes issue6163 for the
changeset-centric case.

Differential Revision: https://phab.mercurial-scm.org/D6603
d013099c
History
Name Last commit Last update
contrib
doc
hgdemandimport
hgext
hgext3rd
i18n
mercurial
relnotes
rust
tests
.arcconfig
.clang-format
.editorconfig
.hgignore
.hgsigs
.hgtags
.jshintrc
CONTRIBUTING
CONTRIBUTORS
COPYING
Makefile
README.rst
hg
hgeditor
hgweb.cgi
setup.py