Mercurial > hg
annotate tests/test-bookmarks-strip.t @ 23702:c48924787eaa
filectx.parents: enforce changeid of parent to be in own changectx ancestors
Because of the way filenodes are computed, you can have multiple changesets
"introducing" the same file revision. For example, in the changeset graph
below, changeset 2 and 3 both change a file -to- and -from- the same content.
o 3: content = new
|
| o 2: content = new
|/
o 1: content = old
In such cases, the file revision is create once, when 2 is added, and just reused
for 3. So the file change in '3' (from "old" to "new)" has no linkrev pointing
to it). We'll call this situation "linkrev-shadowing". As the linkrev is used for
optimization purposes when walking a file history, the linkrev-shadowing
results in an unexpected jump to another branch during such a walk.. This leads to
multiple bugs with log, annotate and rename detection.
One element to fix such bugs is to ensure that walking the file history sticks on
the same topology as the changeset's history. For this purpose, we extend the
logic in 'basefilectx.parents' so that it always defines the proper changeset
to associate the parent file revision with. This "proper" changeset has to be an
ancestor of the changeset associated with the child file revision.
This logic is performed in the '_adjustlinkrev' function. This function is
given the starting changeset and all the information regarding the parent file
revision. If the linkrev for the file revision is an ancestor of the starting
changeset, the linkrev is valid and will be used. If it is not, we detected a
topological jump caused by linkrev shadowing, we are going to walk the
ancestors of the starting changeset until we find one setting the file to the
revision we are trying to create.
The performance impact appears acceptable:
- We are walking the changelog once for each filelog traversal (as there should
be no overlap between searches),
- changelog traversal itself is fairly cheap, compared to what is likely going
to be perform on the result on the filelog traversal,
- We only touch the manifest for ancestors touching the file, And such
changesets are likely to be the one introducing the file. (except in
pathological cases involving merge),
- We use manifest diff instead of full manifest unpacking to check manifest
content, so it does not involve applying multiple diffs in most case.
- linkrev shadowing is not the common case.
Tests for fixed issues in log, annotate and rename detection have been
added.
But this changeset does not solve all problems. It fixes -ancestry-
computation, but if the linkrev-shadowed changesets is the starting one, we'll
still get things wrong. We'll have to fix the bootstrapping of such operations
in a later changeset. Also, the usage of `hg log FILE` without --follow still
has issues with linkrev pointing to hidden changesets, because it relies on the
`filelog` revset which implement its own traversal logic that is still to be
fixed.
Thanks goes to:
- Matt Mackall: for nudging me in the right direction
- Julien Cristau and RĂ©mi Cardona: for keep telling me linkrev bug were an
evolution show stopper for 3 years.
- Durham Goode: for finding a new linkrev issue every few weeks
- Mads Kiilerich: for that last rename bug who raise this topic over my
anoyance limit.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Tue, 23 Dec 2014 15:30:38 -0800 |
parents | ca275f7ec576 |
children | e78a80f8f51e |
rev | line source |
---|---|
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
1 $ echo "[extensions]" >> $HGRCPATH |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
2 $ echo "mq=" >> $HGRCPATH |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
3 |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
4 $ hg init |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
5 |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
6 $ echo qqq>qqq.txt |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
7 |
13307
7f2b8aac7bdc
bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents:
12640
diff
changeset
|
8 rollback dry run without rollback information |
7f2b8aac7bdc
bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents:
12640
diff
changeset
|
9 |
7f2b8aac7bdc
bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents:
12640
diff
changeset
|
10 $ hg rollback |
7f2b8aac7bdc
bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents:
12640
diff
changeset
|
11 no rollback information available |
7f2b8aac7bdc
bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents:
12640
diff
changeset
|
12 [1] |
7f2b8aac7bdc
bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents:
12640
diff
changeset
|
13 |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
14 add file |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
15 |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
16 $ hg add |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
17 adding qqq.txt |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
18 |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
19 commit first revision |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
20 |
12156
4c94b6d0fb1c
tests: remove unneeded -d flags
Martin Geisler <mg@lazybytes.net>
parents:
11907
diff
changeset
|
21 $ hg ci -m 1 |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
22 |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
23 set bookmark |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
24 |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
25 $ hg book test |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
26 |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
27 $ echo www>>qqq.txt |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
28 |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
29 commit second revision |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
30 |
12156
4c94b6d0fb1c
tests: remove unneeded -d flags
Martin Geisler <mg@lazybytes.net>
parents:
11907
diff
changeset
|
31 $ hg ci -m 2 |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
32 |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
33 set bookmark |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
34 |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
35 $ hg book test2 |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
36 |
17497 | 37 update to -2 (deactivates the active bookmark) |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
38 |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
39 $ hg update -r -2 |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
40 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
21404
ca275f7ec576
update: when deactivating a bookmark, print a message
Siddharth Agarwal <sid0@fb.com>
parents:
17497
diff
changeset
|
41 (leaving bookmark test2) |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
42 |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
43 $ echo eee>>qqq.txt |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
44 |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
45 commit new head |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
46 |
12156
4c94b6d0fb1c
tests: remove unneeded -d flags
Martin Geisler <mg@lazybytes.net>
parents:
11907
diff
changeset
|
47 $ hg ci -m 3 |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
48 created new head |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
49 |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
50 bookmarks updated? |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
51 |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
52 $ hg book |
12156
4c94b6d0fb1c
tests: remove unneeded -d flags
Martin Geisler <mg@lazybytes.net>
parents:
11907
diff
changeset
|
53 test 1:25e1ee7a0081 |
4c94b6d0fb1c
tests: remove unneeded -d flags
Martin Geisler <mg@lazybytes.net>
parents:
11907
diff
changeset
|
54 test2 1:25e1ee7a0081 |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
55 |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
56 strip to revision 1 |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
57 |
11907
863567a1364f
tests: use regular expressions instead of helpers
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11864
diff
changeset
|
58 $ hg strip 1 |
12640
6cc4b14fb76b
tests: remove redundant globs
Mads Kiilerich <mads@kiilerich.com>
parents:
12394
diff
changeset
|
59 saved backup bundle to $TESTTMP/.hg/strip-backup/*-backup.hg (glob) |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
60 |
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
61 list bookmarks |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
62 |
11864
b2a06ef53b7b
tests: unify test-bookmarks-strip
Martin Geisler <mg@lazybytes.net>
parents:
11208
diff
changeset
|
63 $ hg book |
17264
ec7b9bec19c9
strip: move bookmarks to nearest ancestor rather than '.'
Augie Fackler <raf@durin42.com>
parents:
16191
diff
changeset
|
64 test 0:5c9ad3787638 |
ec7b9bec19c9
strip: move bookmarks to nearest ancestor rather than '.'
Augie Fackler <raf@durin42.com>
parents:
16191
diff
changeset
|
65 test2 0:5c9ad3787638 |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
66 |
12394 | 67 immediate rollback and reentrancy issue |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
68 |
12394 | 69 $ echo "mq=!" >> $HGRCPATH |
70 $ hg init repo | |
71 $ cd repo | |
72 $ echo a > a | |
73 $ hg ci -Am adda | |
74 adding a | |
75 $ echo b > b | |
76 $ hg ci -Am addb | |
77 adding b | |
78 $ hg bookmarks markb | |
79 $ hg rollback | |
13446
1e497df514e2
rollback: clarifies the message about the reverted state (issue2628)
Gilles Moris <gilles.moris@free.fr>
parents:
13416
diff
changeset
|
80 repository tip rolled back to revision 0 (undo commit) |
1e497df514e2
rollback: clarifies the message about the reverted state (issue2628)
Gilles Moris <gilles.moris@free.fr>
parents:
13416
diff
changeset
|
81 working directory now based on revision 0 |
7316
9737041646bc
bookmarks: Use dirstate to determine the current node in addchangegroup
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
82 |
12394 | 83 are you there? |
84 | |
85 $ hg bookmarks | |
86 no bookmarks set | |
12392
741290486877
bookmarks: fix _bookmarks/lookup() reentrancy issue (issue2016)
Patrick Mezard <pmezard@gmail.com>
parents:
11208
diff
changeset
|
87 |
13627
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
88 can we commit? (issue2692) |
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
89 |
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
90 $ echo c > c |
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
91 $ hg ci -Am rockon |
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
92 adding c |
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
93 |
12394 | 94 can you be added again? |
95 | |
96 $ hg bookmarks markb | |
97 $ hg bookmarks | |
13627
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
98 * markb 1:fdb34407462c |
13307
7f2b8aac7bdc
bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents:
12640
diff
changeset
|
99 |
7f2b8aac7bdc
bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents:
12640
diff
changeset
|
100 rollback dry run with rollback information |
7f2b8aac7bdc
bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents:
12640
diff
changeset
|
101 |
7f2b8aac7bdc
bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents:
12640
diff
changeset
|
102 $ hg rollback -n |
13627
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
103 repository tip rolled back to revision 0 (undo commit) |
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
104 $ hg bookmarks |
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
105 * markb 1:fdb34407462c |
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
106 |
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
107 rollback dry run with rollback information and no commit undo |
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
108 |
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
109 $ rm .hg/store/undo |
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
110 $ hg rollback -n |
13356
d96db730fcb2
bookmarks: merge rollback support into localrepo
Matt Mackall <mpm@selenic.com>
parents:
13307
diff
changeset
|
111 no rollback information available |
d96db730fcb2
bookmarks: merge rollback support into localrepo
Matt Mackall <mpm@selenic.com>
parents:
13307
diff
changeset
|
112 [1] |
13307
7f2b8aac7bdc
bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents:
12640
diff
changeset
|
113 $ hg bookmarks |
13627
71a96f6c205d
bookmarks: discard current bookmark if absent from the bookmarks (issue2692)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
13469
diff
changeset
|
114 * markb 1:fdb34407462c |
13307
7f2b8aac7bdc
bookmarks: respect rollbacks dryrun parameter
David Soria Parra <dsp@php.net>
parents:
12640
diff
changeset
|
115 |
12394 | 116 $ cd .. |
117 |