8
Inside bzr, a typical fetch happens like this:
10
* a user runs a command like ``bzr branch`` or ``bzr pull``
12
* ``Repository.fetch`` is called (by a higher-level method such as
13
``ControlDir.sprout``, ``Branch.fetch``, etc).
15
* An ``InterRepository`` object is created. The exact implementation of
16
``InterRepository`` chosen depends on the format/capabilities of the
17
source and target repos.
19
* The source and target repositories are compared to determine which data
20
needs to be transferred.
22
* The repository data is copied. Often this is done by creating a
23
``StreamSource`` and ``StreamSink`` from the source and target
24
repositories and feeding the stream from the source into the sink, but
25
some ``InterRepository`` implementations do differently.
28
How objects to be transferred are determined
29
============================================
31
See ``InterRepository._walk_to_common_revisions``. The basic idea is to
32
do a breadth-first search in the source repository's revision graph
33
(starting from the head or heads the caller asked for), and look in the
34
target repository to see if those revisions are already present.
35
Eventually this will find the common ancestors in both graphs, and thus
36
the set of revisions to be copied has been identified.
38
All inventories for the copied revisions need to be present (and all
39
parent inventories at the stacking boundary too, to support stacking).
41
All texts versions introduced by those inventories need to be transferred
42
(but see also stacking constraints).
47
The most ``fetch`` methods accept a ``fetch_spec`` parameter. This is how
48
the caller controls what is fetched: e.g. all revisions for a given head
49
(that aren't already present in the target), the full ancestry for one or
50
more heads, or even the full contents of the source repository.
52
The ``fetch_spec`` parameter is an object that implements the interface
53
defined by ``AbstractSearchResult`` in ``bzrlib.graph``. It describes
54
which keys should be fetched. Current implementations are
55
``SearchResult``, ``PendingAncestryResult``, ``EmptySearchResult``, and
56
``EverythingResult``. Some have options controlling if missing revisions
57
cause errors or not, etc.
59
There are also some “search” objects, which can be used to conveniently
60
construct a search result for common cases: ``EverythingNotInOther`` and
61
``NotInOtherForRevs``. They provide an ``execute`` method that performs
62
the search and returns a search result.
64
Also, ``Graph._make_breadth_first_searcher`` returns an object with a
65
``get_result`` method that returns a search result.
71
A **stream** is an iterable of (substream type, substream) pairs.
72
The **substream type** is a ``str`` that will be one of ``texts``,
73
``inventories``, ``inventory-deltas``, ``chk_bytes``, ``revisions`` or
74
``signatures``. A **substream** is a record stream. The format of those
75
records depends on the repository format being streamed, except for
76
``inventory-deltas`` records which are format-independent.
78
A stream source can be constructed with ``repo._get_source(to_format)``,
79
and it provides a ``get_stream(search)`` method (among others). A stream
80
sink can be constructed with ``repo._get_sink()``, and provides an
81
``insert_stream(stream, src_format, resume_tokens)`` method (among