Wiki: WireProtocol

Matt Mackall mpm at
Tue Sep 6 13:06:55 CDT 2005

On Fri, Sep 02, 2005 at 08:01:51PM -0700, Eric Hopper wrote:
> I'm looking at this document and finding it slightly confusing.  I wish
> it were editable because then I'd just put in my guesses about what
> certain things mean and watch to see if I was right.  :-)

It ought to be editable. Are you logged in?

> branches(list)
>  for node in list:
>    follow the linear section of a branch back to its branchpoint
>    return (tip, base, p1, p2)
>    (this reduces round trips for long linear branches)
> Do p1 and p2 refer to the parents of base? 


> What happens if the search
> goes all the way to the root node?

You get the nullid (000..).

> You might also state that a
> branchpoint might be called a mergepoint if you were looking at things
> from the other direction.  :-)


> between(list)
>  for tip, base in list:
>    walk back a linear branch, return elements 1, 2, 4, 8..
>    (and this lets us do bisection search if we diverge in the middle of
>    one of these long branches)
> What happens here if the client hands you a tip and base that do not
> have a linear relationship?

Then the server hands back undefined garbage.

> Do you walk from the base to the tip when
> returning elements?

No, we walk from tip to base. Between is defined to operate on a
section of history with no merges, so each element has exactly one
parent. So we simply walk tip->p1->p1->...->base. Then we return
elements 1, 2, 4, 8,.. of the resulting list.

> If you don't, how is a search accomplished?  Since
> presumably it's the tip that won't be known, you'll always return the
> same pattern of elements no matter what the client specifies as the
> base.


> Does the protocol allow for streaming HTTP requests?

What request batching can be done is done internally. There's not a
lot of opportunity for parallelism here.
> Also, the description of a changegroup isn't quite clear enough.  What's
> a link hash?  What happens if a node doesn't have a second parent?  are
> all the different kinds of group the same format?  If so, why are there
> different kinds of group?

A link hash is the hash of the associated changeset. Nodes always have
a second parent, though usually it's the nullid. All the groups are in
the same format, over the wire and on disk. The only differences are
what Mercurial uses them for - a changelog is different from a filelog.

Mathematics is the supreme nostalgia of our time.

More information about the Mercurial mailing list