Skip to content

Commit 80eaddd

Browse files
committed
patch 8.0.1290: seq_cur of undotree() wrong after undo
Problem: seq_cur of undotree() wrong after undo. Solution: Get the actual sequence number instead of decrementing the current one. (Ozaki Kiichi, closes #2319)
1 parent 7f2e9d7 commit 80eaddd

3 files changed

Lines changed: 77 additions & 10 deletions

File tree

src/testdir/test_undo.vim

Lines changed: 69 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,82 @@
44
" Also tests :earlier and :later.
55

66
func Test_undotree()
7-
exe "normal Aabc\<Esc>"
7+
new
8+
9+
normal! Aabc
10+
set ul=100
11+
let d = undotree()
12+
call assert_equal(1, d.seq_last)
13+
call assert_equal(1, d.seq_cur)
14+
call assert_equal(0, d.save_last)
15+
call assert_equal(0, d.save_cur)
16+
call assert_equal(1, len(d.entries))
17+
call assert_equal(1, d.entries[0].newhead)
18+
call assert_equal(1, d.entries[0].seq)
19+
call assert_true(d.entries[0].time <= d.time_cur)
20+
21+
normal! Adef
22+
set ul=100
23+
let d = undotree()
24+
call assert_equal(2, d.seq_last)
25+
call assert_equal(2, d.seq_cur)
26+
call assert_equal(0, d.save_last)
27+
call assert_equal(0, d.save_cur)
28+
call assert_equal(2, len(d.entries))
29+
call assert_equal(1, d.entries[0].seq)
30+
call assert_equal(1, d.entries[1].newhead)
31+
call assert_equal(2, d.entries[1].seq)
32+
call assert_true(d.entries[1].time <= d.time_cur)
33+
34+
undo
835
set ul=100
9-
exe "normal Adef\<Esc>"
36+
let d = undotree()
37+
call assert_equal(2, d.seq_last)
38+
call assert_equal(1, d.seq_cur)
39+
call assert_equal(0, d.save_last)
40+
call assert_equal(0, d.save_cur)
41+
call assert_equal(2, len(d.entries))
42+
call assert_equal(1, d.entries[0].seq)
43+
call assert_equal(1, d.entries[1].curhead)
44+
call assert_equal(1, d.entries[1].newhead)
45+
call assert_equal(2, d.entries[1].seq)
46+
call assert_true(d.entries[1].time == d.time_cur)
47+
48+
normal! Aghi
1049
set ul=100
50+
let d = undotree()
51+
call assert_equal(3, d.seq_last)
52+
call assert_equal(3, d.seq_cur)
53+
call assert_equal(0, d.save_last)
54+
call assert_equal(0, d.save_cur)
55+
call assert_equal(2, len(d.entries))
56+
call assert_equal(1, d.entries[0].seq)
57+
call assert_equal(2, d.entries[1].alt[0].seq)
58+
call assert_equal(1, d.entries[1].newhead)
59+
call assert_equal(3, d.entries[1].seq)
60+
call assert_true(d.entries[1].time <= d.time_cur)
61+
1162
undo
63+
set ul=100
1264
let d = undotree()
13-
call assert_true(d.seq_last > 0)
14-
call assert_true(d.seq_cur > 0)
15-
call assert_true(d.seq_cur < d.seq_last)
16-
call assert_true(len(d.entries) > 0)
17-
" TODO: check more members of d
65+
call assert_equal(3, d.seq_last)
66+
call assert_equal(1, d.seq_cur)
67+
call assert_equal(0, d.save_last)
68+
call assert_equal(0, d.save_cur)
69+
call assert_equal(2, len(d.entries))
70+
call assert_equal(1, d.entries[0].seq)
71+
call assert_equal(2, d.entries[1].alt[0].seq)
72+
call assert_equal(1, d.entries[1].curhead)
73+
call assert_equal(1, d.entries[1].newhead)
74+
call assert_equal(3, d.entries[1].seq)
75+
call assert_true(d.entries[1].time == d.time_cur)
1876

1977
w! Xtest
20-
call assert_equal(d.save_last + 1, undotree().save_last)
78+
let d = undotree()
79+
call assert_equal(1, d.save_cur)
80+
call assert_equal(1, d.save_last)
2181
call delete('Xtest')
22-
bwipe Xtest
82+
bwipe! Xtest
2383
endfunc
2484

2585
func FillBuffer()

src/undo.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2863,9 +2863,14 @@ u_undoredo(int undo)
28632863
/* Remember where we are for "g-" and ":earlier 10s". */
28642864
curbuf->b_u_seq_cur = curhead->uh_seq;
28652865
if (undo)
2866+
{
28662867
/* We are below the previous undo. However, to make ":earlier 1s"
28672868
* work we compute this as being just above the just undone change. */
2868-
--curbuf->b_u_seq_cur;
2869+
if (curhead->uh_next.ptr != NULL)
2870+
curbuf->b_u_seq_cur = curhead->uh_next.ptr->uh_seq;
2871+
else
2872+
curbuf->b_u_seq_cur = 0;
2873+
}
28692874

28702875
/* Remember where we are for ":earlier 1f" and ":later 1f". */
28712876
if (curhead->uh_save_nr != 0)

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,8 @@ static char *(features[]) =
761761

762762
static int included_patches[] =
763763
{ /* Add new patch number below this line */
764+
/**/
765+
1290,
764766
/**/
765767
1289,
766768
/**/

0 commit comments

Comments
 (0)