typing: make `bundlerepository` subclass `localrepository` while type checking
Currently, `mercurial/bundlerepo.py` is excluded from pytype, mostly because it
complains that various `ui` and `vfs` fields in `localrepository` are missing.
(`bundlerepository` dynamically subclasses `localrepository` when it is
instantiated, so it works at runtime.) This makes that class hierarchy known to
pytype.
Having a protocol for `Repository` is probably the right thing to do, but that
will be a lot of work and this still reflects the class at runtime. Subclassing
also has the benefit of making sure any method overrides have a matching
signature, so maybe this is a situation where we do both of these things. (I'm
not sure how clear the diagnostics are if a class *almost* implements a
protocol, but is missing a method argument or similar.) The subclassing is not
done outside of type checking runs to avoid any side effects on already complex
code.
#require symlink
$ echo "[extensions]" >> $HGRCPATH
$ echo "mq=" >> $HGRCPATH
$ hg init repo
$ cd repo
$ hg qinit
$ hg qnew base.patch
$ echo aaa > a
$ echo bbb > b
$ echo ccc > c
$ hg add a b c
$ hg qrefresh
$ readlink.py a
a -> a not a symlink
test replacing a file with a symlink
$ hg qnew symlink.patch
$ rm a
$ ln -s b a
$ hg qrefresh --git
$ readlink.py a
a -> b
$ hg qpop
popping symlink.patch
now at: base.patch
$ hg qpush
applying symlink.patch
now at: symlink.patch
$ readlink.py a
a -> b
test updating a symlink
$ rm a
$ ln -s c a
$ hg qnew --git -f updatelink
$ readlink.py a
a -> c
$ hg qpop
popping updatelink
now at: symlink.patch
$ hg qpush --debug
applying updatelink
patching file a
committing files:
a
committing manifest
committing changelog
updating the branch cache
now at: updatelink
$ readlink.py a
a -> c
$ hg st
test replacing a symlink with a file
$ ln -s c s
$ hg add s
$ hg qnew --git -f addlink
$ rm s
$ echo sss > s
$ hg qnew --git -f replacelinkwithfile
$ hg qpop
popping replacelinkwithfile
now at: addlink
$ hg qpush
applying replacelinkwithfile
now at: replacelinkwithfile
$ cat s
sss
$ hg st
test symlink removal
$ hg qnew removesl.patch
$ hg rm a
$ hg qrefresh --git
$ hg qpop
popping removesl.patch
now at: replacelinkwithfile
$ hg qpush
applying removesl.patch
now at: removesl.patch
$ hg st -c
C b
C c
C s
replace broken symlink with another broken symlink
$ ln -s linka linka
$ hg add linka
$ hg qnew link
$ hg mv linka linkb
$ rm linkb
$ ln -s linkb linkb
$ hg qnew movelink
$ hg qpop
popping movelink
now at: link
$ hg qpush
applying movelink
now at: movelink
$ readlink.py linkb
linkb -> linkb