Gregory Szorc <gregory.szorc@gmail.com> [Tue, 02 May 2017 16:19:04 -0700] rev 32233
setup: drop support for Python 2.6 (BC)
Per discussion on the mailing list and elsewhere, we've decided that
Python 2.6 is too old to continue supporting. We keep accumulating
hacks/fixes/workarounds for 2.6 and this is taking time away from
more important work.
So with this patch, we officially drop support for Python 2.6 and
require Python 2.7 to run Mercurial.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 06 May 2017 11:16:59 -0700] rev 32232
perf: move revlog construction and length calculation out of benchmark
We don't need to measure the time it takes to open the revlog or
calculate its length.
This is more consistent with what other perf* functions do.
While I was here, I also renamed the revlog variable from "r" to
"rl" - again in the name of consistency.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 06 May 2017 11:15:56 -0700] rev 32231
perf: clear revlog caches on every iteration
cmdutil.openrevlog() may return a cached revlog instance. This /may/
be a recent "regression" due to refactoring of the manifest API. I'm
not sure.
Either way, this perf command was broken for at least manifests because
subsequent invocations of the perf function would get cache hits from
previous invocations, invalidating results. In the extreme case,
testing the last revision in the revlog resulted in near-instantanous
execution of subsequent runs (since the fulltext is cached). A time
of ~1us would be reported in this case.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 06 May 2017 11:12:23 -0700] rev 32230
perf: don't convert rev to node before calling revlog.revision()
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 06 May 2017 12:12:53 -0700] rev 32229
revlog: rename _chunkraw to _getsegmentforrevs()
This completes our rename of internal revlog methods to
distinguish between low-level raw revlog data "segments" and
higher-level, per-revision "chunks."
perf.py has been updated to consult both names so it will work
against older Mercurial versions.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 06 May 2017 12:02:31 -0700] rev 32228
perf: store reference to revlog._chunkraw in a local variable
To prepare for renaming revlog._chunkraw, we stuff a reference to this
metho in a local variable. This does 2 things. First, it moves the
attribute lookup outside of a loop, which more accurately measures
the time of the code being invoked. Second, it allows us to alias
to different methods depending on their presence (perf.py needs to
support running against old Mercurial versions).
Removing an attribute lookup from a tigh loop appears to shift the
numbers slightly with mozilla-central:
$ hg perfrevlogchunks -c
! read
! wall 0.354789 comb 0.340000 user 0.330000 sys 0.010000 (best of 28)
! wall 0.335932 comb 0.330000 user 0.290000 sys 0.040000 (best of 30)
! read w/ reused fd
! wall 0.342326 comb 0.340000 user 0.320000 sys 0.020000 (best of 29)
! wall 0.332857 comb 0.340000 user 0.290000 sys 0.050000 (best of 30)
! read batch
! wall 0.023623 comb 0.020000 user 0.000000 sys 0.020000 (best of 124)
! wall 0.023666 comb 0.020000 user 0.000000 sys 0.020000 (best of 125)
! read batch w/ reused fd
! wall 0.023828 comb 0.020000 user 0.000000 sys 0.020000 (best of 124)
! wall 0.023556 comb 0.020000 user 0.000000 sys 0.020000 (best of 126)
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 06 May 2017 12:02:12 -0700] rev 32227
revlog: rename internal functions containing "chunk" to use "segment"
Currently, "chunk" is overloaded in revlog terminology to mean
multiple things. One of them refers to a segment of raw data from
the revlog. This commit renames various methods only used within
revlog.py to have "segment" in their name instead of "chunk."
While I was here, I also made the names more descriptive. e.g.
"_loadchunk()" becomes "_readsegment()" because it actually does
I/O.
Jun Wu <quark@fb.com> [Sat, 06 May 2017 16:36:24 -0700] rev 32226
fsmonitor: do not nuke dirstate filecache
In the future, chg may prefill repo's dirstate filecache so it's valuable
and should be kept. Previously we drop both filecache and property cache for
dirstate during fsmonitor reposetup, this patch changes it to only drop
property cache but keep the filecache.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 06 May 2017 11:01:02 -0700] rev 32225
perf: move gettimer() call
This is more consistent with other perf* functions.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 06 May 2017 10:59:38 -0700] rev 32224
perf: don't clobber startrev variable
Previously, the "startrev" argument would be ignored due to
"startrev = 0" in the benchmark function. This meant that
`hg perfrevlog` always started at revision 0.
Rename the local variable to "beginrev" so the variable does the
right thing.
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 05 May 2017 17:31:15 +0200] rev 32223
bundle: add optional 'tagsfnodecache' data to on disk bundle (
issue5543)
This should help performance when unbundling.
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 05 May 2017 17:28:52 +0200] rev 32222
bundle2: move tagsfnodecache generation in a generic function
This will help us reusing the logic for `hg bundle`.
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 05 May 2017 17:09:47 +0200] rev 32221
bundle: introduce an higher level function to write bundle on disk
The current function ('writebundle') is focussing on getting an existing
changegroup to disk. It is no easy ways to includes more part in the generated
bundle2. So we introduce a slightly higher level function that is fed the
'outgoing' object (that defines the bundled spec) and the bundlespec parameters
(to control the changegroup generation and inclusion of other parts).
This is creating the third logic dedicated to create a consistent bundle2 (the
other 2 are the push code and the getbundle code). We should probably reconcile
them at some points but they all takes different types of input. So we need to
introduce an intermediate "object" that each different input could be converted
to. Such unified "bundle2 specification" could be fed to some unified code.
We start by having the `hg bundle` related code on its own to helps defines its
specific needs first. Once the common and specific parts of each logic will be
known we can start unification.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 04 May 2017 21:47:03 +0200] rev 32220
bundle: handle compression earlier
We can also handle that part before starting any generation.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 04 May 2017 21:46:02 +0200] rev 32219
bundle: check changegroup version earlier
We can check if we know how to bundle this changegroup version before actually
starting to generate the changegroup.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 04 May 2017 21:44:36 +0200] rev 32218
bundle: check lack of revs to bundle before generating the changegroup
We already have the information so we can check it earlier.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 06 May 2017 23:00:57 -0400] rev 32217
extdiff: copy back files to the working directory if the size changed
In theory, it should be enough to pay attention only to the modification time
when detecting if a snapshotted working directory file changed. In practice,
BeyondCompare preserves all file attributes when syncing files at the directory
level. (If you open the file and sync individual hunks, then mtime does change,
and everything was being copied back as desired.) I'm not sure how many other
synchronization tools would trigger this issue, but it's annoyingly inconsistent
(if a single file is diffed, it isn't snapshotted, so the same BeyondCompare
file sync operation _is_ visible, because wdir() is updated in place.
I filed a bug with them, and they stated it is on their wish list, but won't be
fixed in the near term. This isn't a complete fix (there is still the case of
the size not changing), but this seems like a trivial enough change to fix most
of the problem. I suppose we could fool around with making files in the other
snapshot readonly, and copy back if we see the readonly bit copied. That seems
pretty hacky though, and only works if the external tool copies all attributes.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 06 May 2017 22:48:06 -0400] rev 32216
test-extdiff: enable a previously failing test on Windows
Matt Harbison <matt_harbison@yahoo.com> [Sat, 06 May 2017 19:11:59 -0400] rev 32215
test-extdiff: narrow the range of an '#if execbit' block
Now that output can be conditionalized, the few `chmod +x` specific outputs can
be conditionalized, and the rest of the tests run as normal. Disable one test
that is failing on Windows for now.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 06 May 2017 14:36:26 -0400] rev 32214
test-extdiff: deduplicate tests
Matt Harbison <matt_harbison@yahoo.com> [Sat, 06 May 2017 13:37:00 -0400] rev 32213
test-extdiff: fill in a missing Windows test
Yuya Nishihara <yuya@tcha.org> [Sat, 13 Aug 2016 17:21:58 +0900] rev 32212
policy: eliminate ".pure." from module name only if marked as dual
So we can switch cext/pure modules to new layout one by one.
Yuya Nishihara <yuya@tcha.org> [Fri, 12 Aug 2016 11:06:14 +0900] rev 32211
policy: add "cext" package which will host CPython extension modules
I'm going to restructure cext/pure modules and get rid of our hgimporter
hack. C extension modules will be moved to cext/ directory so old and new
compiled modules can coexist in development tree. This is necessary to
run 'hg bisect' without recompiling.
New extension modules will be loaded by an importer function:
base85 = policy.importmod('base85') # select pure.base85 or cext.base85
This will also allow us to split cffi from pure modules, which is currently
difficult because pure modules can't be imported by name.
Yuya Nishihara <yuya@tcha.org> [Tue, 02 May 2017 18:35:09 +0900] rev 32210
policy: mark all string literals as sysstr or bytes
The policy module won't be imported early in future, which means string
literals will be processed by our Python 3 loader.
Yuya Nishihara <yuya@tcha.org> [Wed, 26 Apr 2017 23:30:52 +0900] rev 32209
debuginstall: check C extensions only if they are loadable per policy
This check is useless in pure installation and I want to make it directly
import C extension modules.
Yuya Nishihara <yuya@tcha.org> [Wed, 26 Apr 2017 22:26:28 +0900] rev 32208
osutil: proxy through util (and platform) modules (API)
See the previous commit for why. Marked as API change since osutil.listdir()
seems widely used in third-party extensions.
The win32mbcs extension is updated to wrap both util. and windows. aliases.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Fri, 12 May 2017 21:46:14 +0900] rev 32207
win32mbcs: wrap underlying pycompat.bytestr to use checkwinfilename safely
win32mbcs wraps some functions, to prevent them from unintentionally
treating backslash (0x5c), which is used as the second or later byte
of multi bytes characters by problematic encodings, as a path
component delimiter on Windows platform.
This wrapping assumes that wrapped functions can safely accept unicode
string arguments.
Unfortunately,
d1937bdcee8c broke this assumption by introducing
pycompat.bytestr() into util.checkwinfilename() for py3 support. After
that, wrapped checkwinfilename() always fails for non-ASCII filename
at pycompat.bytestr() invocation.
This patch wraps underlying pycompat.bytestr() function to use
util.checkwinfilename() safely.
To avoid similar regression in the future, another patch series will
add smoke testing on default branch.
Pierre-Yves David <pierre-yves.david@octobus.net> [Tue, 09 May 2017 15:08:47 +0200] rev 32206
hghave: prefill more version of Mercurial
The previous code was unable to go above version 4.0.
Mads Kiilerich <madski@unity3d.com> [Thu, 11 May 2017 17:18:40 +0200] rev 32205
graft: fix graft across merges of duplicates of grafted changes
Graft used findmissingrevs to find the candidates for graft duplicates in the
destination. That function operates with the constraint:
1. N is an ancestor of some node in 'heads'
2. N is not an ancestor of any node in 'common'
For our purpose, we do however have to work correctly in cases where the graft
set has multiple roots or where merges between graft ranges are skipped. The
only changesets we can be sure doesn't have ancestors that are grafts of any
changeset in the graftset, are the ones that are common ancestors of *all*
changesets in the graftset. We thus need:
2. N is not an ancestor of all nodes in 'common'
This change will graft more correctly, but it will also in some cases make
graft slower by making it search through a bigger and unnecessary large sets of
changes to find duplicates. In the general case of grafting individual or
linear sets, we do the same amount of work as before.
Mads Kiilerich <madski@unity3d.com> [Tue, 09 May 2017 00:11:30 +0200] rev 32204
graft: test coverage of grafts and how merges can break duplicate detection
This demonstrates unfortunate behaviour: extending the graft range cause the
graft to behave differently. When the graft range includes a merge, we fail to
detect duplicates that are ancestors of the merge.