repository: establish API for emitting revision deltas
With our revision delta and revision delta request interfaces
defined, it is now time to define a method on storage interfaces
for using them.
So far, the only storage interface that is well-defined and used
is file storage. So that is the only interface we need to add a
method on.
We define an ``emitrevisiondeltas()`` method that takes an
iterable of ``irevisiondeltarequest``s and turns them into
``irevisiondelta`` instances.
changegroup._handlerevisiondeltarequest() and the looping logic
from changegroup.deltagroup() has effectively been moved to
revlog.emitrevisiondeltas().
Our filelog wrapper class proxies its emitrevisiondeltas() to
the internal revlog instance.
The simple store test extension used to verify sanity of storage
abstractions has also implemented emitrevisiondeltas() for
file storage and the test harness when run with this extension doesn't
seem to exhibit any regressions.
Rather than create a shared type to represent revision deltas,
each storage backend has its own type and the class name identifies
where the revision delta was derived from.
Differential Revision: https://phab.mercurial-scm.org/D4226
$ hg init
$ mkdir alpha
$ touch alpha/one
$ mkdir beta
$ touch beta/two
$ hg add alpha/one beta/two
$ hg ci -m "start"
$ echo 1 > alpha/one
$ echo 2 > beta/two
everything
$ hg diff --nodates
diff -r 7d5ef1aea329 alpha/one
--- a/alpha/one
+++ b/alpha/one
@@ -0,0 +1,1 @@
+1
diff -r 7d5ef1aea329 beta/two
--- a/beta/two
+++ b/beta/two
@@ -0,0 +1,1 @@
+2
beta only
$ hg diff --nodates beta
diff -r 7d5ef1aea329 beta/two
--- a/beta/two
+++ b/beta/two
@@ -0,0 +1,1 @@
+2
inside beta
$ cd beta
$ hg diff --nodates .
diff -r 7d5ef1aea329 beta/two
--- a/beta/two
+++ b/beta/two
@@ -0,0 +1,1 @@
+2
relative to beta
$ cd ..
$ hg diff --nodates --root beta
diff -r 7d5ef1aea329 two
--- a/two
+++ b/two
@@ -0,0 +1,1 @@
+2
inside beta
$ cd beta
$ hg diff --nodates --root .
diff -r 7d5ef1aea329 two
--- a/two
+++ b/two
@@ -0,0 +1,1 @@
+2
$ cd ..