revset: make __len__ part of the offical API

It is common for code to ask for the length of a revset. In fact, all but
generatorset already implement it.
generatorset: implement __len__

It was the only smartset class without a `__len__` implementation.
filteredset: drop __getitem__ implementation

It is expensive and not part of the official smartset API.
_spanset: drop __getitem__ implementation

It is expensive and not part of the official smartset API.
revset-only: use __nonzero__ to check if a revset is empty

For some smartsets, computing length is more expensive than checking if the set
is empty.
pull: call the `b2x-transactionclose` hook when closing the transaction

We need a wider set of hooks to process all the changes that happened during the
pull transaction. We reuse the experimental `b2x-transactionclose` hook set
from server's unbundle for consistency. This hook is experimental and will not
remains as-is forever, but this will open the door for experimentation in 3.2.
bundle2: add a comment about addchangegroup source and url

--HG--
extra : rebase_source : 1b73120615129d050574a6a5274d7a83383bf36f
obsstore: record data as floating point in fm0 format

For python struct module, "d" is double. But for python string
formating, "d" is integer. We want to preserve the floating point
nature of the data, so we store it in the metadata as floating
point. We use "%r" to make sure we get as many significant digitis as
necessary to restore the float to the exact same value on the other
side.

The fm1 is transmitting the information as float. The lack of this made
fm1-stored markers not survive a round-trip to fm0 leading to duplicated
markers (or two markers very alike).

--HG--
extra : rebase_source : c696533208c0b653d661aa8a031e19a697ac3758
revset-_ancestor: use & instead of filter

The & operation is more likely optimised.

::10
before) wall 0.028189 comb 0.030000 user 0.030000 sys 0.000000 (best of 100)
after)  wall 0.001050 comb 0.000000 user 0.000000 sys 0.000000 (best of 2326)

::tip
before) wall 0.081132 comb 0.080000 user 0.080000 sys 0.000000 (best of 100)
after)  wall 0.055418 comb 0.050000 user 0.050000 sys 0.000000 (best of 100)

--HG--
extra : rebase_source : 09f4d0d05d7eccd43edfb3e655b1badbce330d0c
revset-only: use `subset &` instead of filtering

The & version is more likely to be optimised.

only(.)
before) wall 0.003216 comb 0.000000 user 0.000000 sys 0.000000 (best of 768)
after)  wall 0.001086 comb 0.000000 user 0.000000 sys 0.000000 (best of 2231)

only(default, stable)
before) wall 0.018469 comb 0.020000 user 0.020000 sys 0.000000 (best of 138)
after)  wall 0.015888 comb 0.010000 user 0.010000 sys 0.000000 (best of 156)

--HG--
extra : rebase_source : 83f539ab3b87fe63716130b6871085c5dd63d673
revset-node: speedup by a few hundred fold

Instead of checking all elements of the subset against a single rev, just check
if this rev is in the subset. The old way was inherited from when the subset was
a list.

Non surprise, this provide massive speedup.


id("d82e2223f132")
before) wall 0.008205 comb 0.000000 user 0.000000 sys 0.000000 (best of 302)
after)  wall 0.000069 comb 0.000000 user 0.000000 sys 0.000000 (best of 34518)

revset #1: public() and id("d82e2223f132")
before) wall 0.019763 comb 0.020000 user 0.020000 sys 0.000000 (best of 124)
after)  wall 0.000101 comb 0.000000 user 0.000000 sys 0.000000 (best of 20130)

--HG--
extra : rebase_source : 72df9aebb93dfbb6679b895ca95516bc8d31b30d
dagwalker: drop a useless intermediate variable

The variable used to contain revs.set() but as the `.set()` has been removed
it is now useless.
bundle2: add a test for exceptions raised during the generation process

We would like exceptions raised during the generation process to be gracefully
handled on the receiver side. We add a test for it. It shows that we are not
doing it yet.

--HG--
extra : rebase_source : d1a83e122c32d6cc445680f0d17130e43a31bab1
bundle2: extract processing of part into its own function

This is code movement only. This will be useful to have it separated for reuse
purposes. We plan to introduce a new feature to the bundle format that allow
inserting a part in the middle of another part payload. This will be useful to
transmit a exception raised during a part generation.
bundle2: change header size and make them signed (new format)

We are changing all integers that denote the size of a chunk to read to int32.
There are two main motivations for that.

First, we change everything to the same width (32 bits) to make it possible for
a reasonably agnostic actor to forward a bundle2 without any extra processing.
With this change, this could be achieved by just reading int32s and forwarding
chunks of the size read. A bit a smartness would be logic to detect the end of
stream but nothing too complicated.

Second, we need some capacity to transmit special information during the bundle
processing. For example we would like to be able to raise an exception while a
part is being read if this exception happend while this part was generated.
Having signed integer let us use negative numbers to trigger special events
during the parsing of the bundle.

The format is renamed for B2X to B2Y because this breaks binary
compatibility. The B2X format support is dropped. It was experimental to
allow this kind of things. All elements not directly related to the binary
format remain flagged "b2x" because they are still compatible.
bundle2: add an UnsupportedPartError

We need the BundleValueError for format errors not related to part support. So
we add a specific class for part-support errors.
bundle2: detect and disallow a negative chunk size

We have no usage planned for 2/3 of them and the support for the planned
usecase is not here yet. So we raise a BundleValueError when encountered

--HG--
extra : rebase_source : 642da94440842a2bf8a418c243409a75ec6d5784
changectx: wrap the `changeid` processing in a try/except

We are going to introduce more precise exception classes for filtered nodes. So
we will have to upgrade them to the `RepoLookupError` level here. We wrap the
whole thing into a try/except to ease this future catching. Some of the current
exception catching will be moved in this one. But the current changeset focuses
on code movement only.
changectx: move `IndexError` handling in the top level try except

This one can be handled by the top level catching.

--HG--
extra : rebase_source : f368a837f007e2018f3b81703cb37a3dcc5c32aa
repoview: add a FilteredIndexError class

This exception is a more precise IndexError that will allow us to
issue a special message when we end up accessing a filtered revision.

--HG--
extra : rebase_source : f2ff496efe132d6ae49a2a127b344fb005b82c56