filectx: fix cmp() of file starting with '\1\n'
If file data starts with '\1\n', it will be escaped in the revlog to
create an empty metadata block, thus adding four bytes to the size in
the revlog size index. There's no way to detect that this has happened
in filelog.size() faster than decompressing each revision [1].
For filectx.cmp(), we have the size of the file in the working directory
available. If it differs by exactly four bytes, it may be this case, so
do a full comparison.
[1]: http://markmail.org/message/5akdbmmqx7vq2fsg
$ cat >> $HGRCPATH <<EOF
> [extensions]
> graphlog=
> rebase=
>
> [alias]
> tglog = log -G --template "{rev}: '{desc}' {branches}\n"
> EOF
$ hg init a
$ cd a
$ echo A > A
$ hg add A
$ hg ci -m A
$ echo 'B' > B
$ hg add B
$ hg ci -m B
$ echo C >> A
$ hg ci -m C
$ hg up -q -C 0
$ echo D >> A
$ hg ci -m D
created new head
$ echo E > E
$ hg add E
$ hg ci -m E
$ hg up -q -C 0
$ hg branch 'notdefault'
marked working directory as branch notdefault
(branches are permanent and global, did you want a bookmark?)
$ echo F >> A
$ hg ci -m F
$ cd ..
Rebasing B onto E - check keep:
$ hg clone -q -u . a a1
$ cd a1
$ hg tglog
@ 5: 'F' notdefault
|
| o 4: 'E'
| |
| o 3: 'D'
|/
| o 2: 'C'
| |
| o 1: 'B'
|/
o 0: 'A'
$ hg rebase -s 1 -d 4 --keep
merging A
warning: conflicts during merge.
merging A failed!
abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
[255]
Solve the conflict and go on:
$ echo 'conflict solved' > A
$ rm A.orig
$ hg resolve -m A
$ hg rebase --continue
$ hg tglog
@ 7: 'C'
|
o 6: 'B'
|
| o 5: 'F' notdefault
| |
o | 4: 'E'
| |
o | 3: 'D'
|/
| o 2: 'C'
| |
| o 1: 'B'
|/
o 0: 'A'
$ cd ..
Rebase F onto E - check keepbranches:
$ hg clone -q -u . a a2
$ cd a2
$ hg tglog
@ 5: 'F' notdefault
|
| o 4: 'E'
| |
| o 3: 'D'
|/
| o 2: 'C'
| |
| o 1: 'B'
|/
o 0: 'A'
$ hg rebase -s 5 -d 4 --keepbranches
merging A
warning: conflicts during merge.
merging A failed!
abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
[255]
Solve the conflict and go on:
$ echo 'conflict solved' > A
$ rm A.orig
$ hg resolve -m A
$ hg rebase --continue
saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
$ hg tglog
@ 5: 'F' notdefault
|
o 4: 'E'
|
o 3: 'D'
|
| o 2: 'C'
| |
| o 1: 'B'
|/
o 0: 'A'