Siddharth Agarwal <sid0@fb.com> [Wed, 26 Dec 2012 14:50:17 -0800] rev 18134
copies: separate moves via directory renames from explicit copies
Currently the "copy" dict contains both explicit copies/moves made by a
context and pending moves that need to happen because the other context moved
the directory the file was in. For explicit copies, the dict stores a
destination to source map, while for pending moves via directory renames, it
stores a source to destination map. The merge code uses this fact in a non-
obvious way to differentiate between these two cases.
We make this explicit by storing these pending moves in a separate dict. The
dict still has a source to destination map, but that is called out in the
docstring.
Kevin Bullock <kbullock@ringworld.org> [Wed, 26 Dec 2012 11:16:18 -0600] rev 18133
merge with stable
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Mon, 24 Dec 2012 02:49:59 +0100] rev 18132
branchmap: move validity logic in the object itself
In several place, We check if a branchcache is still valid regarding the current
state of the repository. This changeset puts this logic in a method of the object
that can be reused when necessary.
A branch map is considered valid whenever it is up to date or a strict subset of
the repository state.
The change will help making branchcache aware of filtered revision.
The change in keyword is expected. the branch cache is actually invalid after
the amend. The previous check did not detected it.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Sat, 22 Dec 2012 17:08:15 +0100] rev 18131
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@logilab.fr> [Mon, 24 Dec 2012 02:22:04 +0100] rev 18130
branchmap: make update responsible to update the cache key
The update function have all necessary data to keep the branchcache key
up to date with its value.
This saves assignment to the cache key that each caller of update had to do by
hand.
The strip case is a bit more complicated to handles from inside the function but
I do not expect any impact.
Pierre-Yves David <pierre-yves.david@logilab.fr> [Sat, 22 Dec 2012 02:11:12 +0100] rev 18129
branchmap: factorise changelog access in update
This both improves readability and performance. Access to changelog of filtered
repository currently have a minor overhead.
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 20 Dec 2012 16:28:43 +0100] rev 18128
branchmap: make write a method on the branchmap object
Pierre-Yves David <pierre-yves.david@logilab.fr> [Sat, 22 Dec 2012 02:04:49 +0100] rev 18127
branchmap: simplify write signature
All necessary data (cache value and key) are now stored in the branchcache
object. Any extra parameter is superfluous.
Pierre-Yves David <pierre-yves.david@logilab.fr> [Sat, 22 Dec 2012 02:06:26 +0100] rev 18126
branchmap: add the tiprev (cache key) on the branchmap object
The actual cache key used on disk is the (tipnode, tiprev) pair. There is no
reason not to use the revision number for the in memory version.
Pierre-Yves David <pierre-yves.david@logilab.fr> [Sat, 22 Dec 2012 01:59:05 +0100] rev 18125
branchmap: add the tipnode (cache key) on the branchcache object
Gathering data and cache key paves the way to a lot of simplification.
Pierre-Yves David <pierre-yves.david@logilab.fr> [Sat, 22 Dec 2012 01:44:42 +0100] rev 18124
branchmap: store branchcache in a dedicated object
Value and key of branchcache would benefit from being hold by the same object.
Moreover some logic (update, write, validation) could be move on such object.
The creation of this object is the first step toward this move. The result will
clarify branchcache related code and hide most of the detail in the class
itself. This encapsulation will greatly helps implementation of branchcache for
filtered view of the repo.
Pierre-Yves David <pierre-yves.david@logilab.fr> [Sat, 22 Dec 2012 01:34:23 +0100] rev 18123
branchmap: `stream_in` write remote branchcache to local one
The previous code was writing it to a non existent `branchcache` attribute. We
now write is to the proper `_branchcache` attribute and initialize the
`_branchcachetip` at the same time.
We keep writing it to disk, the previous code had this part right.
Mads Kiilerich <mads@kiilerich.com> [Mon, 24 Dec 2012 13:26:13 +0100] rev 18122
bookmarks: fix head selection for merge with two bookmarked heads
A type mismatch caused the search for the other head to fail. The code is
fragile, and instead it ended up using the 'first' bookmark head, but the
ordering is undefined and it could thus randomly use the wrong bookmarkhead
and fail with:
$ hg up -q -C e@diverged
$ hg merge
abort: merging with a working directory ancestor has no effect
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 20 Dec 2012 14:45:17 +0100] rev 18121
branchmap: extract updatebranchcache from repo
Pierre-Yves David <pierre-yves.david@logilab.fr> [Wed, 19 Dec 2012 14:49:06 +0100] rev 18120
branchmap: extract _updatebranchcache from repo
Pierre-Yves David <pierre-yves.david@logilab.fr> [Wed, 19 Dec 2012 14:47:38 +0100] rev 18119
branchmap: _updatebranchmap does not need to be filtered
The `_updatebranchmap` method on repo does not need to be filtered as all
callers are already handling filtering themself.
The fact it is filtered may had even lead to buggy behaviors, but by chances the method
make very sparse use of the repo object.
Pierre-Yves David <pierre-yves.david@logilab.fr> [Wed, 19 Dec 2012 14:46:57 +0100] rev 18118
branchmap: extract read logic from repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Thu, 20 Dec 2012 13:37:37 +0100] rev 18117
branchmap: extract write logic from localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Wed, 19 Dec 2012 14:43:33 +0100] rev 18116
branchmap: create a mercurial.branchmap module
This is the foundation stone for an extraction of branches map logic from local
repository class. Most of the branches map logic have very few caller and
therefor does not fit in the current criteria for code held by the localrepo
class. Important change will be made to this code in relation with revision
filtering. So we extract it in a dedicated module before adding additional
complexity.
Follow up commit do the actual code movement.
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 20 Dec 2012 12:17:44 +0100] rev 18115
bundlerepo: use _cacheabletip mechanism in bundlerepo
Instead of preventing any cache write we allow writing cache for all content of
the original repo.
The motivation for this change is to drop the custom _writebranchcache of
bundlerepo to help extraction of the branchmap logic out of localrepo.
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 20 Dec 2012 13:23:29 +0100] rev 18114
branchmap: merge _branchtags into updatebranchcache
Now that nobody overwrite it, there is no reasons for `_branchtags` to remains
separated from `updatebranchcache`.
Pierre-Yves David <pierre-yves.david@logilab.fr> [Wed, 19 Dec 2012 17:39:49 +0100] rev 18113
branchmap: factorise access to changelog in updatebranchcache
This prepares merge of `updatebranchcache` and `_branchtags`.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Thu, 20 Dec 2012 11:52:50 +0100] rev 18112
branchmap: simplify _branchtags using a new _cacheabletip method
The current _branchtags method is a remnant of an older, much larger function.
Its only remaining role is to help MQ to alter the version of branchcache we
store on disk. As MQ mutates the repository it ensures persistent cache does not
contain anything it is likely to alter.
This changeset makes explicit the stable vs volatile part of repository and
reduces the MQ specific code to the computation of this limit. The main
_branchtags code now handles this possible limit in all cases.
This will help to extract the branchmap logic from the repository.
The new code of _branchtags is a bit duplicated, but as I expect major
refactoring of this section I'm not keen to setup factorisation function here.
Dirkjan Ochtman <dirkjan@ochtman.nl> [Thu, 20 Dec 2012 21:26:30 +0100] rev 18111
hook: disable demandimport before importing hooks
This solved an obscure bug for me. In upgrading Distribute on the server, a
patch was added to has a try: import a except ImportError thing that's only
supposed to work with Python 3.3. I'm using 2.7. My hook failed with an
ImportError because of this. It seems kind of sensible to turn off
demandimport before importing the hook, since the except ImportError pattern
is used quite a bit in Python code (including in other Distribute code).
Adrian Buehlmann <adrian@cadifra.com> [Thu, 20 Dec 2012 15:18:41 +0100] rev 18110
test-pathencode: accept --seed parameter in hex as well
test-pathencode.py outputs the seed value in hex if it finds a deviation.
This change allows to specify the seed value as a command line
parameter for test-pathencode.py in hex as well.
Angel Ezquerra <angel.ezquerra@gmail.com> [Thu, 13 Dec 2012 23:37:53 +0100] rev 18109
subrepo: append subrepo path to subrepo error messages
This change appends the subrepo path to subrepo errors. That is, when there
is an error performing an operation a subrepo, rather than displaying a message
such as:
pushing subrepo MYSUBREPO to PATH
searching for changes
abort: push creates new remote head HEADHASH!
hint: did you forget to merge? use push -f to force
mercurial will show:
pushing subrepo MYSUBREPO to PATH
searching for changes
abort: push creates new remote head HEADHASH! (in subrepo MYSUBREPO)
hint: did you forget to merge? use push -f to force
The rationale for this change is that the current error messages make it hard
for TortoiseHg (and similar tools) to tell the user which subrepo caused the
push failure.
The "(in subrepo MYSUBREPO)" message has been added to those subrepo methods
were it made sense (by using a decorator). We avoid appending "(in subrepo XXX)"
multiple times when subrepos are nexted by throwing a "SubrepoAbort" exception
after the extra message is appended. The decorator will then "ignore" (i.e. just
re-raise) the exception and never add the message again.
A small drawback of this method is that part of the exception trace is lost when
the exception is catched and re-raised by the annotatesubrepoerror decorator.
Also, because the state() function already printed the subrepo path when it
threw an error, that error has been changed to avoid duplicating the subrepo
path in the error message.
Note that I have also updated several subrepo related tests to reflect these
changes.
Kevin Bullock <kbullock@ringworld.org> [Thu, 20 Dec 2012 13:49:31 -0600] rev 18108
tests: fix some slash-based Windows failures
Bryan O'Sullivan <bryano@fb.com> [Thu, 20 Dec 2012 11:40:04 -0800] rev 18107
inotify: on Python < 2.6, socket.error lacks errno
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Tue, 18 Dec 2012 01:51:08 +0100] rev 18106
hidden: invalidate hiddenrevs when needed
The `hiddenrevs` cache is volatile too (It use content from `obscache`). When
unsure it is invalidated when necessary. In a near future, the cache will
probably be moved to `revsfiltercache`
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Tue, 18 Dec 2012 02:04:37 +0100] rev 18105
cache: group obscache and revsfiltercache invalidation in a single function
Both caches are very volatile and needs invalidation on the same kind of event.
revsfiltercache actually depends on the content of revsfiltercache.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Mon, 17 Dec 2012 17:27:12 +0100] rev 18104
clfilter: use filtering in `visibleheads`
This is the second real use of changelog filtering. The change is very small to
allow testing the new filter with a setup close to the original one.
We replace custom post processing on `heads`function by call to the standard
code pass on a filtering repo.
In later coming will have wider usage of filtering that will make the dedicated
function useless.
Pierre-Yves David <pierre-yves.david@logilab.fr> [Mon, 17 Dec 2012 17:42:34 +0100] rev 18103
clfilter: use filtering in `visiblebranchmap`
Here is the first real use of changelog filtering. The change is very small to
allow testing the new filter with a setup close to the original one.
We replace custom post processing on branchmap function by call to the
standard code pass on a filtering repo.
In later coming will have wider usage of filtering that will make the dedicated
function useless.
Pierre-Yves David <pierre-yves.david@logilab.fr> [Mon, 17 Dec 2012 17:12:02 +0100] rev 18102
clfilter: introduce a "unserver" filtering mode
This mode is for repository used as a server. It filter secret and hidden
changeset out.
It is put to use in later changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Thu, 20 Dec 2012 17:14:07 +0100] rev 18101
clfilter: add a cache on repo for set of revision to filter for a given set.
Recomputing the filtered revisions at every access to changelog is far too
expensive. This changeset introduce a cache for this information. This cache is
hold by the repository (unfiltered repository) and invalidated when necessary.
This cache is not a protected attribute (leading _) because some logic that
invalidate it is not held by the local repo itself.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Thu, 20 Dec 2012 15:32:42 +0100] rev 18100
clfilter: add actual repo filtering mechanism
We add a `filtered` method on repo. This method return an instance of `repoview`
that behaves exactly as the original repository but with a filtered changelog
attribute. Filters are identified by a "name". Planned filter are `unserved`,
`hidden` and `mutable`. Filtering the repository in place what out of question
as it wont not allows multiple thread to share the same repo. It would makes
control of the filtering scope harder too. See the `repoview` docstring for
details.
A mechanism to compute filtered revision is also installed. Some caches will be
installed in later commit.
Bryan O'Sullivan <bos@serpentine.com> [Wed, 19 Dec 2012 16:56:26 -0800] rev 18099
inotify: pacify pestiferous pyflakes precipitously
Bryan O'Sullivan <bryano@fb.com> [Wed, 19 Dec 2012 10:45:40 -0800] rev 18098
tests: make test-inotify-
issue1208.t disappear
Bryan O'Sullivan <bryano@fb.com> [Tue, 18 Dec 2012 17:15:13 -0800] rev 18097
posix: move server side of unix domain sockets out of inotify
We also turn the unix domain socket into a class, so that we have a
sensible place to hang its logically related attributes and behaviour.
We'll shortly want to reuse this in other code.
Bryan O'Sullivan <bryano@fb.com> [Tue, 18 Dec 2012 17:33:32 -0800] rev 18096
inotify: don't fall over just because of a dangling symlink
Previously, the inotify server failed to start if .hg/inotify.sock was
a symlink that pointed to a non-existent path. This behaviour does not
seem to make any sense.
Now, if we encounter a broken symlink, we unlink it and continue.
Bryan O'Sullivan <bryano@fb.com> [Wed, 19 Dec 2012 10:40:34 -0800] rev 18095
test-inotify: test symlink indirection for unix sockets
The inotify code performs a delicate dance to work around the 108-byte
limit on unix domain socket path names on Linux.
This change sets us up to safely refactor that code without breaking
it. (It is redundant with part of test-inotify-
issue1208.t, but we will
shortly make that test go away.)
Adrian Buehlmann <adrian@cadifra.com> [Wed, 19 Dec 2012 10:02:43 +0100] rev 18094
test-pathencode: compare current pathencoding implementations
We already have two implementations of the pathencoding (C and
Python) and this test can perfectly well be used to probabilistically
test them instead of just wasting CPU cycles and test time.
Siddharth Agarwal <sid0@fb.com> [Mon, 17 Dec 2012 20:51:21 -0800] rev 18093
rebase: use lazy ancestor membership testing
For a repository with over 400,000 commits, rebasing one revision near tip,
this avoids one walk up the DAG, speeding the operation up by around 0.8
seconds.
Siddharth Agarwal <sid0@fb.com> [Mon, 17 Dec 2012 20:43:37 -0800] rev 18092
localrepo: use lazy ancestor membership testing
For a repository with over 400,000 commits, rebasing one revision near tip,
this avoids two treks up the DAG, speeding the operation up by around 1.6
seconds.
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Dec 2012 12:47:20 -0800] rev 18091
ancestor: add lazy membership testing to lazyancestors
This also makes the perfancestorset command use lazy membership testing. In a
linear repository with over 400,000 commits, without this patch, hg
perfancestorset takes 0.80 seconds no matter how far behind we're looking.
With this patch, hg perfancestorset -- X takes:
Rev X Time
-1 0.00s
-4000 0.01s
-20000 0.04s
-80000 0.17s
-200000 0.43s
-300000 0.69s
0 0.88s
Thus, for revisions close to tip, we're up to several orders of magnitude
faster. At 0 we're around 10% slower.
Siddharth Agarwal <sid0@fb.com> [Tue, 18 Dec 2012 10:14:01 -0800] rev 18090
revlog: move ancestor generation out to a new class
This refactoring is to prepare for implementing lazy membership.
Bryan O'Sullivan <bryano@fb.com> [Mon, 17 Dec 2012 15:57:02 -0800] rev 18089
ignore: process hgignore files in deterministic order
Previously, we processed them in whatever order the dict iterator gave us.
Bryan O'Sullivan <bryano@fb.com> [Mon, 17 Dec 2012 15:52:44 -0800] rev 18088
ignore: only read an ignore file once
Bryan O'Sullivan <bryano@fb.com> [Mon, 17 Dec 2012 16:23:37 -0800] rev 18087
ignore: refactor ignore into two functions
This prepares us for eventually being able to hash the list of patterns
in use.
Pierre-Yves David <pierre-yves.david@logilab.fr> [Mon, 10 Dec 2012 18:12:41 +0100] rev 18086
clfilter: fix `nodemap` usage in `getbundle`
With the current implementation, `changelog.nodemap` is not filtered. So some
filtered changeset in common are not filtered by `n in nodemap`. This leads to
crash lower in the stack when the bundle generation try to access those node on
a filtered changelog.
Pierre-Yves David <pierre-yves.david@logilab.fr> [Mon, 17 Dec 2012 17:00:24 +0100] rev 18085
test: fix truncated comment in test
The push is made to ensure repository are related. The comment in the initial
changeset got truncated somehow.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Mon, 17 Dec 2012 18:09:41 +0100] rev 18084
clfilter: ensure context raise RepoLookupError when the revision is filtered
Currently the code path of `changectx(filteredrepo, rev)` call
`filteredrepo.changelog.node(rev)`. When `rev` is filtered this raise an
unhandled `IndexError`. This case now raise a `RepoLookupError` as other
error case do.
Siddharth Agarwal <sid0@fb.com> [Mon, 17 Dec 2012 15:08:37 -0800] rev 18083
revlog: remove incancestors since it is no longer used
Siddharth Agarwal <sid0@fb.com> [Mon, 17 Dec 2012 15:08:06 -0800] rev 18082
transplant: replace incancestors uses with ancestors
Siddharth Agarwal <sid0@fb.com> [Mon, 17 Dec 2012 15:13:51 -0800] rev 18081
revlog.ancestors: add support for including revs
This is in preparation for an upcoming refactoring. This also fixes a bug in
incancestors, where if an element of revs was an ancestor of another it would
be generated twice.
Siddharth Agarwal <sid0@fb.com> [Fri, 14 Dec 2012 10:23:18 -0800] rev 18080
perf: add command to test performance of membership in ancestor set
The new command, perfancestorset, takes an argument denoting which revset to
test the membership of.
Currently this runs through all the ancestors and converts them into a set.
The primary purpose of having this is to compare this approach, currently used
in several places, against the upcoming lazy approach.
Siddharth Agarwal <sid0@fb.com> [Tue, 11 Dec 2012 14:47:33 -0800] rev 18079
ancestor: move missingancestors doctest out into a separate file
This is in preparation for upcoming patches which will reuse the same graph
for tests.