Thu, 20 Dec 2012 19:22:12 +0100 hgweb, paper: add (Atom) subscribe links to the repository index
Angel Ezquerra <angel.ezquerra@gmail.com> [Thu, 20 Dec 2012 19:22:12 +0100] rev 18201
hgweb, paper: add (Atom) subscribe links to the repository index This is similar to the subscribe links that already exist in other templates. Rather than the usual RSS and Atom links a single feed icon linking to the atom-log is shown.
Tue, 04 Dec 2012 00:41:29 +0100 hgweb: add (Atom) subscribe link to the main paper template pages
Angel Ezquerra <angel.ezquerra@gmail.com> [Tue, 04 Dec 2012 00:41:29 +0100] rev 18200
hgweb: add (Atom) subscribe link to the main paper template pages The subscribe link is found at the bottom of the navigation sidebar. This uses a free icon from http://feedicons.com.
Mon, 31 Dec 2012 21:50:35 -0600 test-command-template.t: fix test so it all year stable
Augie Fackler <raf@durin42.com> [Mon, 31 Dec 2012 21:50:35 -0600] rev 18199
test-command-template.t: fix test so it all year This test started failing for me after midnight UTC on December 31st. Fixed it by specifying a date 7 years in the future more precisely (rather than just adding 8 to the year and specifying January 1st), which allows the test to pass both now and on 2012-12-01 at the same time.
Sun, 30 Dec 2012 03:49:15 +0100 amend: prevent loss of bookmark on failed amend stable
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Sun, 30 Dec 2012 03:49:15 +0100] rev 18198
amend: prevent loss of bookmark on failed amend The active bookmark were moved to the temporary commit. When the transaction were rollbacked, the bookmark were lost. We now temporarly disable the bookmark to prevent this effect.
Sat, 29 Dec 2012 18:00:18 +0100 amend: invalidate dirstate in case of failure (issue3670) stable
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Sat, 29 Dec 2012 18:00:18 +0100] rev 18197
amend: invalidate dirstate in case of failure (issue3670) The temporary commit created by amend update the dirstate. If the final commit fails, we need to invalidate the change made to the dirstate, otherwise the release of the wlock will write the dirstate created after the rollbacked temporary commit. This dirstate writing logic should probably be handled in the same object than the transaction one. However such change are too big for stable.
Sat, 24 Nov 2012 01:40:39 +0400 i18n-ru: delete loose letter stable
Nikolaj Sjujskij <sterkrig@myopera.com> [Sat, 24 Nov 2012 01:40:39 +0400] rev 18196
i18n-ru: delete loose letter
Thu, 27 Dec 2012 07:32:51 +0000 i18n-ru: synchonized with 777084ac8416 stable
Alexander Sauta <demosito@gmail.com> [Thu, 27 Dec 2012 07:32:51 +0000] rev 18195
i18n-ru: synchonized with 777084ac8416
Thu, 20 Dec 2012 16:36:45 -0600 paper: sanity-check page feed links stable
Matt Mackall <mpm@selenic.com> [Thu, 20 Dec 2012 16:36:45 -0600] rev 18194
paper: sanity-check page feed links filelog has feeds in header, but not in menu bar help has header feeds pointing to tags
Sun, 30 Dec 2012 19:19:52 +0100 zeroconf: use port from server instead of picking port from config (issue3746) stable
Benoit Boissinot <benoit.boissinot@ens-lyon.org> [Sun, 30 Dec 2012 19:19:52 +0100] rev 18193
zeroconf: use port from server instead of picking port from config (issue3746) In order to get the port, wrap create server instead of hgweb_mod/hgwebdir_mod.
Thu, 20 Dec 2012 15:52:23 -0600 scmutil: don't try to match modes on filesystems without modes (issue3740) stable
Matt Mackall <mpm@selenic.com> [Thu, 20 Dec 2012 15:52:23 -0600] rev 18192
scmutil: don't try to match modes on filesystems without modes (issue3740)
Sat, 22 Dec 2012 18:11:51 -0600 hgwebdir: honor web.templates and web.static for static files (issue3734) stable
Matt Mackall <mpm@selenic.com> [Sat, 22 Dec 2012 18:11:51 -0600] rev 18191
hgwebdir: honor web.templates and web.static for static files (issue3734)
Sun, 30 Dec 2012 19:19:52 +0100 zeroconf: use port from server instead of picking port from config (issue3746)
Benoit Boissinot <benoit.boissinot@ens-lyon.org> [Sun, 30 Dec 2012 19:19:52 +0100] rev 18190
zeroconf: use port from server instead of picking port from config (issue3746) In order to get the port, wrap create server instead of hgweb_mod/hgwebdir_mod.
Mon, 24 Dec 2012 03:21:15 +0100 branchmap: enable caching for filtered version too
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Mon, 24 Dec 2012 03:21:15 +0100] rev 18189
branchmap: enable caching for filtered version too The `_branchcache` attribute is turned into a dictionary. Key are filter name and value is a `branchcache` object. Unfiltered version is cached as `None` filter. The attribute is renamed to `_branchcaches` to avoid confusion with the previous one. Both old and new contents are dictionary even if their contents are different. I prefer possible extension code to crash right away instead of just messing the wrong dictionary. As all different caches work isolated to each other, this code keeps the previous behavior of using the unfiltered cache we nothing is filtered. This is a cheap way to have cache collaborate and nullify potential impact in the default case.
Tue, 01 Jan 2013 21:27:13 +0100 branchmap: report filtername when read fails
Pierre-Yves David <pierre-yves.david@logilab.fr> [Tue, 01 Jan 2013 21:27:13 +0100] rev 18188
branchmap: report filtername when read fails Now that we can have multiple one, we need to know which filecache failed to be read from disk.
Mon, 24 Dec 2012 03:06:03 +0100 branchmap: use a different file name for filtered view of repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Mon, 24 Dec 2012 03:06:03 +0100] rev 18187
branchmap: use a different file name for filtered view of repo
Mon, 24 Dec 2012 03:05:02 +0100 clfilter: ensure unfiltered repo have a filtername attribute too
Pierre-Yves David <pierre-yves.david@logilab.fr> [Mon, 24 Dec 2012 03:05:02 +0100] rev 18186
clfilter: ensure unfiltered repo have a filtername attribute too That will allows to use `repo.filtername` for dispatch purpose.
Mon, 24 Dec 2012 03:04:12 +0100 branchmap: move the cache file name into a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Mon, 24 Dec 2012 03:04:12 +0100] rev 18185
branchmap: move the cache file name into a dedicated function Filtered view of the repo will want to write they file name in a different file.
Tue, 01 Jan 2013 18:19:24 +0100 branchmap: read and write key part related to filtered revision
Pierre-Yves David <pierre-yves.david@logilab.fr> [Tue, 01 Jan 2013 18:19:24 +0100] rev 18184
branchmap: read and write key part related to filtered revision Now that we have a third part for the cache key we need to write and read it on disk. It is only written when there is filtered revision. This keep the format compatible with older version. Notes that, at this state, filtered repository does not use any disk caches yet.
Tue, 01 Jan 2013 13:05:22 -0600 check-code: disallow defunct <> operator
Augie Fackler <raf@durin42.com> [Tue, 01 Jan 2013 13:05:22 -0600] rev 18183
check-code: disallow defunct <> operator Added a test for that and one other python3 check in test-check-code.t.
Tue, 01 Jan 2013 13:04:40 -0600 largefiles: stop using <> operator in favor of !=
Augie Fackler <raf@durin42.com> [Tue, 01 Jan 2013 13:04:40 -0600] rev 18182
largefiles: stop using <> operator in favor of != <> has been deprecated for a while, and != is futureproof
Tue, 01 Jan 2013 13:18:33 -0600 commands: fix implicit tuple that is invalid syntax in Python3
Augie Fackler <raf@durin42.com> [Tue, 01 Jan 2013 13:18:33 -0600] rev 18181
commands: fix implicit tuple that is invalid syntax in Python3
Tue, 01 Jan 2013 12:58:21 -0600 check-code: disallow two-argument form of raise
Augie Fackler <raf@durin42.com> [Tue, 01 Jan 2013 12:58:21 -0600] rev 18180
check-code: disallow two-argument form of raise Using this old form makes any attempt to port to Python 3 harder, and the new syntax is supported in 2.4 already.
Tue, 01 Jan 2013 13:25:07 -0600 httpclient: apply change df9aea1def3e: remove use of two-argument raise
Augie Fackler <raf@durin42.com> [Tue, 01 Jan 2013 13:25:07 -0600] rev 18179
httpclient: apply change df9aea1def3e: remove use of two-argument raise
Tue, 01 Jan 2013 13:21:15 -0600 test-symlink-os-yes-fs-no.py: clean up use of two-argument raise
Augie Fackler <raf@durin42.com> [Tue, 01 Jan 2013 13:21:15 -0600] rev 18178
test-symlink-os-yes-fs-no.py: clean up use of two-argument raise This makes any attempt to port to Python 3 harder, and the new syntax is supported in 2.4 already.
Tue, 01 Jan 2013 12:51:00 -0600 scmutil: clean up use of two-argument raise
Augie Fackler <raf@durin42.com> [Tue, 01 Jan 2013 12:51:00 -0600] rev 18177
scmutil: clean up use of two-argument raise This makes any attempt to port to Python 3 harder, and the new syntax is supported in 2.4 already.
Tue, 01 Jan 2013 12:50:46 -0600 url: clean up use of two-argument raise
Augie Fackler <raf@durin42.com> [Tue, 01 Jan 2013 12:50:46 -0600] rev 18176
url: clean up use of two-argument raise This makes any attempt to port to Python 3 harder, and the new syntax is supported in 2.4 already.
Tue, 01 Jan 2013 12:50:23 -0600 win32: clean up use of two-argument raise
Augie Fackler <raf@durin42.com> [Tue, 01 Jan 2013 12:50:23 -0600] rev 18175
win32: clean up use of two-argument raise This makes any attempt to port to Python 3 harder, and the new syntax is supported in 2.4 already.
Tue, 01 Jan 2013 12:50:04 -0600 commandserver: clean up use of two-argument raise
Augie Fackler <raf@durin42.com> [Tue, 01 Jan 2013 12:50:04 -0600] rev 18174
commandserver: clean up use of two-argument raise This makes any attempt to port to Python 3 harder, and the new syntax is supported in 2.4 already.
Mon, 31 Dec 2012 21:50:35 -0600 test-command-template.t: fix test so it all year
Augie Fackler <raf@durin42.com> [Mon, 31 Dec 2012 21:50:35 -0600] rev 18173
test-command-template.t: fix test so it all year This test started failing for me after midnight UTC on December 31st. Fixed it by specifying a date 7 years in the future more precisely (rather than just adding 8 to the year and specifying January 1st), which allows the test to pass both now and on 2012-12-01 at the same time.
Fri, 28 Dec 2012 16:25:12 -0800 cmdutil: make getgraphlogrevs limit-aware
Siddharth Agarwal <sid0@fb.com> [Fri, 28 Dec 2012 16:25:12 -0800] rev 18172
cmdutil: make getgraphlogrevs limit-aware For a repository with over 400,000 changesets, this speeds up graphlog with a small limit by around 0.05 seconds (~50%).
Fri, 28 Dec 2012 16:25:00 -0800 cmdutil: stop pretending we can calculate revs for graphlog lazily
Siddharth Agarwal <sid0@fb.com> [Fri, 28 Dec 2012 16:25:00 -0800] rev 18171
cmdutil: stop pretending we can calculate revs for graphlog lazily cmdutil.getgraphlogrevs does a ton of work trying to build a graphlog lazily, and then cmdutil.graphlog comes along and destroys all of that. graphmod.dagwalker requires that it be given the full list of revs upfront so that it can perform filtering and tests against known revs. For a repository with over 400,000 changesets, this speeds up graphlog by around 0.02 seconds (~20% with a small limit).
Fri, 28 Dec 2012 16:24:36 -0800 cmdutil: store a local ref to repo.hiddenrevs in getgraphlogrevs
Siddharth Agarwal <sid0@fb.com> [Fri, 28 Dec 2012 16:24:36 -0800] rev 18170
cmdutil: store a local ref to repo.hiddenrevs in getgraphlogrevs On a repository with over 400,000 changesets, this speeds graphlog up by around 0.03 seconds (~20% with a small limit).
Fri, 28 Dec 2012 14:46:58 -0800 cmdutil: make getgraphlogrevs return revs in descending order
Siddharth Agarwal <sid0@fb.com> [Fri, 28 Dec 2012 14:46:58 -0800] rev 18169
cmdutil: make getgraphlogrevs return revs in descending order
Mon, 31 Dec 2012 18:11:18 -0600 branchmap: takes filtered revision in account for cache calculation
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Mon, 31 Dec 2012 18:11:18 -0600] rev 18168
branchmap: takes filtered revision in account for cache calculation Tracking tipnode and tiprev is not enough to ensure validaty of the cache as they do not help distinguish a cache that ignored various revisions below tiprev. To detect such difference, we build a hash of all ignored revisions. This hash is then used when checking the validity of a cache for a repo.
Mon, 24 Dec 2012 02:57:23 +0100 branchmap: improve computation of target tip
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Mon, 24 Dec 2012 02:57:23 +0100] rev 18167
branchmap: improve computation of target tip With revision filtering the effective revision number of "tip" may be lower than: len(changelog) - 1 We now use a more correct version preventing useless writing on disk in some case.
Fri, 28 Dec 2012 00:13:32 +0100 branchmap: improve invalid cache message when reading
Pierre-Yves David <pierre-yves.david@logilab.fr> [Fri, 28 Dec 2012 00:13:32 +0100] rev 18166
branchmap: improve invalid cache message when reading This factors out the generation of the message. This helps future error reporting when reading cache for filtered repository.
Mon, 31 Dec 2012 17:46:22 -0600 histedit: allow operation from non-head if obsolete is enabled
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Mon, 31 Dec 2012 17:46:22 -0600] rev 18165
histedit: allow operation from non-head if obsolete is enabled Obsolescence markers can represent this situation just fine. Rewritten revisions are marked as precursors of the ones creates by histedit. Unaffected descendants become "unstable". If obsolescence is not enabled we keep the current behavior of aborting. This new behavior only applies when obsolete is enabled and is subject to future discussion and changes.
Mon, 31 Dec 2012 17:45:52 -0600 rebase: allow non-head rebase-set when obsolete is enabled
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Mon, 31 Dec 2012 17:45:52 -0600] rev 18164
rebase: allow non-head rebase-set when obsolete is enabled Obsolescence markers can represent this situation just fine. Rebased revisions are marked as precursors of the ones create by rebase. Unrebased descendants becomes "unstable". If obsolescence is not enabled we keep the current behavior of aborting. This new behavior only applies when obsolete is enabled and is subject to future discussion and changes.
Mon, 31 Dec 2012 17:44:18 -0600 amend: allow amend of non-head when obsolete is enabled
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Mon, 31 Dec 2012 17:44:18 -0600] rev 18163
amend: allow amend of non-head when obsolete is enabled Obsolescence marker can represent this situation just fine. The old version is marked as precursor of the new changeset. All its descendants become "unstable". If obsolescence is not enabled we keep the current behavior of aborting. This new behavior only applies when obsolete is enabled and is subject to future discussion and changes.
Fri, 21 Dec 2012 22:58:59 +0100 obsolete: factorise troubles detection during push
Pierre-Yves David <pierre-yves.david@logilab.fr> [Fri, 21 Dec 2012 22:58:59 +0100] rev 18162
obsolete: factorise troubles detection during push The use of the two methods introduced earlier allows a factorisation of the push code preventing push of troubled changeset.
Mon, 17 Dec 2012 15:17:54 +0100 obsolete: introduce a troubles method on context
Pierre-Yves David <pierre-yves.david@logilab.fr> [Mon, 17 Dec 2012 15:17:54 +0100] rev 18161
obsolete: introduce a troubles method on context A troubled changeset may be affected by multiple trouble at the same time. This new method returns a list of all troubles affecting a changes.
Mon, 17 Dec 2012 15:06:15 +0100 obsolete: introduce a troubled method on context
Pierre-Yves David <pierre-yves.david@logilab.fr> [Mon, 17 Dec 2012 15:06:15 +0100] rev 18160
obsolete: introduce a troubled method on context Allows to quickly check if a changeset is affected by any troubles. (troubles are: unstable, bumped and divergent)
Fri, 28 Dec 2012 14:22:24 +0100 tests: fix windows test failures
Mads Kiilerich <madski@unity3d.com> [Fri, 28 Dec 2012 14:22:24 +0100] rev 18159
tests: fix windows test failures
Fri, 28 Dec 2012 14:13:06 +0100 merge with stable
Mads Kiilerich <madski@unity3d.com> [Fri, 28 Dec 2012 14:13:06 +0100] rev 18158
merge with stable
Fri, 28 Dec 2012 14:10:35 +0100 tests: fix windows test failures stable
Mads Kiilerich <madski@unity3d.com> [Fri, 28 Dec 2012 14:10:35 +0100] rev 18157
tests: fix windows test failures
Thu, 13 Dec 2012 19:19:06 +0100 largefiles: better test coverage of wireproto and the http protocol
Mads Kiilerich <madski@unity3d.com> [Thu, 13 Dec 2012 19:19:06 +0100] rev 18156
largefiles: better test coverage of wireproto and the http protocol
Thu, 13 Dec 2012 19:19:06 +0100 largefiles: cleanup of warnings on errors getting largefiles
Mads Kiilerich <madski@unity3d.com> [Thu, 13 Dec 2012 19:19:06 +0100] rev 18155
largefiles: cleanup of warnings on errors getting largefiles Especially the "no default or default-push path set in hgrc" was often very misleading and didn't give any hint where it actually was looking. A long error messages is better than several multi-line messages.
Thu, 13 Dec 2012 19:19:06 +0100 largefiles: remove trivial portability wrappers
Mads Kiilerich <madski@unity3d.com> [Thu, 13 Dec 2012 19:19:06 +0100] rev 18154
largefiles: remove trivial portability wrappers
Thu, 13 Dec 2012 19:19:06 +0100 largefiles: remove reporemove portability wrapper
Mads Kiilerich <madski@unity3d.com> [Thu, 13 Dec 2012 19:19:06 +0100] rev 18153
largefiles: remove reporemove portability wrapper
Thu, 13 Dec 2012 19:19:06 +0100 largefiles: remove findoutgoing portability wrapper
Mads Kiilerich <madski@unity3d.com> [Thu, 13 Dec 2012 19:19:06 +0100] rev 18152
largefiles: remove findoutgoing portability wrapper
Thu, 13 Dec 2012 19:19:06 +0100 largefiles: use constant for '.hglf/'
Mads Kiilerich <madski@unity3d.com> [Thu, 13 Dec 2012 19:19:06 +0100] rev 18151
largefiles: use constant for '.hglf/' Problem: '.hglf' + '/' was computed in some tight loops. There is no need for that.
Thu, 13 Dec 2012 19:19:06 +0100 largefiles: use plain wjoin instead of the complex pathto
Mads Kiilerich <madski@unity3d.com> [Thu, 13 Dec 2012 19:19:06 +0100] rev 18150
largefiles: use plain wjoin instead of the complex pathto
Fri, 28 Dec 2012 11:55:57 +0100 largefiles: unindent code
Mads Kiilerich <madski@unity3d.com> [Fri, 28 Dec 2012 11:55:57 +0100] rev 18149
largefiles: unindent code
Thu, 13 Dec 2012 19:19:06 +0100 largefiles: simplify lfdirstate ignore handling - it is only for tracking .hglf
Mads Kiilerich <madski@unity3d.com> [Thu, 13 Dec 2012 19:19:06 +0100] rev 18148
largefiles: simplify lfdirstate ignore handling - it is only for tracking .hglf
Thu, 13 Dec 2012 19:19:06 +0100 largefiles: rename 'admin' to more descriptive 'lfstoredir'
Mads Kiilerich <madski@unity3d.com> [Thu, 13 Dec 2012 19:19:06 +0100] rev 18147
largefiles: rename 'admin' to more descriptive 'lfstoredir'
Thu, 13 Dec 2012 19:19:06 +0100 largefiles: simplify lfutil.getstandinmatcher by inlining getmatcher
Mads Kiilerich <madski@unity3d.com> [Thu, 13 Dec 2012 19:19:06 +0100] rev 18146
largefiles: simplify lfutil.getstandinmatcher by inlining getmatcher
Thu, 13 Dec 2012 19:19:06 +0100 largefiles: remove overly complex handling of ignored and unknown files
Mads Kiilerich <madski@unity3d.com> [Thu, 13 Dec 2012 19:19:06 +0100] rev 18145
largefiles: remove overly complex handling of ignored and unknown files
Fri, 28 Dec 2012 11:55:57 +0100 largefiles: introduce basic debugstate --large functionality
Mads Kiilerich <madski@unity3d.com> [Fri, 28 Dec 2012 11:55:57 +0100] rev 18144
largefiles: introduce basic debugstate --large functionality Very useful for debugging largefiles "performance" issues. This is used for testing 03faf12fbee7.
Fri, 28 Dec 2012 11:55:57 +0100 util: fold ENOENT check into unlinkpath, controlled by new ignoremissing flag
Mads Kiilerich <madski@unity3d.com> [Fri, 28 Dec 2012 11:55:57 +0100] rev 18143
util: fold ENOENT check into unlinkpath, controlled by new ignoremissing flag Refactor a common pattern.
Fri, 28 Dec 2012 11:55:45 +0100 merge with stable
Mads Kiilerich <madski@unity3d.com> [Fri, 28 Dec 2012 11:55:45 +0100] rev 18142
merge with stable
Thu, 13 Dec 2012 19:19:06 +0100 largefiles: don't walk through all ignored files stable
Mads Kiilerich <madski@unity3d.com> [Thu, 13 Dec 2012 19:19:06 +0100] rev 18141
largefiles: don't walk through all ignored files Problem: 'hg status' with largefiles enabled would walk through all the files that .hgignore said should be ignored. That made it slow if a lot of files were .hgignored or the cache was cold. It seems like there was a reason to this, but other improvements has rendered this unnecessary. Solution: .hgignore is now only ignored when that is requested (--ignore). This is a minimal 'stable' change. There is room for other improvement.
Thu, 13 Dec 2012 19:19:06 +0100 largefiles revert: update lfdirstate with result from first cleanliness check stable
Mads Kiilerich <madski@unity3d.com> [Thu, 13 Dec 2012 19:19:06 +0100] rev 18140
largefiles revert: update lfdirstate with result from first cleanliness check Largefiles revert do for some reason have two lfdirstates and lfdirstatestatus invocations in one function. The result from the first lfdirstate check was however not written back to the lfdirstate, and some files was thus checked twice.
Thu, 13 Dec 2012 19:19:06 +0100 largefiles status: update lfdirstate with result from cleanliness check stable
Mads Kiilerich <madski@unity3d.com> [Thu, 13 Dec 2012 19:19:06 +0100] rev 18139
largefiles status: update lfdirstate with result from cleanliness check Problem: 'hg status' kept checking largefiles with an unknown state until some other command wrote the updated dirstate. Solution: Add missing lfdirstate.write().
Fri, 28 Dec 2012 11:16:01 +0100 bundlerepo: don't return the peer without bundlerepo from getremotechanges stable
Mads Kiilerich <madski@unity3d.com> [Fri, 28 Dec 2012 11:16:01 +0100] rev 18138
bundlerepo: don't return the peer without bundlerepo from getremotechanges Problem: getremotechanges would return the 'other' repo if nothing was incoming and there thus wasn't any bundle to base the repo on. The 'other' could be a http peer which only implement the functionality available over the http protocol. Transplant could thus fail with TypeError: argument of type 'httppeer' is not iterable Solution: Return the local repo instead of the remote peer if there is no reason to place a bundlerepo on top of the local repo.
Fri, 28 Dec 2012 00:02:40 +0100 strip: do not update branchcache during strip (issue3745)
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Fri, 28 Dec 2012 00:02:40 +0100] rev 18137
strip: do not update branchcache during strip (issue3745) At this moment, the cache is invalid, and will be thrown away. Later the strip function will call the `localrepo.destroyed` method that will update the branchmap cache.
Wed, 26 Dec 2012 15:04:07 -0800 copies: do not track backward copies, only renames (issue3739)
Siddharth Agarwal <sid0@fb.com> [Wed, 26 Dec 2012 15:04:07 -0800] rev 18136
copies: do not track backward copies, only renames (issue3739) The inverse of a rename is a rename, but the inverse of a copy is not a copy. Presenting it as such -- in particular, stuffing it into the same dict as real copies -- causes bugs because other code starts believing the inverse copies are real. The only test whose output changes is test-mv-cp-st-diff.t. When a backwards status -C command is run where a copy is involved, the inverse copy (which was hitherto presented as a real copy) is no longer displayed. Keeping track of inverse copies is useful in some situations -- composability of diffs, for example, since adding "a" followed by an inverse copy "b" to "a" is equivalent to a rename "b" to "a". However, representing them would require a more complex data structure than the same dict in which real copies are also stored.
Wed, 26 Dec 2012 15:03:58 -0800 copies: make debug messages more sensible
Siddharth Agarwal <sid0@fb.com> [Wed, 26 Dec 2012 15:03:58 -0800] rev 18135
copies: make debug messages more sensible The -> in debug messages is currently overloaded to mean both source to dest and dest to source. To fix this, we add explicit labels and make the arrow direction consistent.
Wed, 26 Dec 2012 14:50:17 -0800 copies: separate moves via directory renames from explicit copies
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.
Wed, 26 Dec 2012 11:16:18 -0600 merge with stable
Kevin Bullock <kbullock@ringworld.org> [Wed, 26 Dec 2012 11:16:18 -0600] rev 18133
merge with stable
Mon, 24 Dec 2012 02:49:59 +0100 branchmap: move validity logic in the object itself
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.
Sat, 22 Dec 2012 17:08:15 +0100 branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Sat, 22 Dec 2012 17:08:15 +0100] rev 18131
branchmap: make update a method
Mon, 24 Dec 2012 02:22:04 +0100 branchmap: make update responsible to update the cache key
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.
Sat, 22 Dec 2012 02:11:12 +0100 branchmap: factorise changelog access in update
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.
Thu, 20 Dec 2012 16:28:43 +0100 branchmap: make write a method on the branchmap object
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
Sat, 22 Dec 2012 02:04:49 +0100 branchmap: simplify write signature
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.
Sat, 22 Dec 2012 02:06:26 +0100 branchmap: add the tiprev (cache key) on the branchmap object
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.
Sat, 22 Dec 2012 01:59:05 +0100 branchmap: add the tipnode (cache key) on the branchcache object
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.
Sat, 22 Dec 2012 01:44:42 +0100 branchmap: store branchcache in a dedicated object
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.
Sat, 22 Dec 2012 01:34:23 +0100 branchmap: `stream_in` write remote branchcache to local one
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.
Mon, 24 Dec 2012 13:26:13 +0100 bookmarks: fix head selection for merge with two bookmarked heads stable
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
Thu, 20 Dec 2012 14:45:17 +0100 branchmap: extract updatebranchcache from repo
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 20 Dec 2012 14:45:17 +0100] rev 18121
branchmap: extract updatebranchcache from repo
Wed, 19 Dec 2012 14:49:06 +0100 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
Wed, 19 Dec 2012 14:47:38 +0100 branchmap: _updatebranchmap does not need to be filtered
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.
Wed, 19 Dec 2012 14:46:57 +0100 branchmap: extract read logic from repo
Pierre-Yves David <pierre-yves.david@logilab.fr> [Wed, 19 Dec 2012 14:46:57 +0100] rev 18118
branchmap: extract read logic from repo
Thu, 20 Dec 2012 13:37:37 +0100 branchmap: extract write logic from localrepo
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
Wed, 19 Dec 2012 14:43:33 +0100 branchmap: create a mercurial.branchmap module
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.
Thu, 20 Dec 2012 12:17:44 +0100 bundlerepo: use _cacheabletip mechanism in bundlerepo
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.
Thu, 20 Dec 2012 13:23:29 +0100 branchmap: merge _branchtags into updatebranchcache
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`.
Wed, 19 Dec 2012 17:39:49 +0100 branchmap: factorise access to changelog in 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`.
Thu, 20 Dec 2012 11:52:50 +0100 branchmap: simplify _branchtags using a new _cacheabletip method
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.
Thu, 20 Dec 2012 21:26:30 +0100 hook: disable demandimport before importing hooks
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).
Thu, 20 Dec 2012 15:18:41 +0100 test-pathencode: accept --seed parameter in hex as well
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.
Thu, 13 Dec 2012 23:37:53 +0100 subrepo: append subrepo path to subrepo error messages
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.
Thu, 20 Dec 2012 13:49:31 -0600 tests: fix some slash-based Windows failures
Kevin Bullock <kbullock@ringworld.org> [Thu, 20 Dec 2012 13:49:31 -0600] rev 18108
tests: fix some slash-based Windows failures
Thu, 20 Dec 2012 11:40:04 -0800 inotify: on Python < 2.6, socket.error lacks errno
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
Tue, 18 Dec 2012 01:51:08 +0100 hidden: invalidate hiddenrevs when needed
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`
Tue, 18 Dec 2012 02:04:37 +0100 cache: group obscache and revsfiltercache invalidation in a single function
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.
Mon, 17 Dec 2012 17:27:12 +0100 clfilter: use filtering in `visibleheads`
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.
Mon, 17 Dec 2012 17:42:34 +0100 clfilter: use filtering in `visiblebranchmap`
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.
Mon, 17 Dec 2012 17:12:02 +0100 clfilter: introduce a "unserver" filtering mode
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.
Thu, 20 Dec 2012 17:14:07 +0100 clfilter: add a cache on repo for set of revision to filter for a given set.
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.
Thu, 20 Dec 2012 15:32:42 +0100 clfilter: add actual repo filtering mechanism
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.
Wed, 19 Dec 2012 16:56:26 -0800 inotify: pacify pestiferous pyflakes precipitously
Bryan O'Sullivan <bos@serpentine.com> [Wed, 19 Dec 2012 16:56:26 -0800] rev 18099
inotify: pacify pestiferous pyflakes precipitously
Wed, 19 Dec 2012 10:45:40 -0800 tests: make test-inotify-issue1208.t disappear
Bryan O'Sullivan <bryano@fb.com> [Wed, 19 Dec 2012 10:45:40 -0800] rev 18098
tests: make test-inotify-issue1208.t disappear
Tue, 18 Dec 2012 17:15:13 -0800 posix: move server side of unix domain sockets out of inotify
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.
Tue, 18 Dec 2012 17:33:32 -0800 inotify: don't fall over just because of a dangling symlink
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.
Wed, 19 Dec 2012 10:40:34 -0800 test-inotify: test symlink indirection for unix sockets
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.)
Wed, 19 Dec 2012 10:02:43 +0100 test-pathencode: compare current pathencoding implementations
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.
Mon, 17 Dec 2012 20:51:21 -0800 rebase: use lazy ancestor membership testing
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.
Mon, 17 Dec 2012 20:43:37 -0800 localrepo: use lazy ancestor membership testing
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.
Tue, 18 Dec 2012 12:47:20 -0800 ancestor: add lazy membership testing to lazyancestors
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.
Tue, 18 Dec 2012 10:14:01 -0800 revlog: move ancestor generation out to a new class
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.
Mon, 17 Dec 2012 15:57:02 -0800 ignore: process hgignore files in deterministic order
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.
Mon, 17 Dec 2012 15:52:44 -0800 ignore: only read an ignore file once
Bryan O'Sullivan <bryano@fb.com> [Mon, 17 Dec 2012 15:52:44 -0800] rev 18088
ignore: only read an ignore file once
Mon, 17 Dec 2012 16:23:37 -0800 ignore: refactor ignore into two functions
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.
Mon, 10 Dec 2012 18:12:41 +0100 clfilter: fix `nodemap` usage in `getbundle`
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.
Mon, 17 Dec 2012 17:00:24 +0100 test: fix truncated comment in test
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.
Mon, 17 Dec 2012 18:09:41 +0100 clfilter: ensure context raise RepoLookupError when the revision is filtered
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.
Mon, 17 Dec 2012 15:08:37 -0800 revlog: remove incancestors since it is no longer used
Siddharth Agarwal <sid0@fb.com> [Mon, 17 Dec 2012 15:08:37 -0800] rev 18083
revlog: remove incancestors since it is no longer used
Mon, 17 Dec 2012 15:08:06 -0800 transplant: replace incancestors uses with ancestors
Siddharth Agarwal <sid0@fb.com> [Mon, 17 Dec 2012 15:08:06 -0800] rev 18082
transplant: replace incancestors uses with ancestors
(0) -10000 -3000 -1000 -120 +120 +1000 +3000 +10000 +30000 tip