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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
b682997d6944 spelling: deactivates
timeless@mozdev.org
parents: 17264
diff changeset
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
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
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
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
69 $ echo "mq=!" >> $HGRCPATH
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
70 $ hg init repo
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
71 $ cd repo
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
72 $ echo a > a
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
73 $ hg ci -Am adda
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
74 adding a
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
75 $ echo b > b
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
76 $ hg ci -Am addb
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
77 adding b
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
78 $ hg bookmarks markb
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
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
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
83 are you there?
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
84
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
85 $ hg bookmarks
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
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
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
94 can you be added again?
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
95
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
96 $ hg bookmarks markb
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
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
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
116 $ cd ..
9d45f78c465b Merge with stable
Patrick Mezard <pmezard@gmail.com>
parents: 12392 12376
diff changeset
117