simplemerge: avoid a call to `pycompat.strkwargs()`
Differential Revision: https://phab.mercurial-scm.org/D11886
simplemerge: stop merging file flags
As
384df4db6520 (merge: merge file flags together with file content,
2013-01-09) explains, we shouldn't do a 3-way merge of the
symlink. However, since
84614212ae39 (flags: actually merge flags in
simplemerge, 2020-05-16), we do that in
`simplemerge.simplemerge()`. What's more, the merging of the
executable flag there isn't actually necessary; it was made a no-op by
the very next commit, i.e.
4234c9af515d (flags: read flag from
dirstate/disk for workingcopyctx (
issue5743), 2020-05-16).
I found the overall flag-merging code (not the bit in
`simplemerge.py`) very hard to follow, but I think I now finally
understand how it works. `mergestate.resolve()` calculates the merged
file flags and sets them on the local side of the merge (confusingly
by calling `_restore_backup()`). Then it calls
`filemerge.filemerge()`, which in turn calls
`simplemerge.simplemerge()` (if premerge is enabled). That means that
the flags on the local side `fcs.flags()` are already correct when the
flag-merging code in `simplemerge.simplemerge()` runs. Interestingly,
that code still works when the local side already has the merged
value, it just doesn't change the value. Here's a truth table to
explain why:
```
BLOMCAR
0000000
0011111
0101011
0111111
1000000
1010000
1100000
1111101
```
B: Base
L: Local
O: Other
M: Merged flags from `mergestate.resolve()`, i.e. what's called "local"
when we get to `simplemerge.simplemerge()`
C: `commonflags` in `simplemerge.simplemerge()`, i.e. `M & O`
A: `addedflags` in `simplemerge.simplemerge()`, i.e. `(M ^ O) - B`
R: Re-merged flags `simplemerge.simplemerge()`, i.e. `C | A`
As you can see, the re-merged flags are always unchanged compared to
the initial merged flags (R equals M).
Therefore, this patch effectively backs out
84614212ae39. (I might
later refactor this code to have the flags explicitly passed in.)
`simplemerge.simplemerge()` is also called from
`contrib/simplemerge.py`, but that code never passes any flags.
Differential Revision: https://phab.mercurial-scm.org/D11879
filemerge: stop returning always-`True` value
Now that we've removed some more leftovers from "merge driver", it's
clear that the first element of `filemerge()`'s return value is always
`True`.
Differential Revision: https://phab.mercurial-scm.org/D11885
filemerge: remove unused `orig` argument from tool functions
Differential Revision: https://phab.mercurial-scm.org/D11878
filemerge: stop passing around 3 unused `None` values in `files` argument
Since
67cfffbfb6a0 (filemerge: eliminate most uses of tempfiles,
2017-08-31), we have used only the last entry in the `files` tuple
that gets passed around to various functions. That commit said
"Emphasize that they're unused so we can more easily remove them
later.". It's now "later".
Differential Revision: https://phab.mercurial-scm.org/D11877
filemerge: rename backup variables from `back` to `backup`
`backup` seems like an obviously clearer name for something containing
something related to a backup.
Differential Revision: https://phab.mercurial-scm.org/D11876
setup.py: fix some documentation typos
Differential Revision: https://phab.mercurial-scm.org/D11944
dirstate-v2: Apply SECOND_AMBIGUOUS to directory mtimes too
This would only be relevant in contrived scenarios such as a dirstate file
being written with a libc that supports sub-second precision in mtimes,
then transfered (at the filesystem level, not `hg clone`) to another
system where libc *doesn’t* have sub-second precision and truncates the stored
mtime of a directory to integer seconds.
Differential Revision: https://phab.mercurial-scm.org/D11939
rank: actually persist revision's rank in changelog-v2
The changelog v2 format is now persisting whatever "rank" value is recorded.
However keep in mind that for we do not record any value.
Differential Revision: https://phab.mercurial-scm.org/D11937
rank: add a "rank" value to the revlog-entry tuple
The rank of a revision is the size of sub-graph it defines as a head. In other
words, the rank of X is the size of `ancestors(X)` (X included).
This is a property that can help various algorithm and we intend to store it in
changelog-v2. We start with adding this new information to the "entry tuple",
with a default value. We will start to compute and persist the rank later.
Differential Revision: https://phab.mercurial-scm.org/D11936