sapling/tests/test-fastannotate.t
Jun Wu dc07b62633 fastannotate: handle "draft" paths, and renames correctly
Summary:
Previously we can only answer the "path" information when the revision is in
the linelog revmap, and the code would crash if a revision is in a side
branch, and the user requests path information. This diff fixes it.

Besides, this diff improves rename handling. For example, given the following
chart:

```
  o---o  -o   file name: a
        /
  o---o-      file name: b
  ^   ^   ^
  1   2   3   revisions
```

Depending on the position of the `main branch` reference, fastannotate may
or may not use linelog:

- main branch is at rev 2, annotate a -r 3 will not take advantage of linelog
  (fallback to slow annotate)
- main branch is at rev 3, annotate a -r 2 will not take advantage of linelog

This is not ideal, but seems to be the best we can do for now.

Test Plan:
Added a new test, updated existing relevant tests. Some debug messages are
changed to reflect internals more precisely.

Reviewers: #sourcecontrol, stash

Reviewed By: stash

Subscribers: stash, mjpieters

Differential Revision: https://phabricator.intern.facebook.com/D4010964

Signature: t1:4010964:1476458201:79875d96399d023d0000d0c4bb8b8d40ea43eef0
2016-10-09 19:47:01 +01:00

199 lines
3.8 KiB
Perl

$ extpath=`dirname $TESTDIR`
$ PYTHONPATH=$extpath:$TESTDIR/../:$PYTHONPATH
$ export PYTHONPATH
$ cat >> $HGRCPATH << EOF
> [extensions]
> fastannotate=
> EOF
$ HGMERGE=true; export HGMERGE
$ hg init repo
$ cd repo
a simple merge case
$ echo 1 > a
$ hg commit -qAm 'append 1'
$ echo 2 >> a
$ hg commit -m 'append 2'
$ echo 3 >> a
$ hg commit -m 'append 3'
$ hg up 1 -q
$ cat > a << EOF
> 0
> 1
> 2
> EOF
$ hg commit -qm 'insert 0'
$ hg merge 2 -q
$ echo 4 >> a
$ hg commit -m merge
$ hg log -G -T '{rev}: {desc}'
@ 4: merge
|\
| o 3: insert 0
| |
o | 2: append 3
|/
o 1: append 2
|
o 0: append 1
$ hg fastannotate a
3: 0
0: 1
1: 2
2: 3
4: 4
$ hg fastannotate -r 0 a
0: 1
$ hg fastannotate -r 1 a
0: 1
1: 2
$ hg fastannotate -udnclf a
test 3 d641cb51f61e Thu Jan 01 00:00:00 1970 +0000 a:1: 0
test 0 4994017376d3 Thu Jan 01 00:00:00 1970 +0000 a:1: 1
test 1 e940cb6d9a06 Thu Jan 01 00:00:00 1970 +0000 a:2: 2
test 2 26162a884ba6 Thu Jan 01 00:00:00 1970 +0000 a:3: 3
test 4 3ad7bcd2815f Thu Jan 01 00:00:00 1970 +0000 a:5: 4
$ hg fastannotate --linear a
3: 0
0: 1
1: 2
4: 3
4: 4
incrementally updating
$ hg fastannotate -r 0 a --debug
fastannotate: a: using fast path (resolved fctx: True)
0: 1
$ hg fastannotate -r 0 a --debug --rebuild
fastannotate: a: 1 new changesets in the main branch
0: 1
$ hg fastannotate -r 1 a --debug
fastannotate: a: 1 new changesets in the main branch
0: 1
1: 2
$ hg fastannotate -r 3 a --debug
fastannotate: a: 1 new changesets in the main branch
3: 0
0: 1
1: 2
$ hg fastannotate -r 4 a --debug
fastannotate: a: 1 new changesets in the main branch
3: 0
0: 1
1: 2
2: 3
4: 4
$ hg fastannotate -r 1 a --debug
fastannotate: a: using fast path (resolved fctx: True)
0: 1
1: 2
rebuild happens automatically if unable to update
$ hg fastannotate -r 2 a --debug
fastannotate: a: cache broken and deleted
fastannotate: a: 3 new changesets in the main branch
0: 1
1: 2
2: 3
config option "fastannotate.mainbranch"
$ hg fastannotate -r 1 --rebuild --config fastannotate.mainbranch=tip a --debug
fastannotate: a: 4 new changesets in the main branch
0: 1
1: 2
$ hg fastannotate -r 4 a --debug
fastannotate: a: using fast path (resolved fctx: True)
3: 0
0: 1
1: 2
2: 3
4: 4
config option "fastannotate.commands"
$ hg annotate -r 1 --debug a
0: 1
1: 2
$ hg annotate --config fastannotate.commands=annotate -r 1 --debug a
fastannotate: a: using fast path (resolved fctx: True)
0: 1
1: 2
$ hg fastannotate --config fastannotate.commands=annotate -h -q
hg: unknown command 'fastannotate'
(did you mean *) (glob)
[255]
rename
$ hg mv a b
$ cat > b << EOF
> 0
> 11
> 3
> 44
> EOF
$ hg commit -m b -q
$ hg fastannotate -ncf --long-hash b
3 d641cb51f61e331c44654104301f8154d7865c89 a: 0
5 d44dade239915bc82b91e4556b1257323f8e5824 b: 11
2 26162a884ba60e8c87bf4e0d6bb8efcc6f711a4e a: 3
5 d44dade239915bc82b91e4556b1257323f8e5824 b: 44
$ hg fastannotate -r 26162a884ba60e8c87bf4e0d6bb8efcc6f711a4e a
0: 1
1: 2
2: 3
fastannotate --deleted
$ hg fastannotate --deleted -nf b
3 a: 0
5 b: 11
0 a: -1
1 a: -2
2 a: 3
5 b: 44
4 a: -4
$ hg fastannotate --deleted -r 3 -nf a
3 a: 0
0 a: 1
1 a: 2
file and directories with ".l", ".m" suffixes
$ cd ..
$ hg init repo2
$ cd repo2
$ mkdir a.l b.m c.lock a.l.hg b.hg
$ for i in a b c d d.l d.m a.l/a b.m/a c.lock/a a.l.hg/a b.hg/a; do
> echo $i > $i
> done
$ hg add . -q
$ hg commit -m init
$ hg fastannotate a.l/a b.m/a c.lock/a a.l.hg/a b.hg/a d.l d.m a b c d
0: a
0: a.l.hg/a
0: a.l/a
0: b
0: b.hg/a
0: b.m/a
0: c
0: c.lock/a
0: d
0: d.l
0: d.m
empty file
$ touch empty
$ hg commit -A empty -m empty
$ hg fastannotate empty