Home - Waterfall Grid T-Grid Console Builders Recent Builds Buildslaves Changesources - JSON API - About

Console View

Legend:   Passed Failed Failed Again Running Exception Offline No data

David Schleimer
push: update to branch tip instead of tip

We previously updated to the repository tip after pushing a revision,
presumably on the assumption that tip would be the last revision we
just pushed.  This assumption is flawed for high traffic repositories.
In particular, you previsouly would sometimes end up on a completley
unrelated commit if someone else commits to a different branch in
between the time we push a revision and pull it back from the server.

This changes to instead update to the branch tip of the branch we were
on at the beginning of the push.  This should be either the revision
we just pushed or a linear descendent of the revision we just pushed,
with a fair degree of reliability.
David Schleimer
editor: fix replay handling for copied + modified symlinks

We strip the 'link ' prefix from symlinks when we store it in
Mercurial.  We reapply it when we start editing the file via
open_file, but not via add_file.  this means that modified symlniks
would replay correctly, but not copied and modified symlinks.  This
corrects that ommission.
David Schleimer
editor: correctly import symlink copy+modify with non-empty prefix

We alwasy fail editing for symlinks, since we strip the leading 'link '
subversion includes when storing in mercurial, and then let svn
attempt to apply deltas against the stripped version.  This
unsurprisingly fails, and we write the resulting empty-string to the
Filestore for the current revision, and add the symlink in question to
the missing list to handle stupidly later.

Unfortunately, this would break down because editing adds files to the
store using their absolute path whereas missing files are added
relative to our subdir.  the absolut path file appears to win, which
results in us getting a symlink whose target is the empty string.

This fixes the problem by adding missing files to the fileStore using
their absolute path.
David Schleimer
editor: fix edge case with in memory file-store size limit

There are a few cases where we will set a single file into to the
editor's FileStore object more than once.  Notably, for copied and
then modified files, we will set it at least twice.  Three times if
editing fails (which it can for symlinks).

If we pass the in-memory storage limit in between the first (or second
if editing fails) time we set the file and the last time we set the
file, we will write the data to the in memory store the first time and
the file store the last time.  We didn't remove it form the in-memory
store though, and we always prefer reading from the in-memory store.
This means we can sometimes end up with the wrong version of a file.

