shelve: make shelvestate use simplekeyvaluefile
Currently shelvestate uses line ordering to differentiate fields. This
makes it hard for extensions to wrap shelve, since if two alternative
versions of code add a new line, correct merging is going to be problematic.
simplekeyvaluefile was introduced fot this purpose specifically.
After this patch:
- shelve will always write a simplekeyvaluefile
- unshelve will check the first line of the file for a version, and if the
version is 1, will read it in a position-based way, if the version is 2,
will read it in a key-value way
As discussed with Yuya previously, this will be able to handle old-style
shelvedstate files, but old Mercurial versions will fail on the attempt to
read shelvedstate file of version 2 with a self-explanatory message:
'abort: this version of shelve is incompatible with the version used
in this repo'
https://bz.mercurial-scm.org/2493
Testing tagging with the EOL extension
$ cat >> $HGRCPATH <<EOF
> [extensions]
> eol =
>
> [eol]
> native = CRLF
> EOF
setup repository
$ hg init repo
$ cd repo
$ cat > .hgeol <<EOF
> [patterns]
> ** = native
> EOF
$ printf "first\r\nsecond\r\nthird\r\n" > a.txt
$ hg commit --addremove -m 'checkin'
adding .hgeol
adding a.txt
Tag:
$ hg tag 1.0
Rewrite .hgtags file as it would look on a new checkout:
$ hg update -q null
$ hg update -q
Touch .hgtags file again:
$ hg tag 2.0
$ cd ..