Mercurial > hg
annotate tests/test-arbitraryfilectx.t @ 42619:20d0e59be79b
tests: show the files fields of changelogs for many merges
I don't think there's coverage for many of the subtle cases, and I
found it hard to understand what the code is doing by reading it. The
test takes 40s to run on a laptop, or 9s with --chg.
I have yet to find a description of what the files field is supposed
to be for merges. I thought it could be one of:
1. the files added/modified/removed relative to p1 (wouldn't seem
useful, but `hg diff -c -r mergerev` has this behavior)
2. the files with filelog nodes not in either parent (i.e., what is
needed to create a bundle out of a commit)
3. the files added/removed/modified files by merge itself [1]
It's clearly not 1, because file contents merges are symmetric. It's
clearly not 2 because removed files and exec bit changes are
listed. It's also not 3 but I think it's intended to be 3 and the
differences are bugs.
Assuming 3, the test shows that, for merges, the list of files both
overapproximates and underapproximates. All the cases involve file
changes not in the filelog but in the manifest (existence of file
at revision, exec bit and file vs symlink).
I didn't look at all underapproximations, but they looked minor. The
two overapproximations are problematic though because they both cause
potentially long lists of files when merging cleanly.
[1] even what it means for the merge commit itself to change a file is
not completely trivial. A file in the merge being the same as in one
of the parent is too lax as it would consider that merges change
nothing when they revert all the changes done on one side. The
criteria used in the test and in the next commit for "merge didn't
touch a file" is:
- the parents and the merge all have the same file
- or, one parent didn't touch the file and the other parent contains
the same file as the merge
Differential Revision: https://phab.mercurial-scm.org/D6612
author | Valentin Gatien-Baron <valentin.gatienbaron@gmail.com> |
---|---|
date | Tue, 02 Jul 2019 12:55:51 -0400 |
parents | 5361f9ed8a30 |
children | 42d2b31cee0b |
rev | line source |
---|---|
34835
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
1 Setup: |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
2 $ cat > eval.py <<EOF |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
3 > from __future__ import absolute_import |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
4 > import filecmp |
37318
9954d0e2ad00
py3: use pycompat.bytestr() intsead of str
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36382
diff
changeset
|
5 > from mercurial import commands, context, pycompat, registrar |
34835
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
6 > cmdtable = {} |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
7 > command = registrar.command(cmdtable) |
36382
b4d1c09b754b
py3: add missing b'' in test-arbitraryfilectx.t
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35947
diff
changeset
|
8 > @command(b'eval', [], b'hg eval CMD') |
34835
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
9 > def eval_(ui, repo, *cmds, **opts): |
35947
a36d3c8a0e41
py3: add b'' prefixes to string literals in test files
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34936
diff
changeset
|
10 > cmd = b" ".join(cmds) |
37318
9954d0e2ad00
py3: use pycompat.bytestr() intsead of str
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36382
diff
changeset
|
11 > res = pycompat.bytestr(eval(cmd, globals(), locals())) |
35947
a36d3c8a0e41
py3: add b'' prefixes to string literals in test files
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34936
diff
changeset
|
12 > ui.warn(b"%s" % res) |
34835
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
13 > EOF |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
14 |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
15 $ echo "[extensions]" >> $HGRCPATH |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
16 $ echo "eval=`pwd`/eval.py" >> $HGRCPATH |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
17 |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
18 Arbitraryfilectx.cmp does not follow symlinks: |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
19 $ mkdir case1 |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
20 $ cd case1 |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
21 $ hg init |
34936
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
22 #if symlink |
34835
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
23 $ printf "A" > real_A |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
24 $ printf "foo" > A |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
25 $ printf "foo" > B |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
26 $ ln -s A sym_A |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
27 $ hg add . |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
28 adding A |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
29 adding B |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
30 adding real_A |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
31 adding sym_A |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
32 $ hg commit -m "base" |
34936
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
33 #else |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
34 $ hg import -q --bypass - <<EOF |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
35 > # HG changeset patch |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
36 > # User test |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
37 > # Date 0 0 |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
38 > base |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
39 > |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
40 > diff --git a/A b/A |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
41 > new file mode 100644 |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
42 > --- /dev/null |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
43 > +++ b/A |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
44 > @@ -0,0 +1,1 @@ |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
45 > +foo |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
46 > \ No newline at end of file |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
47 > diff --git a/B b/B |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
48 > new file mode 100644 |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
49 > --- /dev/null |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
50 > +++ b/B |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
51 > @@ -0,0 +1,1 @@ |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
52 > +foo |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
53 > \ No newline at end of file |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
54 > diff --git a/real_A b/real_A |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
55 > new file mode 100644 |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
56 > --- /dev/null |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
57 > +++ b/real_A |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
58 > @@ -0,0 +1,1 @@ |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
59 > +A |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
60 > \ No newline at end of file |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
61 > diff --git a/sym_A b/sym_A |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
62 > new file mode 120000 |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
63 > --- /dev/null |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
64 > +++ b/sym_A |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
65 > @@ -0,0 +1,1 @@ |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
66 > +A |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
67 > \ No newline at end of file |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
68 > EOF |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
69 $ hg up -q |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
70 #endif |
34835
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
71 |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
72 These files are different and should return True (different): |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
73 (Note that filecmp.cmp's return semantics are inverted from ours, so we invert |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
74 for simplicity): |
41334
5361f9ed8a30
py3: fix missing b prefixes in test-arbitraryfilectx.t
Augie Fackler <augie@google.com>
parents:
37318
diff
changeset
|
75 $ hg eval "context.arbitraryfilectx(b'A', repo).cmp(repo[None][b'real_A'])" |
34835
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
76 True (no-eol) |
41334
5361f9ed8a30
py3: fix missing b prefixes in test-arbitraryfilectx.t
Augie Fackler <augie@google.com>
parents:
37318
diff
changeset
|
77 $ hg eval "not filecmp.cmp(b'A', b'real_A')" |
34835
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
78 True (no-eol) |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
79 |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
80 These files are identical and should return False (same): |
41334
5361f9ed8a30
py3: fix missing b prefixes in test-arbitraryfilectx.t
Augie Fackler <augie@google.com>
parents:
37318
diff
changeset
|
81 $ hg eval "context.arbitraryfilectx(b'A', repo).cmp(repo[None][b'A'])" |
34835
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
82 False (no-eol) |
41334
5361f9ed8a30
py3: fix missing b prefixes in test-arbitraryfilectx.t
Augie Fackler <augie@google.com>
parents:
37318
diff
changeset
|
83 $ hg eval "context.arbitraryfilectx(b'A', repo).cmp(repo[None][b'B'])" |
34835
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
84 False (no-eol) |
41334
5361f9ed8a30
py3: fix missing b prefixes in test-arbitraryfilectx.t
Augie Fackler <augie@google.com>
parents:
37318
diff
changeset
|
85 $ hg eval "not filecmp.cmp(b'A', b'B')" |
34835
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
86 False (no-eol) |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
87 |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
88 This comparison should also return False, since A and sym_A are substantially |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
89 the same in the eyes of ``filectx.cmp``, which looks at data only. |
41334
5361f9ed8a30
py3: fix missing b prefixes in test-arbitraryfilectx.t
Augie Fackler <augie@google.com>
parents:
37318
diff
changeset
|
90 $ hg eval "context.arbitraryfilectx(b'real_A', repo).cmp(repo[None][b'sym_A'])" |
34835
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
91 False (no-eol) |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
92 |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
93 A naive use of filecmp on those two would wrongly return True, since it follows |
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
94 the symlink to "A", which has different contents. |
34936
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
95 #if symlink |
41334
5361f9ed8a30
py3: fix missing b prefixes in test-arbitraryfilectx.t
Augie Fackler <augie@google.com>
parents:
37318
diff
changeset
|
96 $ hg eval "not filecmp.cmp(b'real_A', b'sym_A')" |
34835
14c87708f432
arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents:
diff
changeset
|
97 True (no-eol) |
34936
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
98 #else |
41334
5361f9ed8a30
py3: fix missing b prefixes in test-arbitraryfilectx.t
Augie Fackler <augie@google.com>
parents:
37318
diff
changeset
|
99 $ hg eval "not filecmp.cmp(b'real_A', b'sym_A')" |
34936
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
100 False (no-eol) |
9645c2a2bc2a
test-arbitraryfilectx: stabilize for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents:
34835
diff
changeset
|
101 #endif |