This is fairly unlikely to happen in normal use since you need to hit
the memory limit between two writes to the store for the same file.
We only write a file multiple times if a) the file (and not one of
it's parent directories) is copied and then modified or b) editing
fails.  From what I can tell, it's only common for editing to fail for
symlinks, and they ten to be relatively small data that is unlikely to
push over the limit.  Finally, the default limit is 100MB which I
would expect to be most often either well over (source code) or well
under (binaries or automated changes) the size of the changes files in
a single commit.

The easiest way to reproduce this is to set the in-memory cache size
to 0 and then commit a copied and modified symlink.  The empty-string
version from the failed editing will be the one that persists.  I
happened to stumble upon this while trying (and failing) to test a
bug-fix for a related bug with identical symptoms (empty simlink). I
have seen this in the wild, once, but couldn't reproduce it at the
time. The repo in question is quite large and quite active, so I am
quite confident in my estimation that this is a real, but very rare,
problem.

The test changes attached to this was mneant to test a related bug,
but turned out not to actually cover the bug in question.  They did
trigger this bug though, and are worthwhile to test, so I kept them.
David Schleimer
editor: correctly import copies of directories from non-tracked or closed branches
Gregory Szorc
run-tests: make --interactive work with --view
Mads Kiilerich
convert: don't use multi argument set.update

Mumble mumble 2.4 mumble.
Mike Edgar
error: use docstrings, not bare strings, for error classes
Mads Kiilerich
osx: create dmg with installer instead of zip

OS X would offer to expand the zip so the (multi file) installer inside it
could be run ... but that would leave the expanded zip folder around.

Instead, use a .dmg file that automatically will be mounted - that seems more
common on OS X.

Still, there is two levels of levels of clicking before actually launching the
installer. Having a single file installer would be better ... but seems to be
hard. A more feasible improvement would be some fancy layout inside the .dmg .
Mike Edgar
error: use docstrings, not bare strings, for error classes
Mads Kiilerich
osx: create dmg with installer instead of zip

OS X would offer to expand the zip so the (multi file) installer inside it
could be run ... but that would leave the expanded zip folder around.

Instead, use a .dmg file that automatically will be mounted - that seems more
common on OS X.

Still, there is two levels of levels of clicking before actually launching the
installer. Having a single file installer would be better ... but seems to be
hard. A more feasible improvement would be some fancy layout inside the .dmg .
Mads Kiilerich
osx: install dummy web.cacerts to enable use of system keychain

On Mac OS X 10.6 and higher, OpenSSL (which is what Python and therefore
Mercurial use to implement their SSL support) will look in the system keychain.
Unfortunately, the SSL code in the Python core doesn't allow for this
situation---it always expects you to specify a certificate bundle, and if one
is specified if must contain at least one certificate.

The ship a pem file with a certificate the expired before it began so it can't
contain any backdoor.
Pierre-Yves David
branchmap: pre-filter topological heads before ancestors based filtering

We know that topological heads will not be ancestors of anything, so we filter
them out to potentially reduce the range of the ancestors computation.

On a strongly headed repo this gives humble speedup:

    from 0.1984 to 0.1629
Pierre-Yves David
branchmap: issue a single call to `ancestors` for all heads

There is no reason to make multiple calls. This provides a massive speedup for
repo with a lot of heads.

On a strongly headed repo this gives humble speedup in simple case:

    from 8.1097 to 5.1051

And massive speedup in other case:

    from 7.8787 to 0.1984
Pierre-Yves David
test-ancestor: add a test for `ancestor` with ancestry within the initset

I was wondering if revisions in the initial set that are still ancestors of other
elements in the initial set were yielded by `changelog.ancestors`. I now have my
answer (they do) and Mercurial has a new test.
Pierre-Yves David
bundle2: pull obsmarkers relevant to the pulled set through bundle2

We use the new `obsheads` argument to retrieve them in a bundle2 part at the
same time as the changegroup.
Pierre-Yves David
getbundle: add `obsmarkers` argument to getbundle

This argument triggers the retrieval of all markers relevant to the set of
changesets defined by the nodes in `heads`.
Pierre-Yves David
pull: use the "cg" argument when pulling a bundle2

We use the `cg` argument to disable the generation of a changegroup part. This
is useful to pull information when changesets are already in sync (phases,
obsmarkers).
Pierre-Yves David
wireprotocol: fix 'boolean' handling

The encoding and decoding code were swapped. This is now fixed.
Pierre-Yves David
push: only push obsmarkers relevant to the "pushed subset"

We should only exchange obsolete markers related to the changesets
that are being exchanged. For example, if `A'` is a successor of `A`,
we do not want to push the marker if we are not exchanging
`A'`. Otherwise `A` would disappear without a successor, leading to confusion
for both users and the evolution mechanism.

Therefore we now exchange only the markers relevant to the subset of nodes
involved in the push (the nodes themselves may be already common but were
selected by --rev (or the lack of --rev)).

Note that all selected markers are still exchanged on each push. We do
not have a discovery protocol for markers in core yet. Such discovery
would save us the exchange of markers known on both side.
Pierre-Yves David
test-obsolete: sort the output of debugobsolete

The set of relevant markers is currently unordered. Therefore the
markers will be added in arbitrary order. We sort the list of markers
beforehand to ensure stable output for testing.
Pierre-Yves David
test-obsolete: change a marker so it is relevant to the exchanged set

We are going to only exchange markers relevant to the exchanged
changesets. So we need to change this marker to use a known changeset as
a successor instead of a precursor.
Pierre-Yves David
push: use bundle2 to push obsmarkers when possible
Pierre-Yves David
exchange: add a `buildobsmarkerpart` function

We'll have to build an obsmarker part for both push and pull. So we build a
function to factor out the common part.
Pierre-Yves David
obsolete: add a `commonversion` function

This function returns the highest common version between the locally known
formats and a list of remotely known formats. This is going to be useful to
know what format should be used for exchange.