Gábor Stefanik <gabor.stefanik@nng.com> [Mon, 03 Oct 2016 16:19:55 +0200] rev 30045
copies: limit is an optimization, and doesn't provide guarantees
Yuya Nishihara <yuya@tcha.org> [Sat, 01 Oct 2016 20:20:11 +0900] rev 30044
revset: do not rewrite ':y' to '0:y' (issue5385)
That's no longer valid since the revision 0 may be hidden. Bypass validating
the existence of '0' and filter it by spanset.
Yuya Nishihara <yuya@tcha.org> [Sat, 01 Oct 2016 20:11:48 +0900] rev 30043
revset: extract function that creates range set from computed revisions
So we can pass m=0 to _makerangeset() even if the revision 0 is hidden.
Hidden revisions are filtered by spanset.
Maciej Fijalkowski <fijall@gmail.com> [Mon, 12 Sep 2016 13:37:14 +0200] rev 30042
lazymanifest: write a more efficient, pypy friendly version of lazymanifest
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 02 Oct 2016 22:34:40 -0700] rev 30041
hg: set default path correctly when doing a clone+share (issue5378)
Before, if performing a clone+share from a repo that was itself
using shared storage, the share code would copy paths.default from
the underlying repo being shared, not from the source given by
the user.
This patch teaches hg.clonewithshare to resolve paths.default
and pass it to share so it can be written to the hgrc accordingly.
Jun Wu <quark@fb.com> [Sat, 01 Oct 2016 14:18:58 +0100] rev 30040
annotate: calculate line count correctly
Before this patch, the "lines" function inside "annotate" returns 1 for
empty text (''). This patch makes it 0. Because the function should match
mdiff.splitnewlines (used by mdiff.allblocks), or s.splitlines (used at the
end of the "annotate" method). Both len(mdiff.splitnewlines('')) and
len(''.splitlines(True)) are 0.
This issue was discovered while testing fastannotate [1].
I could not find a test case to reveal this issue. However in theory this
could reduce memory usage a little bit, and avoids surprises when people
are touching this area in the future.
[1]: https://bitbucket.org/facebook/hg-experimental/commits/525b3b98e93a
Pulkit Goyal <7895pulkit@gmail.com> [Sun, 02 Oct 2016 05:29:17 +0530] rev 30039
py3: use unicode in is_frozen()
imp.is_frozen() doesnot accepts bytes on Python 3.
It does accept both bytes and strings on Python 2.
Pulkit Goyal <7895pulkit@gmail.com> [Sun, 02 Oct 2016 03:38:14 +0530] rev 30038
py3: use unicodes in __slots__
__slots__ doesnot accepts bytes on Python 3.
Augie Fackler <augie@google.com> [Sat, 01 Oct 2016 15:10:38 -0400] rev 30037
merge with stable
Yuya Nishihara <yuya@tcha.org> [Fri, 30 Sep 2016 21:38:47 +0900] rev 30036
url: fix crash by empty path with #fragments
Before, "#foo" paths made hg crash. We've moved the #fragment parsing at
64fbd0de9773, but we shouldn't set path to None too early. This patch just
removes the "if not path:" block since that's checked a few lines later.
Yuya Nishihara <yuya@tcha.org> [Wed, 28 Sep 2016 20:07:32 +0900] rev 30035
py3: make i18n use encoding.environ
Yuya Nishihara <yuya@tcha.org> [Wed, 28 Sep 2016 20:05:34 +0900] rev 30034
py3: provide encoding.environ which is a dict of bytes
This can't be moved to pycompat.py since we need encoding.tolocal() to
build bytes dict from unicode os.environ.
Yuya Nishihara <yuya@tcha.org> [Wed, 28 Sep 2016 20:39:06 +0900] rev 30033
py3: convert encoding name and mode to str
Otherwise tolocal() and fromlocal() wouldn't work on Python 3. Still tolocal()
can't make a valid localstr object because localstr inherits str, but it can
return some object without raising exceptions.
Since Py3 bytes() behaves much like bytearray() than str() of Py2, we can't
simply do s/str/bytes/g. I have no good idea to handle str/bytes divergence.
Yuya Nishihara <yuya@tcha.org> [Wed, 28 Sep 2016 22:32:09 +0900] rev 30032
pycompat: extract function that converts attribute or encoding name to str
This will be used to convert encoding.encoding to a str acceptable by
Python 3 functions.
The source encoding is changed to "latin-1" because encoding.encoding can
have arbitrary bytes. Since valid names should consist of ASCII characters,
we don't care about the mapping of non-ASCII characters so long as invalid
names are distinct from valid names.
Yuya Nishihara <yuya@tcha.org> [Wed, 28 Sep 2016 20:01:23 +0900] rev 30031
pycompat: provide 'ispy3' constant
We compare version_info at several places, which seems enough to define
a constant.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Fri, 30 Sep 2016 00:27:35 +0200] rev 30030
extensions: add a note about debug output during extensions search
These messages do not show up when one use '--debug'. This is quite confusing so
we clarify the situation next to the 'ui.debug' call.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Fri, 30 Sep 2016 00:25:15 +0200] rev 30029
extensions: fix a debug message when searching for extensions
The "next" value was wrong. When 'hgext.NAME' is not found we now search for
'hgext3rd.NAME'.
Mateusz Kwapich <mitrandir@fb.com> [Tue, 30 Aug 2016 15:16:28 -0700] rev 30028
dirstate: rebuild should update dirstate properly
Updating dirstate by simply adding and dropping files from self._map doesn't
keep the other maps updated (think: _dirs, _copymap, _foldmap, _nonormalset)
thus introducing cache inconsistency.
This is also affecting the debugstate tests since now we don't even try to set
correct mode and mtime for the files because they are marked dirty anyway and
will be checked during next status call.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 27 Sep 2016 22:09:28 -0700] rev 30027
histedit: avoid converting nodeid to context and back again
It looks like this became unnecessary in e767f5aba810 (histedit: fix
preventing strips during histedit, 2015-04-04).
Augie Fackler <augie@google.com> [Tue, 13 Sep 2016 22:58:12 -0400] rev 30026
help: mark boolean flags with [no-] to explain that they can be negated
That is, help gets tweaked thus:
global options ([+] can be repeated):
-v --[no-]verbose enable additional output
Other proposals have included:
global options ([+] can be repeated, options marked [?] are boolean flags):
-v --verbose[?] enable additional output
and
global options ([+] can be repeated, options marked [^] are boolean flags):
-v --verbose[^] enable additional output
which avoid the unfortunate visual noise in this patch. In this
version's favor, it's consistent with what I'm used to seeing in man
pages and similar documentation venues.
Philippe Pepiot <philippe.pepiot@logilab.fr> [Tue, 27 Sep 2016 14:46:34 +0200] rev 30025
mdiff: remove unused parameter 'refine' from allblocks()
Yuya Nishihara <yuya@tcha.org> [Mon, 26 Sep 2016 23:28:57 +0900] rev 30024
demandimport: error out early on missing attribute of non package (issue5373)
If the parent module isn't a package, all valid attributes must be obtained
from it. We can raise ImportError early if any attributes not found.
Yuya Nishihara <yuya@tcha.org> [Tue, 27 Sep 2016 21:56:00 +0900] rev 30023
demandimport: add 'nt' to ignore list (issue5373)
pathlib2 tries to import nt. Since it is a built-in module, there should be
no performance penalty.
https://github.com/mcmtroffaes/pathlib2/blob/release/2.2.0/pathlib2.py#L33
Yuya Nishihara <yuya@tcha.org> [Tue, 27 Sep 2016 22:36:00 +0900] rev 30022
demandimport: add '_ctypes.pointer' to ignore list on PyPy
The pointer module is shadowed by a subsequent import. Our demand importer
can't handle this because both sub modules and attributes live in the same
namespace.
https://bitbucket.org/pypy/pypy/src/release-5.0.1/lib_pypy/_ctypes/__init__.py#__init__.py-5
Anton Shestakov <av6@dwimlabs.net> [Mon, 26 Sep 2016 16:12:40 +0800] rev 30021
hgweb: make anchor name actually match its href on help index page
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 24 Sep 2016 12:22:30 -0700] rev 30020
perf: add perfchangegroupchangelog command
This command can be used for testing the performance of producing the
changelog portion of a changegroup.
We could use additional perf* commands for testing other parts of
changegroup. Those can be written another time, when they are needed.
(And those may want to refactor the changegroup generation API so code
can be reused.) Speaking of code reuse, yes, this command does reinvent
a small wheel. I didn't want to scope bloat to change the changegroup
API because that will invite bikeshedding.
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 24 Sep 2016 10:44:37 -0700] rev 30019
perf: add --reverse to perfrevlog
It can be useful to know how fast we can read revisions from a revlog
in reverse. This operation tends to occur in `hg log` commands,
for example.
Yuya Nishihara <yuya@tcha.org> [Sat, 24 Sep 2016 19:58:23 +0900] rev 30018
log: copy the way of ancestor traversal to --follow matcher (issue5376)
We can't use fctx.linkrev() because follow() revset tries hard to simulate
the traversal of changelog DAG, not filelog DAG. This patch fixes
_makefollowlogfilematcher() to walk file ancestors in the same way as
revset._follow().
I'll factor out a common function in future patches.
Yuya Nishihara <yuya@tcha.org> [Sat, 24 Sep 2016 19:52:02 +0900] rev 30017
log: unroll loop that populates file paths for --patch --follow matcher
We can't handle the first fctx in the same manner as its ancestors. Also,
I think the original code was too tricky.
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 25 Sep 2016 12:20:31 -0700] rev 30016
wireproto: rename argument to groupchunks()
groupchunks() is a generic "turn a file object into a generator"
function. It isn't limited to changegroups. Rename the argument
and update the docstring to reflect this.
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 25 Sep 2016 13:20:55 -0700] rev 30015
tests: actually test non-generaldelta variant for stream clones
608cabec1b15 accidentally made both tests test generaldelta repos.
Restore the test for a non-gd repo.
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 24 Aug 2016 20:18:58 -0700] rev 30014
revlog: document high frequency of code execution
Recording my notes while working on performance optimization.
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 24 Aug 2016 20:00:52 -0700] rev 30013
revlog: make code in builddelta() slightly easier to read
self.compress() is destructured into its components. "l" is renamed
to "deltalen."
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com> [Fri, 23 Sep 2016 08:15:05 +0000] rev 30012
templates: add built-in files() function
We already support multiple primitive for listing files, which were
affected by the current changeset.
This patch adds files() which returns files of the current changeset
matching a given pattern or fileset query via the "set:" prefix.
Xidorn Quan <me@upsuper.org> [Sat, 17 Sep 2016 17:02:56 +1000] rev 30011
rebase: rebase changesets in topo order (issue5370) (BC)
There are two reasons that rebase should be done this way:
1. This would make rebasing faster because it would minimize the total
number of files to be checked out in the process, as it don't need
to switch back and forth between branches.
2. It makes resolving conflicts easier as user has a better context.
This commit changes the behavior in "Test multiple root handling" of
test-rebase-obsolete.t. It is an expected change which reflects the new
behavior that commits in a branch are grouped together when rebased.
Arun Kulshreshtha <kulshrax@fb.com> [Thu, 22 Sep 2016 12:36:30 -0700] rev 30010
dispatch: make hg --profile wrap reposetup
Move profiling.maybeprofile() from _runcommand to _dispatch() so that
profiler output will include reposetup.
Arun Kulshreshtha <kulshrax@fb.com> [Thu, 22 Sep 2016 12:19:48 -0700] rev 30009
dispatch: change indentation level in _dispatch()
Add an if True: placeholder for a profiling context manager that
will be added in the next commit, for the purpose of reducing size
of the diff due to trivial indentation changes.
This change should be a no-op.
Yuya Nishihara <yuya@tcha.org> [Thu, 22 Sep 2016 20:59:24 +0900] rev 30008
log: drop outdated optimization to walk revisions in reverse order
Since revset is computed lazily, there would be no (or little) benefit to
reverse 'revs' temporarily.
Yuya Nishihara <yuya@tcha.org> [Thu, 22 Sep 2016 20:53:53 +0900] rev 30007
graphlog: preserve topo sort even if additional filter options specified
Use ordered=revset.followorder instead. This change is logically the same
as fa5e4f58dfbc.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 22 Sep 2016 21:52:00 +0900] rev 30006
transaction: open a file with checkambig=True to avoid file stat ambiguity
Before this patch, if steps below occurs at "the same time in sec",
all of mtime, ctime and size are same between (1) and (3).
1. append data to revlog-style file (and close transaction)
2. discard appended data by truncation of rollback
3. append same size but different data to revlog-style file again
Therefore, cache validation doesn't work after (3) as expected.
To avoid file stat ambiguity around truncation, this patch opens a
file with checkambig=True.
This is a part of ExactCacheValidationPlan.
https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 22 Sep 2016 21:52:00 +0900] rev 30005
repair: open a file with checkambig=True to avoid file stat ambiguity
Before this patch, if steps below occurs at "the same time in sec",
all of mtime, ctime and size are same between (1) and (3).
1. append data to revlog-style file (and close transaction)
2. discard appended data by truncation of strip
3. append same size but different data to revlog-style file again
Therefore, cache validation doesn't work after (3) as expected.
To avoid such file stat ambiguity around truncation, this patch opens
a file with checkambig=True.
This patch also introduces "with" statement style, to ensure immediate
invocation of close() after truncation, because closing file is the
only trigger to check (and get rid of) file stat ambiguity.
This is a part of ExactCacheValidationPlan.
https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 22 Sep 2016 21:51:59 +0900] rev 30004
changelog: specify checkambig=True to revlog.__init__, to avoid ambiguity
If steps below occurs at "the same time in sec", all of mtime, ctime
and size are same between (1) and (3).
1. append data to 00changelog.i (and close transaction)
2. discard appended data by truncation (strip or rollback)
3. append same size but different data to 00changelog.i again
Therefore, cache validation doesn't work after (3) as expected.
To avoid such file stat ambiguity around truncation, this patch
specifies checkambig=True to revlog.__init__(). This makes revlog
write changes out with checkambig=True.
Even though changes of 00changelog.i themselves are written out at
changelog._finalize(), this checkambig=True is needed, because
revlog.checkinlinesize(), which is invoked at the end of
changelog._finalize(), might replace already changed 00changelog.i by
converted one.
Even after this patch, avoiding file stat ambiguity of 00changelog.i
around truncation isn't yet completed, because truncation side isn't
aware of this issue.
This is a part of ExactCacheValidationPlan.
https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 22 Sep 2016 21:51:59 +0900] rev 30003
changelog: specify checkambig=True to avoid ambiguity around truncation
If steps below occurs at "the same time in sec", all of mtime, ctime
and size are same between (1) and (3).
1. append data to 00changelog.i (and close transaction)
2. discard appended data by truncation (strip or rollback)
3. append same size but different data to 00changelog.i again
Therefore, cache validation doesn't work after (3) as expected.
To avoid such file stat ambiguity around truncation, this patch
specifies checkambig=True for renaming or opening to write changes out
at finalization.
Even after this patch, avoiding file stat ambiguity of 00changelog.i
around truncation isn't yet completed, because truncation side isn't
aware of this issue.
This is a part of ExactCacheValidationPlan.
https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 22 Sep 2016 21:51:58 +0900] rev 30002
manifest: specify checkambig=True to revlog.__init__, to avoid ambiguity
If steps below occurs at "the same time in sec", all of mtime, ctime
and size are same between (1) and (3).
1. append data to 00manifest.i (and close transaction)
2. discard appended data by truncation (strip or rollback)
3. append same size but different data to 00manifest.i again
Therefore, cache validation doesn't work after (3) as expected.
To avoid such file stat ambiguity around truncation, this patch
specifies checkambig=True to revlog.__init__(). This makes revlog
write changes out with checkambig=True.
Even after this patch, avoiding file stat ambiguity of 00manifest.i
around truncation isn't yet completed, because truncation side isn't
aware of this issue.
This is a part of ExactCacheValidationPlan.
https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 22 Sep 2016 21:51:58 +0900] rev 30001
revlog: specify checkambig at writing to avoid file stat ambiguity
This allows revlog-style files to be written out with checkambig=True
easily.
Because avoiding file stat ambiguity is needed only for filecache-ed
manifest and changelog, this patch does:
- use False for default value of checkambig
- focus only on writing changes of index file out
This patch also adds optional argument checkambig to _divert/_delay
for changelog, to safely accept checkambig specified in revlog
layer. But this argument can be fully ignored, because:
- changes are written into other than index file, if name != target
- changes are never written into index file, otherwise
(into pending file by _divert, or into in-memory buffer by _delay)
This is a part of ExactCacheValidationPlan.
https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 22 Sep 2016 21:51:57 +0900] rev 30000
vfs: use checkambigatclosing in checkambig=True but atomictemp=False case
In Mercurial source tree, opening a file in "a"/"a+" mode like below
doesn't specify atomictemp=True for vfs, and this avoids file stat
ambiguity check by atomictempfile.
- writing changes out in revlog layer uses "a+" mode
- truncation in repair.strip() uses "a" mode
- truncation in transaction._playback() uses "a" mode
If steps below occurs at "the same time in sec", all of mtime, ctime
and size are same between (1) and (3).
1. append data to revlog-style file (and close transaction)
2. discard appended data by truncation (strip or rollback)
3. append same size but different data to revlog-style file again
Therefore, cache validation doesn't work after (3) as expected.
This patch uses checkambigatclosing in checkambig=True but
atomictemp=False case, to check (and get rid of) file stat ambiguity
at closing.
This is a part of ExactCacheValidationPlan.
https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 22 Sep 2016 21:51:57 +0900] rev 29999
scmutil: add file object wrapper class to check ambiguity at closing
In Mercurial source tree, opening a file in "a"/"a+" mode like below
doesn't specify atomictemp=True for vfs, and this avoids file stat
ambiguity check by atomictempfile.
- writing changes out in revlog layer uses "a+" mode
- truncation in repair.strip() uses "a" mode
- truncation in transaction._playback() uses "a" mode
If steps below occurs at "the same time in sec", all of mtime, ctime
and size are same between (1) and (3).
1. append data to revlog-style file (and close transaction)
2. discard appended data by truncation (strip or rollback)
3. append same size but different data to revlog-style file again
Therefore, cache validation doesn't work after (3) as expected.
This patch adds file object wrapper class checkambigatclosing to check
(and get rid of) ambiguity at closing. It is used by vfs in subsequent
patch.
This is a part of ExactCacheValidationPlan.
https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan
BTW, checkambigatclosing is tested in test-filecache.py, even though
it doesn't use filecache itself, because filecache assumes that file
stat ambiguity never occurs (and there is no another test-*.py related
to filecache).
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Thu, 22 Sep 2016 21:51:56 +0900] rev 29998
scmutil: factor out common logic of delayclosedfile to reuse it
This is a preparation for the subsequent patch, which adds another
proxy class for a file object.
Anton Shestakov <av6@dwimlabs.net> [Thu, 22 Sep 2016 13:20:06 +0800] rev 29997
spartan: remove unused templates
Anton Shestakov <av6@dwimlabs.net> [Thu, 22 Sep 2016 13:19:44 +0800] rev 29996
monoblue: remove unused templates
Anton Shestakov <av6@dwimlabs.net> [Thu, 22 Sep 2016 13:19:25 +0800] rev 29995
gitweb: remove unused templates
Anton Shestakov <av6@dwimlabs.net> [Thu, 22 Sep 2016 13:18:59 +0800] rev 29994
paper: remove unused templates
timeless <timeless@mozdev.org> [Wed, 21 Sep 2016 17:05:27 -0400] rev 29993
help: add sections for revsets
timeless <timeless@mozdev.org> [Wed, 21 Sep 2016 17:23:05 +0000] rev 29992
help: move revsets.## documentation into infix section
timeless <timeless@mozdev.org> [Wed, 21 Sep 2016 16:33:37 +0000] rev 29991
help: clarify quotes are needed for filesets.size expressions
Anton Shestakov <av6@dwimlabs.net> [Wed, 21 Sep 2016 20:43:41 +0800] rev 29990
paper: remove unused template "changelogchild"
Anton Shestakov <av6@dwimlabs.net> [Wed, 21 Sep 2016 20:43:10 +0800] rev 29989
monoblue: remove unused template "changelogchild"
Anton Shestakov <av6@dwimlabs.net> [Wed, 21 Sep 2016 20:35:46 +0800] rev 29988
gitweb: remove unused template "changelogchild"
Anton Shestakov <av6@dwimlabs.net> [Wed, 21 Sep 2016 20:19:35 +0800] rev 29987
monoblue: tweak branch table's last row's cell colspan on summary page
This table only has 3 columns, so max sensible colspan is 3.
Anton Shestakov <av6@dwimlabs.net> [Wed, 21 Sep 2016 19:52:48 +0800] rev 29986
gitweb: tweak branch table's last row's cell colspan on summary page
This table only has 3 columns, so max sensible colspan is 3.
timeless <timeless@mozdev.org> [Wed, 21 Sep 2016 03:39:37 +0000] rev 29985
tests: clarify demandimport disabled state
timeless <timeless@mozdev.org> [Wed, 21 Sep 2016 02:46:59 +0000] rev 29984
demandimport: add trailing comma
timeless <timeless@mozdev.org> [Tue, 20 Sep 2016 23:49:20 +0000] rev 29983
tests: favor single quotes for wrapping hg help ...
timeless <timeless@mozdev.org> [Tue, 20 Sep 2016 23:49:00 +0000] rev 29982
samplehgrcs: use single quotes in use warning
timeless <timeless@mozdev.org> [Tue, 20 Sep 2016 23:48:30 +0000] rev 29981
util: use single quotes in use warning
timeless <timeless@mozdev.org> [Tue, 20 Sep 2016 23:48:19 +0000] rev 29980
obsolete: use single quotes in use warning
timeless <timeless@mozdev.org> [Tue, 20 Sep 2016 23:48:08 +0000] rev 29979
localrepo: use single quotes in use warning
timeless <timeless@mozdev.org> [Tue, 20 Sep 2016 23:47:46 +0000] rev 29978
help: use single quotes in use warning
timeless <timeless@mozdev.org> [Tue, 20 Sep 2016 23:47:30 +0000] rev 29977
discovery: use single quotes in use warning
timeless <timeless@mozdev.org> [Tue, 20 Sep 2016 23:47:02 +0000] rev 29976
serve: use single quotes in use warning
timeless <timeless@mozdev.org> [Tue, 20 Sep 2016 23:46:15 +0000] rev 29975
bundle: use single quotes in use warning
timeless <timeless@mozdev.org> [Tue, 20 Sep 2016 23:45:25 +0000] rev 29974
histedit: use single quotes in use warning
timeless <timeless@mozdev.org> [Tue, 20 Sep 2016 23:45:15 +0000] rev 29973
keyword: use single quotes in use warning
timeless <timeless@mozdev.org> [Tue, 20 Sep 2016 23:44:59 +0000] rev 29972
mq: use single quotes in use warning
timeless <timeless@mozdev.org> [Tue, 20 Sep 2016 23:44:49 +0000] rev 29971
pager: use single quotes in use warning
timeless <timeless@mozdev.org> [Tue, 20 Sep 2016 23:44:28 +0000] rev 29970
rebase: use single quotes in use warning
timeless <timeless@mozdev.org> [Tue, 20 Sep 2016 20:12:38 +0000] rev 29969
push: update help hint to point to config.paths section
timeless <timeless@mozdev.org> [Fri, 02 Sep 2016 21:49:33 +0000] rev 29968
update: use single quotes in use warning
timeless <timeless@mozdev.org> [Fri, 02 Sep 2016 21:46:00 +0000] rev 29967
remove: specify hg in added warning
Durham Goode <durham@fb.com> [Tue, 20 Sep 2016 12:24:01 -0700] rev 29966
manifest: add manifestlog.add
This adds a simple add() function to manifestlog. This lets us convert more
uses of repo.manifest to use repo.manifestlog, so we can further break our
dependency on the manifest class.
Durham Goode <durham@fb.com> [Tue, 20 Sep 2016 12:24:01 -0700] rev 29965
manifest: move manifest.add onto manifestrevlog
This moves add and _addtree onto manifestrevlog. manifestrevlog is responsible
for all serialization decisions, so therefore the add function should live on
it. This will allow us to call add() from manifestlog, which lets us further
break our dependency on manifest.
Durham Goode <durham@fb.com> [Tue, 20 Sep 2016 12:24:01 -0700] rev 29964
manifest: remove dependency on treeinmem from manifest.add
Currently manifest.add uses the treeinmem option to know if it can call
fastdelta on the given manifest instance. In a future patch we will be moving
add() to be on the manifestrevlog, so it won't have access to the treeinmem
option anymore. Instead, let's have it actually check if the given manifest
instance supports the fastdelta operation.
This also means that if treemanifest or any implementation eventually implements
fastdelta(), it will automatically benefit from this code path.
Durham Goode <durham@fb.com> [Tue, 20 Sep 2016 12:24:01 -0700] rev 29963
manifest: move treeinmem onto manifestlog
A previous patched moved all the serialization related options onto
manifestrevlog (since it is responsible for serialization). Let's move the
treeinmem option on manifestlog, since it is responsible for materialization
decisions. This reduces the number of dependencies manifestlog has on the old
manifest type as well, so we can eventually make them completely independent of
each other.
Augie Fackler <augie@google.com> [Mon, 19 Sep 2016 17:14:43 -0400] rev 29962
copy: document current behavior of 'hg cp --after'
I'm about to propose an output change here, but the existing behavior
was untested!
Nathan Goldbaum <ngoldbau@illinois.edu> [Tue, 20 Sep 2016 10:03:50 -0500] rev 29961
crecord: add an event that scrolls the selected line to the top of the screen
Using ctrl-l for this purpose seems to be a fairly widely used practice,
presumably following emacs. This doesn't scroll the selected line all
the way to the top of the window, instead it leaves a 3 line buffer for
context. Use curses.unctrl() to resolve keypressed to '^L' to avoid
hard-coding hexadecimal key codes.
Yuya Nishihara <yuya@tcha.org> [Tue, 03 May 2016 14:24:00 +0900] rev 29960
log: drop hack to fix order of revset (issue5100)
Specify ordered=revset.followorder instead.
This patch effectively backs out c407583cf5f6. revs.sort(reverse=True)
is replaced by revs.reverse() because the matcher should no longer reorder
revisions.
Yuya Nishihara <yuya@tcha.org> [Tue, 03 May 2016 14:18:28 +0900] rev 29959
revset: add option to make matcher takes the ordering of the input set
This allows us to evaluate match(subset) as if 'subset & expr', which will
be the complete fix for the issue5100.
Martin von Zweigbergk <martinvonz@google.com> [Mon, 19 Sep 2016 09:14:35 -0700] rev 29958
strip: don't use "full" and "partial" to describe bundles
The partial bundle is not a subset of the full bundle, and the full
bundle is not full in any way that i see. The most obvious
interpretation of "full" I can think of is that it has all commits
back to the null revision, but that is not what the "full" bundle
is. The "full" bundle is simply a backup of what the user asked us to
strip (unless --no-backup). The "partial" bundle contains the
revisions we temporarily stripped because they had higher revision
numbers that some commit that the user asked us to strip.
The "full" bundle is already called "backup" in the code, so let's use
that in user-facing messages too. Let's call the "partial" bundle
"temporary" in the code.
Martin von Zweigbergk <martinvonz@google.com> [Mon, 19 Sep 2016 09:14:32 -0700] rev 29957
strip: clarify that user action is required to recover temp bundle
If strip fails when applying the temporary bundle, the commits in the
temporary bundle have not yet been applied, so the user will almost
definitely want to apply the bundle. We should be more clear to the
user about that than our current "partial bundle stored in...".
Note that we will probably not be able to recover it automatically,
since whatever made it fail (e.g. a hook) will most likely make it
fail again. We need to give control back to the user to fix the
problem before trying again.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 15 Sep 2016 09:45:29 -0700] rev 29956
strip: report both bundle files in case of exception (issue5368)
If strip fails while recovering the temporary bundle (e.g. because a
hook fails), we tell the user only about the backup bundle, not about
the temporary bundle. Since the user did not ask to strip the commits
in the temporary bundle, that's the more important bundle to mention,
so let's do that (and also mention the backup bundle as usual).
Martin von Zweigbergk <martinvonz@google.com> [Thu, 15 Sep 2016 10:18:56 -0700] rev 29955
strip: simplify some repeated conditions
We check "if saveheads or savebases" in several places to see if we
should or have created a bundle of the changesets to apply after
truncating the revlogs. One of the conditions is actually just "if
saveheads", but since there can't be savebases without saveheads, that
is effectively the same condition. It seems simpler to check only once
and from then on see if we created the file.
Mathias De Maré <mathias.demare@gmail.com> [Mon, 29 Aug 2016 07:07:15 +0200] rev 29954
config: add template support
V2:
- Limit escaping to plain formatting only
- Use the formatter consistently (no more ui.debug)
- Always include 'name' and 'value'
V3:
- Always convert 'value' to string (this also makes sure we handle functions)
- Keep real debug message as ui.debug for now
- Add additional tests.
Note: I'm not quite sure about the best approach to handling
the 'print the full config' case.
For me, it printed the 'ui.promptecho' key at the end.
I went with globs there as that at least tests the json display reliably.
Example output:
[
{
"name": "ui.username",
"source": "/home/mathias/.hgrc:2",
"value": "Mathias De Maré <mathias.demare@gmail.com>"
}
]
Mathias De Maré <mathias.demare@gmail.com> [Mon, 29 Aug 2016 17:19:09 +0200] rev 29953
formatter: introduce isplain() to replace (the inverse of) __nonzero__() (API)
V2: also remove and replace __nonzero__
Augie Fackler <augie@google.com> [Tue, 30 Aug 2016 15:55:07 -0400] rev 29952
diffopts: notice a negated boolean flag in diffopts
This means that if you have git-diffs enabled by default (pretty
common) and you hit the rare (but real) case where a git-diff breaks
patch(1) or some other tool, you can easily disable it by just
specifying --no-git on the command line.
I feel a little bad about the isinstance() check, but some values in
diffopts are not booleans and so we need to preserve false iff the
flag is a boolean flag: failing to do this means we end up with empty
string defaults for flags clobbering meaningful values from the [diff]
section in hgrc.
Augie Fackler <augie@google.com> [Tue, 13 Sep 2016 22:57:57 -0400] rev 29951
flags: allow specifying --no-boolean-flag on the command line (BC)
This makes it much easier to enable some anti-foot-shooting features
(like update --check) by default, because now all boolean flags can be
explicitly disabled on the command line without having to use HGPLAIN
or similar. Flags which don't deserve this treatment can be removed
from consideration by adding them to the nevernegate set in fancyopts.
This doesn't make it any easier to identify when a flag is set: opts
still always gets filled in, either with the user-specified flag value
or with the default from the flags list in the command
table. Improving that would probably clean things up a bit, but for
now if you want a boolean flag and care if it was explicitly false or
default false (or true, but nobody uses that functionality because
before now it was nonsense) you need to use None as your default
rather than True or False.
This doesn't (yet) update help output, because I'm not quite sure how
to do that cleanly.
Yuya Nishihara <yuya@tcha.org> [Tue, 03 May 2016 13:36:12 +0900] rev 29950
revset: make sort() noop depending on ordering requirement (BC)
See the previous patch for why.
Yuya Nishihara <yuya@tcha.org> [Tue, 03 May 2016 13:36:12 +0900] rev 29949
revset: make reverse() noop depending on ordering requirement (BC)
Because smartset.reverse() may modify the underlying subset, it should be
called only if the set can define the ordering.
In the following example, 'a' and 'c' is the same object, so 'b.reverse()'
would reverse 'a' unexpectedly.
# '0:2 & reverse(all())'
<filteredset
<spanset- 0:2>, # a
<filteredset # b
<spanset- 0:2>, # c
<spanset+ 0:9>>>
Yuya Nishihara <yuya@tcha.org> [Tue, 03 May 2016 12:52:50 +0900] rev 29948
revset: fix order of nested 'range' expression (BC)
Enforce range order only if necessary as the comment says "carrying the
sorting over would be more efficient."
Yuya Nishihara <yuya@tcha.org> [Wed, 01 Jun 2016 20:54:04 +0900] rev 29947
revset: forward ordering requirement to argument of present()
present() is special in that it returns the argument set with no
modification, so the ordering requirement should be forwarded.
We could make present() fix the order like orset(), but that would be silly
because we know the extra filtering cost is unnecessary.
Nathan Goldbaum <ngoldbau@illinois.edu> [Wed, 14 Sep 2016 11:39:47 -0500] rev 29946
crecord: delete commented line
Durham Goode <durham@fb.com> [Tue, 13 Sep 2016 16:00:41 -0700] rev 29945
manifest: move dirlog up to manifestrevlog
This removes dirlog and its associated cache from manifest and puts it in
manifestrevlog. The notion of there being sub-logs is specific to the revlog
implementation, and therefore belongs on the revlog class.
This patch will enable future patches to move the serialization logic for
manifests onto manifestrevlog, which will allow us to move manifest.add onto
manifestlog in a way that it just calls out to manifestrevlog for the
serialization.
Durham Goode <durham@fb.com> [Tue, 13 Sep 2016 16:00:41 -0700] rev 29944
manifest: move revlog specific options from manifest to manifestrevlog
The manifestv2 and treeondisk options are specific to how we serialize the
manifest into revlogs, so let's move them onto the manifestrevlog class. This
will allow us to add a manifestlog.add() function in a future diff that will
rely on manifestrevlog to make decisions about how to serialize the given
manifest to disk.
We have to move a little bit of extra logic about the 'dir' as well, since it is
used in conjunction with the treeondisk option to decide the revlog file name.
It's probably good to move this down to the manifestrevlog class anyway, since
it's specific to the revlog.
Durham Goode <durham@fb.com> [Tue, 13 Sep 2016 16:26:30 -0700] rev 29943
manifest: adds manifestctx.readfast
This adds a copy of manifest.readfast to manifestctx.readfast and adds a
consumer of it. It currently looks like duplicate code, but a future patch
causes these functions to diverge as tree concepts are added to the tree
version.
Durham Goode <durham@fb.com> [Tue, 13 Sep 2016 16:25:21 -0700] rev 29942
manifest: add manifestctx.readdelta()
This adds an implementation of readdelta to the new manifestctx class and adds a
couple consumers of it. This currently appears to have some duplicate code, but
future patches cause this function to diverge when things like "shallow" are
introduced.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Wed, 14 Sep 2016 17:12:39 +0200] rev 29941
merge with stable
Martin von Zweigbergk <martinvonz@google.com> [Tue, 13 Sep 2016 13:49:42 -0700] rev 29940
rebase: make debug logging more consistent
We emit some lines that mix revision numbers with nodeids, which makes
little sense to me.
Yuya Nishihara <yuya@tcha.org> [Sun, 26 Jun 2016 18:41:28 +0900] rev 29939
revset: fix order of nested '_(|int|hex)list' expression (BC)
This fixes the order of 'x & (y + z)' where 'y' and 'z' are trivial, and the
other uses of _list()-family functions. The original functions are renamed to
'_ordered(|int|hex)list' to say clearly that they do not follow the subset
ordering.
Yuya Nishihara <yuya@tcha.org> [Sun, 26 Jun 2016 18:17:12 +0900] rev 29938
revset: fix order of nested 'or' expression (BC)
This fixes the order of 'x & (y + z)' where 'y' and 'z' are not trivial.
The follow-order 'or' operation is slower than the ordered operation if
an input set is large:
#0 #1 #2 #3
0) 0.002968 0.002980 0.002982 0.073042
1) 0.004513 0.004485 0.012029 0.075261
#0: 0:4000 & (0:1099 + 1000:2099 + 2000:3099)
#1: 4000:0 & (0:1099 + 1000:2099 + 2000:3099)
#2: 10000:0 & (0:1099 + 1000:2099 + 2000:3099)
#3: file("path:hg") & (0:1099 + 1000:2099 + 2000:3099)
I've tried another implementation, but which appeared to be slower than
this version.
ss = [getset(repo, fullreposet(repo), x) for x in xs]
return subset.filter(lambda r: any(r in s for s in ss), cache=False)
Yuya Nishihara <yuya@tcha.org> [Sun, 07 Aug 2016 17:58:50 +0900] rev 29937
revset: add 'takeorder' attribute to mark functions that need ordering flag
Since most functions shouldn't need 'order' flag, it is passed only when
explicitly required. This avoids large API breakage.
Yuya Nishihara <yuya@tcha.org> [Sun, 07 Aug 2016 17:46:12 +0900] rev 29936
revset: pass around ordering flags to operations
Some operations and functions will need them to fix ordering bugs.
Yuya Nishihara <yuya@tcha.org> [Sun, 07 Aug 2016 17:48:52 +0900] rev 29935
revset: add stub to handle parentpost operation
All operations will take 'order' flag, but p1() function won't.
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Feb 2016 22:02:16 +0900] rev 29934
revset: infer ordering flag to teach if operation should define/follow order
New flag 'order' is the hint to determine if a function or operation can
enforce its ordering requirement or take the ordering already defined. It
will be used to fix a couple of ordering bugs, such as:
a) 'x & (y | z)' disregards the order of 'x' (issue5100)
b) 'x & y:z' is listed from 'y' to 'z'
c) 'x & y' can be rewritten as 'y & x' if weight(x) > weight(y)
(a) and (b) are bugs of the revset core. Before this, there was no way to
tell if 'orset()' and 'rangeset()' can enforce its ordering. These bugs
could be addressed by overriding __and__() of the initial set to take the
ordering of the other set:
class fullreposet:
def __and__(self, other):
# allow other to enforce its ordering
return other
but it would expose (c), which is a hidden bug of optimize(). So, in either
ways, optimize() have to know the current ordering requirement. Otherwise,
it couldn't rewrite expressions by weights with no output change, nor tell
how a revset function or operation should order the entries.
'order' is tri-state. It starts with 'define', and shifts to 'follow' by
'x & y'. It changes back to 'define' on function call 'f(x)' or function-like
operation 'x (f) y' because 'f' may have its own ordering requirement for 'x'
and 'y'. The state 'any' will allow us to avoid extra cost that would be
necessary to constrain ordering where it isn't important, 'not x'.
Yuya Nishihara <yuya@tcha.org> [Sun, 07 Aug 2016 17:04:05 +0900] rev 29933
revset: wrap arguments of 'or' by 'list' node
This makes the number of 'or' arguments deterministic so we can attach
additional ordering flag to all operator nodes. See the next patch.
We rewrite the tree immediately after chained 'or' operations are flattened
by simplifyinfixops(), so we don't need to care if arguments are stored in
x[1] or x[1:].
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Tue, 13 Sep 2016 20:30:19 +0200] rev 29932
journal: properly check for held lock (issue5349)
The 'jlock' code meant to check for a held lock, but it actually just checking for a
lock object. With CPython, this worked because the 'jlock' object is not
referenced outside the '_write' function so reference counting would garbage
collect it and the '_lockref' would return None. With pypy, the garbage
collection would happen at an undefined time and the '_lockref' can still point
to a 'jlock' object outside of '_write'.
The right thing to do here is not only to check for a lock object but also to
check if the lock is held. We update the code to do so and reuse a utility
method that exist on 'localrepo' to help readability. This fix journal related
tests with pypy.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Tue, 13 Sep 2016 17:46:29 +0200] rev 29931
ssl: handle a difference in SSLError with pypy (issue5348)
The SSLError exception is a bit different with pypy (message is the first
argument, not the second) This led the certificate error handling to crash when
trying to extract the ssl error message. We now handle this different and
'test-https.t' is green again.
Durham Goode <durham@fb.com> [Mon, 12 Sep 2016 10:55:43 -0700] rev 29930
manifest: change manifestctx to not inherit from manifestdict
If manifestctx inherits from manifestdict, it requires some weird logic to
lazily load the dict if a piece of information is asked for. This ended up being
complicated and unintuitive to use.
Let's move the dict creation to .read(). This will make even more sense once we
start adding readdelta() and other similar methods to manifestctx.
Durham Goode <durham@fb.com> [Mon, 12 Sep 2016 14:29:09 -0700] rev 29929
manifest: make one use of _mancache avoid manifestctxs
In a future patch we will change manifestctx and treemanifestctx to no longer
derive from manifestdict and treemanifest, respectively. This means that
consumers of the _mancache will now need to be aware of the different between
the two, until we get rid of the manifest entirely and the _mancache becomes
only filled with ctxs.
This fixes one case of it that can be fixed by using the other cache. Future
patches will address the others uses using the upcoming manifestctx.read()
function.
Yuya Nishihara <yuya@tcha.org> [Sun, 21 Aug 2016 13:16:21 +0900] rev 29928
debugrevspec: add option to verify optimized result
This provides a convenient way to diff "hg debugrevspec" outputs generated
with/without --no-optimized option.
Yuya Nishihara <yuya@tcha.org> [Sun, 21 Aug 2016 12:40:02 +0900] rev 29927
debugrevspec: add option to skip optimize() and evaluate unoptimized tree
This will help debugging optimizer bugs.
Maybe '--no-optimized' can be changed to '--optimized' (default: True) when
flags series landed.
Yuya Nishihara <yuya@tcha.org> [Thu, 08 Sep 2016 22:44:10 +0900] rev 29926
revset: remove showwarning option from expandaliases()
Now all callers pass showwarning=ui.warn, so we no longer need the option to
suppress warnings.
Yuya Nishihara <yuya@tcha.org> [Sun, 21 Aug 2016 12:45:43 +0900] rev 29925
debugrevspec: evaluate tree built by itself
Prepares for new option to evaluate an unoptimized tree.
Since a revset expression is no longer parsed twice, alias warnings should
be displayed at the first parsing stages. That's why showwarning=ui.warn is
added.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 12 Sep 2016 03:06:29 +0900] rev 29924
localrepo: make _refreshfilecachestats unfiltered method to refresh correctly
Before this patch, if transaction is started via "filtered repo"
object, _refreshfilecachestats() at closing transaction doesn't
refresh file stat of any @filecache properties correctly, because:
- _refreshfilecachestats() omits refreshing file stat of a
@filecache property, if it doesn't appear in self.__dict__
- if transaction is started via "filtered repo",
_refreshfilecachestats() is applied on "filtered repo"
because repo.transaction() adds "self._refreshfilecachestats" to
post close procedures. repo.transaction() isn't unfiltered method,
and "self" in it means "filtered repo" in this case.
Transactions started by explicit repo.transaction() easily causes
this situation.
- _refreshfilecachestats() applied on "filtered repo" omits whole
refreshing
because @filecache properties are stored into "unfiltered repo",
and appear only in self.__dict__ of "unfiltered repo".
This incorrect refreshing causes unnecessary reloading from files.
To refresh file stat of @filecache properties at closing transaction
correctly, this patch makes _refreshfilecachestats() unfiltered
method.
This patch chooses making _refreshfilecachestats() unfiltered method
instead of making transaction() unfiltered method, to reduce
unexpected side effect.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 12 Sep 2016 03:06:29 +0900] rev 29923
streamclone: clear caches after writing changes into files for visibility
Before this patch, streamclone-ed changes are invisible via @filecache
properties to in-process procedures before closing transaction
(e.g. pretxnclose python hook), if corresponded property is cached
before consumev1(). Strictly speaking, caching should occur inside
(store) lock for transaction.
repo.invalidate() after closing transaction is too late to force
@filecache properties to be reloaded from changed files at next
access.
For visibility of streamclone-ed changes to in-process procedures
before closing transaction, this patch clears caches just after
writing changes into files.
BTW, regardless of changing in this patch, clearing cached properties
in consumev1() causes inconsistency, if (1) transaction is started and
(2) any @filecache property is changed before consumev1().
This patch also adds the comment to fix this (potential) inconsistency
in the future.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 12 Sep 2016 03:06:28 +0900] rev 29922
localrepo: make invalidate avoid invalidating store inside transaction (API)
Before this patch, invalidate() discards in-memory fncache changes,
even inside transaction scope.
Such changes should be written out at closing transaction. Otherwise,
fncache might overlook newly added files. A file overlooked by
fncache isn't accessible via store vfs, even if it actually exists in
store.
On the other hand, a non-existing file in fncache is less harmful,
because fncachestore always examines whether a file actually exists or
not before access. Therefore, discarding in-memory changes can be
safely omitted.
It is typical case that repo.invalidate() in streamclone is executed
inside nested transaction.
This patch makes invalidate() avoid invalidating store inside
transaction.
This patch focuses on describing only how invalidate() changes own
behavior according to activity of transaction. Describing other detail
of invalidate() in docstr will be done in another series, which
refactors invalidate*() functions.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 12 Sep 2016 03:06:28 +0900] rev 29921
streamclone: force @filecache properties to be reloaded from file
Before this patch, consumev1() invokes repo.invalidate() after closing
transaction, to force @filecache properties to be reloaded from files
at next access, because streamclone writes data into files directly.
But this doesn't work as expected in the case below:
1. at closing transaction, repo._refreshfilecachestats() refreshes
file stat of each @filecache properties with streamclone-ed files
This means that in-memory properties are treated as valid.
2. but streamclone doesn't changes in-memory properties
This means that in-memory properties are actually invalid.
3. repo.invalidate() just forces to examine file stat of @filecache
properties at the first access after it
Such examination should concludes that reloading from file isn't
needed, because file stat was already refreshed at (1).
Therefore, invalid in-memory cached properties (2) are
unintentionally treated as valid (1).
This patch invokes repo.invalidate() with clearfilecache=True, to
force @filecache properties to be reloaded from file at next access.
BTW, it is accidental that repo.invalidate() without
clearfilecache=True in streamclone case seems to work as expected
before this patch.
If transaction is started via "filtered repo" object,
repo._refreshfilecachestats() tries to refresh file stat of each
@filecache properties on "filtered repo" object, even though all of
them are stored into "unfiltered repo" object.
In this case, repo._refreshfilecachestats() does nothing
unintentionally, but this unexpected behavior causes reloading
@filecache properties after repo.invalidate().
This is reason why this patch should be applied before making
_refreshfilecachestats() correctly refresh file stat of @filecache
properties.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Sat, 10 Sep 2016 01:42:05 +0200] rev 29920
manifest: backed out changeset bb3281b3fcaa
There is some suspicious failure in evolution tests. This changeset was supposed
to be dropped until we investigate.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Sat, 10 Sep 2016 01:41:38 +0200] rev 29919
manifest: backed out changeset b60a5fe98b73
There is some suspicious failure in evolution tests. This changeset was supposed
to be dropped until we investigate.
Yuya Nishihara <yuya@tcha.org> [Sun, 21 Aug 2016 12:36:23 +0900] rev 29918
debugrevspec: deprecate --optimize option
This option has been superseded by '--show-stage NAME', and will cause
confusion in future patches.
Yuya Nishihara <yuya@tcha.org> [Sun, 21 Aug 2016 12:33:57 +0900] rev 29917
debugrevspec: add option to print parsed tree at given stages
"-p <stage>" is useful for investigating parsing stages. With -p option, a
transformed tree is printed no matter if it is changed or not, which allows
us to know valid stage names by "-p all".
Yuya Nishihara <yuya@tcha.org> [Sun, 21 Aug 2016 12:04:08 +0900] rev 29916
debugrevspec: transform and print parsed tree by stages
Prepares for adding new option to print transformed tree at each stage.
Yuya Nishihara <yuya@tcha.org> [Sun, 21 Aug 2016 11:50:54 +0900] rev 29915
debugrevspec: build parsed tree even if no --verbose specified
Prepares for evaluating unoptimized tree. The output is suppressed by
ui.note() anyway.
Maciej Fijalkowski <fijall@gmail.com> [Thu, 08 Sep 2016 10:37:58 +0200] rev 29914
osutil: fix the declaration to work on different sizes of off_t
Durham Goode <durham@fb.com> [Wed, 31 Aug 2016 12:46:53 -0700] rev 29913
manifest: change manifestctx to not inherit from manifestdict
If manifestctx inherits from manifestdict, it requires some weird logic to
lazily load the dict if a piece of information is asked for. This ended up being
complicated and unintuitive to use.
Let's move the dict creation to .read(). This will make even more sense once we
start adding readdelta() and other similar methods to manifestctx.
Durham Goode <durham@fb.com> [Mon, 29 Aug 2016 18:02:09 -0700] rev 29912
manifest: make uses of _mancache aware of contexts
In a future patch we will change manifestctx and treemanifestctx to no longer
derive from manifestdict and treemanifest, respectively. This means that
consumers of the _mancache will now need to be aware of the different between
the two, until we get rid of the manifest entirely and the _mancache becomes
only filled with ctxs.
Durham Goode <durham@fb.com> [Wed, 31 Aug 2016 13:29:49 -0700] rev 29911
manifest: add treemanifestctx class
Before we start using repo.manifestlog in the rest of the code base, we need to
make sure that it's capable of returning treemanifests. As we add new
functionality to manifestctx, we'll add it to treemanifestctx at the same time.
We also comment out the manifestctx p1, p2, and linkrev fields for now, since
we're not implementing them on treemanifest yet.
Yuya Nishihara <yuya@tcha.org> [Sun, 21 Aug 2016 11:37:00 +0900] rev 29910
revset: add public function to create matcher from evaluatable tree
"hg debugrevspec" will use it to evaluate unoptimized tree.
Yuya Nishihara <yuya@tcha.org> [Sun, 21 Aug 2016 11:29:57 +0900] rev 29909
revset: make analyze() a separate step from optimize()
This will allow us to evaluate unoptimized tree and compare the result with
optimized one.
The private _analyze() function isn't renamed since I'll add more parameters
to it.
Yuya Nishihara <yuya@tcha.org> [Sun, 07 Aug 2016 14:35:03 +0900] rev 29908
revset: extract tree transformation from optimize()
This patch separates the simple tree transformation from the optimization step,
which is called as _analyze() since I'll extend this function to infer ordering
flags. I want to avoid making _optimize() more complicated.
This will also allow us to evaluate unoptimized tree.
Yuya Nishihara <yuya@tcha.org> [Sun, 04 Sep 2016 17:19:44 +0900] rev 29907
hghave: fix has_bzr() to not try to import RevisionSpec as module
Since RevisionSpec isn't a module, "import bzrlib.revisionspec.RevisionSpec"
would always raise ImportError.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Mon, 22 Aug 2016 14:44:14 +0200] rev 29906
update: label bookmark name in message
We label bookmark name as such in various messages. This will help them to
standout (or at least give the user the option to make them stand out). We use a
distinct label for the 'active' bookmark, this can help users to catch bookmark
operation affecting their working copy.
Ryan McElroy <rmcelroy@fb.com> [Tue, 06 Sep 2016 09:43:25 -0700] rev 29905
discovery: explicitly check for None in outgoing init
f09d0004481c introduced default params for discovery.outgoing(), but it used a
falsy check instead of an explicit check for None. The result is that callers
that passed in an empty list would have that list overridden by the defaults,
which is not the expected behavior.
This was discovered by changes to the test-pushrebase.t test in Facebook's
repository of mercurial extensions.
liscju <piotr.listkiewicz@gmail.com> [Fri, 26 Aug 2016 12:48:20 +0200] rev 29904
import: report directory-relative paths in error messages (issue5224)
Import uses paths relative to the root of the repository, so when
user imports patch with paths relative to the current working directory
import aborts with 'unable to find file for patching'.
This patch improves this situation by warning the user that paths are
relative to the root of repository when patching fails.
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com> [Mon, 05 Sep 2016 08:29:36 +0000] rev 29903
commands: remove unecessary copying of list in graft()
Yuya Nishihara <yuya@tcha.org> [Sun, 07 Aug 2016 16:36:08 +0900] rev 29902
revset: do not partial-match operator and function names in optimize()
It was error-prone, and actually there was a typo, s/ancestorspec/ancestor/.
Yuya Nishihara <yuya@tcha.org> [Sun, 07 Aug 2016 14:13:27 +0900] rev 29901
revset: remove false condition to process 'negate' operator
'negate' is mapped to 'string' at the above clause.
Yuya Nishihara <yuya@tcha.org> [Sun, 07 Aug 2016 15:01:42 +0900] rev 29900
revset: make optimize() reject unknown operators
This should have caught the bug of 'keyvalue' operator fixed at 5004ef47f437.
The catch-all pattern is useless since optimize() should be aware of all known
operators.
liscju <piotr.listkiewicz@gmail.com> [Thu, 01 Sep 2016 22:06:42 +0200] rev 29899
help: show content for explicitly disabled extension (issue5228)
liscju <piotr.listkiewicz@gmail.com> [Fri, 02 Sep 2016 10:18:56 +0200] rev 29898
obsolete: fix minor module documentation issues
Yuya Nishihara <yuya@tcha.org> [Fri, 26 Aug 2016 23:31:17 +0900] rev 29897
debugextensions: hide "ships-with-hg-core" magic string (BC)
Since we have "bundled" flag, we no longer need to rephrase "ships-with-hg-core"
to show as "internal".
Yuya Nishihara <yuya@tcha.org> [Wed, 31 Aug 2016 23:22:07 +0900] rev 29896
debugextensions: show ships-with-hg-core state as a separate field
This is less magical than rephrasing ships-with-hg-core as internal, and
we can distinguish "internal" liar. "tested with: internal" will be hidden
by the next patch.
Yuya Nishihara <yuya@tcha.org> [Wed, 31 Aug 2016 23:36:37 +0900] rev 29895
test-debugextensions: add dummy extension to make ifcontains() test more solid
If testedwith were a string, ifcontains("3.2", testedwith) would match "3.2.1".
New test added to cover that.
Pulkit Goyal <7895pulkit@gmail.com> [Thu, 01 Sep 2016 02:29:46 +0530] rev 29894
py3: remove use of *L syntax
The int in Python 3 behaves as long so no need of L's in py3.
Moreover we dont need long here.
Martin von Zweigbergk <martinvonz@google.com> [Tue, 30 Aug 2016 09:22:53 -0700] rev 29893
util: rename checkcase() to fscasesensitive() (API)
I always read the name "checkcase(path)" as "do we need to check for
case folding at this path", but it's actually (I think) meant to be
read "check if the file system cares about case at this path". I'm
clearly not the only one confused by this as the dirstate has this
property:
def _checkcase(self):
return not util.checkcase(self._join('.hg'))
Maybe we should even inverse the function and call it fscasefolding()
since that's what all callers care about?
Durham Goode <durham@fb.com> [Mon, 29 Aug 2016 17:48:14 -0700] rev 29892
manifest: call m1.load and m2.load before writing a subtree
As part of refactoring the manifest, certain test cases started failing because
writesubtrees was called with p1 and p2 manifests that had not been loaded (so
accessing m1._dirs resulted in an empty set). Let's call _load on these before
attempting to access _dirs.
This was caught by tests when future patches were applied.
Augie Fackler <augie@google.com> [Tue, 30 Aug 2016 13:13:50 -0400] rev 29891
histedit: correct output of error when 'base' is from the edit list
This was made more obvious by marmoute's recent rearrangement of this code.
Augie Fackler <augie@google.com> [Tue, 30 Aug 2016 13:33:48 -0400] rev 29890
py3: split check of pygments-using files from the rest of the tree
If we don't do this, people without pygments installed in their Python
3 environment silently stop checking test-check-py3-compat, which
isn't really what we wanted. This preserves stability of the test
output while still letting anyone with a recent-enough Python 3 run
the majority of the Python 3 compat checking test.
Yuya Nishihara <yuya@tcha.org> [Fri, 26 Aug 2016 23:38:52 +0900] rev 29889
version: change "place" field of extension to "bundled" flag
The name "place" sounds odd. We can simply expose raw boolean values instead
of switching external/internal literals.
Yuya Nishihara <yuya@tcha.org> [Sat, 27 Aug 2016 00:00:28 +0900] rev 29888
extensions: use ismoduleinternal() thoroughly
"ships-with-hg-core" would be long enough to typo.
Mark Ignacio <mignacio@fb.com> [Tue, 30 Aug 2016 09:25:00 -0700] rev 29887
lock: show more detail for new-style locks in lock waiting message (issue4752)
Improve the lock waiting warning message by explicitly saying that a host and
process are holding the lock. This nudges confused new users in the direction
of investigating the other process instead of removing the lock.
Yuya Nishihara <yuya@tcha.org> [Mon, 29 Aug 2016 00:00:05 +0900] rev 29886
formatter: add context manager interface for convenience
And port "hg files" to test it.
As you can see, extra indent is necessary to port to this API. I don't think
we should switch every fm.formatter() call to "with" statement.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Fri, 26 Aug 2016 21:06:31 +0200] rev 29885
histedit: remove now unused 'constraints' related code
Now that the one action that need different logic handle that using inheritance
and overriding, we can remove that code.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Fri, 26 Aug 2016 21:00:33 +0200] rev 29884
histedt: use inheritance to override the constraints in 'base'
All actions but one actually have the same constraints when it comes to validate
the 'action.node' value. So we actually just add this code to a method that can
be overwritten in the one action where it matters.
The now unused 'contraints' related enum and class attribute will be cleaned up
in the next changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Fri, 26 Aug 2016 20:54:52 +0200] rev 29883
histedit: move constraint verification to the 'action.verify' method
Action has a method dedicated to verifying its validity. So we move code
related to constrains into that method. This requires a bit more context to the
'verify' method in the same fashion we were passing the 'prev' argument.
This is an extra step before we can simplify the constraint handling code
further.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Fri, 26 Aug 2016 20:54:32 +0200] rev 29882
histedit: directly use node in 'verifyactions'
It does not seem useful to convert to hex: it is an extra step and they are
longer strings. So we stick to node for the logic. We only convert to short hex
for error when needed. As a nice side effect this remove the explicit constant
usage in'[12:]'. This will also help moving the code around later as we just
have to access action.node.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Fri, 26 Aug 2016 20:42:18 +0200] rev 29881
histedit: temporarily shorten name of 'constraints' variable
An upcoming changeset will make the line where this variable is used
slightly too long. Other later changesets will clean that up further and makes
the variable unnecessary, so this is only temporary and it does seems useful to
put anything more complicate in place.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Fri, 26 Aug 2016 20:38:37 +0200] rev 29880
histedit: drop the 'nodetoverify' local variable
We can just use 'action.node'.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Fri, 26 Aug 2016 20:34:58 +0200] rev 29879
histedit: make 'constraints' a class attribute instead of a method
There does not seem to be a reason for this to be a method. So we initialise
the class attribute once and for all at creation time and drop the instance
method.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Fri, 26 Aug 2016 20:31:33 +0200] rev 29878
histedit: drop the 'nodetoverify' method
That method is just returning self.node and is never overridden. We just use
the attribute directly instead and get rid of the method.
This is the beginning of series to simplify and unify verification of constraints
for actions.
Yuya Nishihara <yuya@tcha.org> [Mon, 29 Aug 2016 22:59:39 +0900] rev 29877
test-gpg: start gpg-agent by gpg-connect-agent only if GnuPG v2.1+ detected
Danek Duvall found that gpg-connect-agent of GnuPG 2.0 never starts gpg-agent
daemon. The 2.1 way is documented as "gpg-coonect-agent /bye" [1], which
appears to be different from the 2.0 way [2].
[1]: https://www.gnupg.org/documentation/manuals/gnupg/Invoking-GPG_002dAGENT.html
[2]: https://www.gnupg.org/documentation/manuals/gnupg-2.0/Invoking-GPG_002dAGENT.html
Since "gpg-agent --daemon" of GnuPG 2.1 never prints environment variables,
"eval $(gpg-agent --daemon)" would be valid only for GnuPG < 2.1, and we'll
need a different workaround for 2.0. I have no 2.0 environment, I won't
implement it.
timeless <timeless@mozdev.org> [Fri, 26 Aug 2016 00:16:51 +0000] rev 29876
rebase: properly calculate total commits to rebase (issue5347)
Before this, predecessor commits were being included in the count
Maciej Fijalkowski <fijall@gmail.com> [Sun, 28 Aug 2016 17:51:32 -0700] rev 29875
mpatch: add setup_mpatch_cffi.py
This file got dropped when the corresponding setup.py changes were
made.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Wed, 24 Aug 2016 03:59:19 +0200] rev 29874
journal: rename on disk files to 'namejournal'
The 'journal' naming is already used by the transaction journal. Having an
unrelated group of file with such a close naming is confusing and error prone.
We rename the file used by the 'journal' extension to use 'namejournal' as the
extension track the location of various 'names'.
timeless <timeless@mozdev.org> [Thu, 25 Aug 2016 23:13:36 +0000] rev 29873
tests: guard demandimport segment of test-extension.t
timeless <timeless@mozdev.org> [Thu, 25 Aug 2016 22:03:51 +0000] rev 29872
tests: skip demandimport if disabled
demandimport and setuptools and decorator (from ironpython) and
pygments leads to lots of fail.
If demandimport is disabled we should skip testing it...
timeless <timeless@mozdev.org> [Thu, 25 Aug 2016 22:30:35 +0000] rev 29871
hghave: add demandimport checking
timeless <timeless@mozdev.org> [Thu, 25 Aug 2016 22:51:39 +0000] rev 29870
hghave: make bzr checks stricter
My bzr does not have bzrlib.revisionspec.RevisionSpec,
and thus tests were failing because convert refused to believe in bzr,
but hghave without this change thought it was available.
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 22 Aug 2016 19:50:21 -0700] rev 29869
help: document wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 22 Aug 2016 19:49:59 -0700] rev 29868
help: document wire protocol "handshake" protocol
There isn't a formal handshake protocol in the wire protocol. But
clients almost certainly need to perform particular actions before they
can communicate with a server optimally. So document what that is
so people understand what's going on at connection establishment time.
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 22 Aug 2016 19:48:31 -0700] rev 29867
help: document wire protocol capabilities
All capabilities from the history of the project are now documented.
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 22 Aug 2016 19:47:34 -0700] rev 29866
help: document wire protocol transport protocols
The HTTP and SSH transport protocols are documented. This
includes how commands and arguments are serialized as well as
response types.
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 22 Aug 2016 19:46:39 -0700] rev 29865
help: internals topic for wire protocol
The Mercurial wire protocol is under-documented. This includes a lack
of source docstrings and comments as well as pages on the official
wiki.
This patch adds the beginnings of "internals" documentation on the
wire protocol.
The documentation should have nearly complete coverage on the
lower-level parts of the protocol, such as the different transport
mechanims, how commands and arguments are sent, capabilities, and,
of course, the commands themselves.
As part of writing this documentation, I discovered a number of
deficiencies in the protocol and bugs in the implementation. I've
started sending patches for some of the issues. I hope to send a lot
more.
This patch starts with the scaffolding for a new internals page.
Yuya Nishihara <yuya@tcha.org> [Thu, 18 Aug 2016 15:13:56 +0900] rev 29864
grep: add formatter support
Several fields are renamed to be consistent with the annotate command, which
doesn't mean the last call for the name unification [1]. Actually, I'd rather
rename line_number to linenumber, linenum, lineno or line, but I want to
port the grep command to formatter first.
[1]: https://www.mercurial-scm.org/wiki/GenericTemplatingPlan#Dictionary
I don't have any better name for the list of matched/unmatched texts, so
they are just called as "texts".
Yuya Nishihara <yuya@tcha.org> [Thu, 18 Aug 2016 14:52:06 +0900] rev 29863
grep: build list of all columns regardless of display options
These columns should always be available in JSON or template outputs. The
"change" column is excluded because it has no useful data unless --all is
specified.
Yuya Nishihara <yuya@tcha.org> [Thu, 18 Aug 2016 14:23:29 +0900] rev 29862
grep: build list of columns without "grep." label prefix
Prepares for formatter support. We need field names without "grep.".
Yuya Nishihara <yuya@tcha.org> [Thu, 18 Aug 2016 14:09:49 +0900] rev 29861
grep: factor out function that prints matched line with labels
Prepares for formatter support.
Yuya Nishihara <yuya@tcha.org> [Thu, 18 Aug 2016 14:03:25 +0900] rev 29860
grep: refactor loop that yields matched text with label
As preparation for formatter support, this and the next patch split
linestate.__iter__() into two functions, line scanner and displayer.
New code uses regexp.search(str, pos) in place of regexp.search(substr),
which appears to fix a bug of highlighting.
liscju <piotr.listkiewicz@gmail.com> [Tue, 05 Jul 2016 09:37:07 +0200] rev 29859
files: change documentation to match its behaviour (issue5276)
Documentation gave the usage pattern as '[OPTION]... [PATTERN]...'
when the command match given files as relpaths by default.
Matt Mackall <mpm@selenic.com> [Wed, 24 Aug 2016 17:43:45 -0700] rev 29858
templater: add template path to __base__ search
This does a fall-back check for style files or directories that are
in Mercurial's template path for user convenience.
We intentionally don't use this for the built-in coal style because we don't
want the style to mysteriously break if the working directory just
happens to have a file named "paper".
Augie Fackler <augie@google.com> [Tue, 23 Aug 2016 16:40:08 -0400] rev 29857
blackbox: also log alias expansions
This should be extremely useful for helping users debug without having
to see their complete configuration.
Shell aliases do not get their expansion logged, because we don't look
and see if we're in a repo before we dive into the execution of a
shell alias. As a result, the ui object doesn't know where to log.
Augie Fackler <augie@google.com> [Thu, 25 Aug 2016 01:06:32 -0400] rev 29856
test-clonebundles: accept another error string here
This is what happens if you run the test in a FreeBSD Jail, rather
than "connection refused".
Augie Fackler <augie@google.com> [Thu, 25 Aug 2016 01:26:39 -0400] rev 29855
tests: guard test-archive-symlink with unziplinks check
This fixes the test on FreeBSD, where the stock unzip doesn't
understand symlinks.
Augie Fackler <augie@google.com> [Thu, 25 Aug 2016 01:25:52 -0400] rev 29854
hghave: add a check for unzip(1) that understands symlinks
unzip(1) from the FreeBSD base system does not understand symlinks, so
test-archive-symlinks is busted.
Augie Fackler <augie@google.com> [Thu, 25 Aug 2016 01:00:54 -0400] rev 29853
test-https: drop two spurious --traceback flags
These make test failures scarier than they are.
Augie Fackler <augie@google.com> [Tue, 23 Aug 2016 11:26:08 -0400] rev 29852
extensions: change magic "shipped with hg" string
I've caught multiple extensions in the wild lying about being
'internal', so it's time to move the goalposts on people. Goalpost
moving will continue until third party extensions stop trying to
defeat the system.
Yuya Nishihara <yuya@tcha.org> [Thu, 25 Aug 2016 01:00:26 -0400] rev 29851
version: add formatter support
The license message isn't exported, which I don't think is useful and I
couldn't find a way to restructure it for JSON or template outputs.
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Aug 2016 16:09:12 +0900] rev 29850
version: factor out mapping of internal/external labels
Prepares for formatter support, where translation should be disabled
conditionally.
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Aug 2016 16:03:09 +0900] rev 29849
version: always build list of extension versions
This patch just moves "if ui.verbose:" to the inner loop, as preparation
for formatter support.
Yuya Nishihara <yuya@tcha.org> [Sun, 13 Mar 2016 19:59:39 +0900] rev 29848
formatter: add fm.nested(field) to either write or build sub items
We sometimes need to build nested items by formatter, but there was no
convenient way other than building and putting them manually by fm.data():
exts = []
for n, v in extensions:
fm.plain('%s %s\n' % (n, v))
exts.append({'name': n, 'ver': v})
fm.data(extensions=exts)
This should work for simple cases, but doing this would make it harder to
change the underlying data type for better templating support.
So this patch provides fm.nested(field), which returns new nested formatter
(or self if items aren't structured and just written to ui.) A nested formatter
stores items which will later be rendered by the parent formatter.
fn = fm.nested('extensions')
for n, v in extensions:
fn.startitem()
fn.write('name ver', '%s %s\n', n, v)
fn.end()
Nested items are directly exported to a template for now:
{extensions % "{name} {ver}\n"}
There's no {extensions} nor {join(extensions, sep)} yet. I have a plan for
them by extending fm.nested() API, but I want to revisit it after trying
out this API in the real world.
Yuya Nishihara <yuya@tcha.org> [Mon, 15 Aug 2016 13:51:14 +0900] rev 29847
formatter: factor out format*() functions to separate classes
New converter classes will be reused by a nested formatter. See the next
patch for details.
This change is also good in that the default values are defined uniquely
by the baseformatter.
Jun Wu <quark@fb.com> [Wed, 24 Aug 2016 11:24:07 +0100] rev 29846
crecord: restore SIGWINCH handler before return
Previously, the SIGWINCH handler does not get cleared and if the commit
message editor also needs SIGWINCH handling (like vim), the two SIGWINCH
handlers (the editor's, ours) will have a race. And we may erase the
editor's screen content.
This patch restores SIGWINCH handler to address the above issue.
Maciej Fijalkowski <fijall@gmail.com> [Sat, 20 Aug 2016 23:06:01 +0200] rev 29845
bdiff: implement cffi version of bdiff
Maciej Fijalkowski <fijall@gmail.com> [Thu, 28 Jul 2016 14:17:08 +0200] rev 29844
bdiff: implement cffi version of blocks
Tony Tung <tonytung@merly.org> [Fri, 19 Aug 2016 13:30:40 -0700] rev 29843
util: checknlink should remove file it creates if an exception occurs
There's no reason to leave the file behind.
Siddharth Agarwal <sid0@fb.com> [Tue, 23 Aug 2016 17:58:53 -0700] rev 29842
merge: remove files with extra actions from merge action list
See the comment for a detailed explanation why.
Even though this is a bug, I've sent it to 'default' rather than 'stable'
because it isn't triggered in any code paths in stock Mercurial, just with the
merge driver included. For the same reason I haven't included any tests here --
the merge driver is getting a new test.
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 22 Aug 2016 21:48:50 -0700] rev 29841
revlog: use an LRU cache for delta chain bases
Profiling using statprof revealed a hotspot during changegroup
application calculating delta chain bases on generaldelta repos.
Essentially, revlog._addrevision() was performing a lot of redundant
work tracing the delta chain as part of determining when the chain
distance was acceptable. This was most pronounced when adding
revisions to manifests, which can have delta chains thousands of
revisions long.
There was a delta chain base cache on revlogs before, but it only
captured a single revision. This was acceptable before generaldelta,
when _addrevision would build deltas from the previous revision and
thus we'd pretty much guarantee a cache hit when resolving the delta
chain base on a subsequent _addrevision call. However, it isn't
suitable for generaldelta because parent revisions aren't necessarily
the last processed revision.
This patch converts the delta chain base cache to an LRU dict cache.
The cache can hold multiple entries, so generaldelta repos have a
higher chance of getting a cache hit.
The impact of this change when processing changegroup additions is
significant. On a generaldelta conversion of the "mozilla-unified"
repo (which contains heads of the main Firefox repositories in
chronological order - this means there are lots of transitions between
heads in revlog order), this change has the following impact when
performing an `hg unbundle` of an uncompressed bundle of the repo:
before: 5:42 CPU time
after: 4:34 CPU time
Most of this time is saved when applying the changelog and manifest
revlogs:
before: 2:30 CPU time
after: 1:17 CPU time
That nearly a 50% reduction in CPU time applying changesets and
manifests!
Applying a gzipped bundle of the same repo (effectively simulating a
`hg clone` over HTTP) showed a similar speedup:
before: 5:53 CPU time
after: 4:46 CPU time
Wall time improvements were basically the same as CPU time.
I didn't measure explicitly, but it feels like most of the time
is saved when processing manifests. This makes sense, as large
manifests tend to have very long delta chains and thus benefit the
most from this cache.
So, this change effectively makes changegroup application (which is
used by `hg unbundle`, `hg clone`, `hg pull`, `hg unshelve`, and
various other commands) significantly faster when delta chains are
long (which can happen on repos with large numbers of files and thus
large manifests).
In theory, this change can result in more memory utilization. However,
we're caching a dict of ints. At most we have 200 ints + Python object
overhead per revlog. And, the cache is really only populated when
performing read-heavy operations, such as adding changegroups or
scanning an individual revlog. For memory bloat to be an issue, we'd
need to scan/read several revisions from several revlogs all while
having active references to several revlogs. I don't think there are
many operations that do this, so I don't think memory bloat from the
cache will be an issue.
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 22 Aug 2016 20:17:36 -0700] rev 29840
revlog: remove unused variables
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 22 Aug 2016 20:30:37 -0700] rev 29839
util: properly implement lrucachedict.get()
Before, it was returning the raw _lrucachenode instance instead of its
value.
Durham Goode <durham@fb.com> [Wed, 17 Aug 2016 13:25:13 -0700] rev 29838
manifest: change changectx to access manifest via manifestlog
This is the first place where we'll start using manifestctx instances instead of
manifestdict. This will facilitate using different manifestctx implementations
in the future.
Durham Goode <durham@fb.com> [Wed, 17 Aug 2016 13:25:13 -0700] rev 29837
manifest: use property instead of field for manifest revlog storage
The file caches we're using to avoid reloading the manifest from disk everytime
has an annoying bug that causes the in memory structure to not be reloaded if
the mtime and the size haven't changed. This causes a breakage in the tests
because the manifestlog is not being reloaded after a commit+strip operation in
mq (the mtime is the same because it all happens in the same second, and the
resulting size is the same because we add 1 and remove 1). The only reason this
doesn't affect the manifest itself is because we touch it so often that we
had already reloaded it after the commit, but before the strip.
Once the entire manifest has migrated to manifestlog, we can get rid of these
properties, since then the manifestlog will be touched after the commit, but
before the strip, as well.
Durham Goode <durham@fb.com> [Wed, 17 Aug 2016 13:25:13 -0700] rev 29836
manifest: introduce manifestlog and manifestctx classes
This is the start of a large refactoring of the manifest class. It introduces
the new manifestlog and manifestctx classes which will represent the collection
of all manifests and individual instances, respectively.
Future patches will begin to convert usages of repo.manifest to
repo.manifestlog, adding the necessary functionality to manifestlog and instance
as they are needed.
Durham Goode <durham@fb.com> [Wed, 17 Aug 2016 13:25:13 -0700] rev 29835
manifest: make manifest derive from manifestrevlog
As part of our refactoring to split the manifest concept from its storage, we
need to start moving the revlog specific parts of the manifest implementation to
a new class. This patch creates manifestrevlog and moves the fulltextcache onto
the base class.
Durham Goode <durham@fb.com> [Wed, 17 Aug 2016 13:25:13 -0700] rev 29834
manifest: break mancache into two caches
The old manifest cache cached both the inmemory representation and the raw text.
As part of the manifest refactor we want to separate the storage format from the
in memory representation, so let's split this cache into two caches.
This will let other manifest implementations participate in the in memory cache,
while allowing the revlog based implementations to still depend on the full text
caching where necessary.
Augie Fackler <augie@google.com> [Thu, 18 Aug 2016 11:32:02 -0400] rev 29833
dispatch: explicitly pass fancyopts optional arg as a keyword
I've been baffled by this a couple of times (mainly wondering if any
callers of fancyopts.fancyopts that don't use gnu=True exist), so
let's just specify this as a keyword argument to preserve sanity.
Maciej Fijalkowski <fijall@gmail.com> [Sat, 20 Aug 2016 23:05:18 +0200] rev 29832
osutil: fix the bug on OS X when we return more in listdir
The pointer arithmetic somehow got ommitted during the recent change to use
a struct.
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com> [Sun, 21 Aug 2016 08:03:22 +0000] rev 29831
histedit: use samefile function from cmdutil
Replace usage of inefficient samefile function in collapse with a call to
cmdutil.samefile().
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com> [Sun, 21 Aug 2016 08:00:18 +0000] rev 29830
cmdutil: extract samefile function from amend()
Yuya Nishihara <yuya@tcha.org> [Fri, 22 Apr 2016 21:32:30 +0900] rev 29829
templater: rename "right" argument of pad() function
Before, right=True meant right justify, which I think is left padding.
Yuya Nishihara <yuya@tcha.org> [Fri, 22 Apr 2016 21:29:13 +0900] rev 29828
templater: make pad() evaluate boolean argument (BC)
Otherwise it would crash if template expression was passed.
This patch unifies the way how boolean expression is evaluated, which involves
BC. Before "if(true)" and "pad(..., 'false')" were False, which are now True
since they are boolean literal and non-empty string respectively.
"func is runsymbol" is the same hack as evalstringliteral(), which is needed
for label() to take color literals.
Yuya Nishihara <yuya@tcha.org> [Thu, 18 Aug 2016 16:29:22 +0900] rev 29827
templater: fix if() to not evaluate False as bool('False')
Before, False was True. This patch fixes the issue by processing True/False
transparently. The other values (including integer 0) are tested as strings
for backward compatibility, which means "if(latesttagdistance)" never be False.
Should we change the behavior of "if(0)" as well?
Yuya Nishihara <yuya@tcha.org> [Thu, 18 Aug 2016 15:55:07 +0900] rev 29826
templater: make it clearer that _flatten() omits None
Gábor Stefanik <gabor.stefanik@nng.com> [Thu, 18 Aug 2016 17:25:10 +0200] rev 29825
revset: support "follow(renamed.py, e22f4f3f06c3)" (issue5334)
v2: fixes from review
Matt Mackall <mpm@selenic.com> [Wed, 17 Aug 2016 13:43:13 -0500] rev 29824
coal: use inheritance to derive from paper
This illustrates how much simpler this approach is, in particular the
effect of map-relative paths.
Matt Mackall <mpm@selenic.com> [Wed, 17 Aug 2016 13:40:27 -0500] rev 29823
templater: add inheritance support to style maps
We can now specify a base map file:
__base__ = path/to/map/file
That map file will be read and used to populate unset elements of the
current map. Unlike using %include, elements in the inherited class
will be read relative to that path.
This makes it much easier to make custom local tweaks to a style.
Yuya Nishihara <yuya@tcha.org> [Thu, 18 Aug 2016 18:43:48 +0900] rev 29822
killdaemons: prevent killing all user processes by bad pid file
When I was fixing the test-gpg issue, I noticed gpg-connect-agent could print
"-1" as a server pid if command was wrong. I'm not pretty sure but nobody
would want to kill their running applications by mistake.
Yuya Nishihara <yuya@tcha.org> [Wed, 17 Aug 2016 20:56:12 +0900] rev 29821
py3: automatically glob out line numbers from check-py3-compat output
It was boring task to update the result manually.
Yuya Nishihara <yuya@tcha.org> [Wed, 17 Aug 2016 20:52:50 +0900] rev 29820
py3: have check-py3-compat require pygments to get stable result
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Tue, 09 Aug 2016 17:06:35 +0200] rev 29819
computeoutgoing: move the function from 'changegroup' to 'exchange'
Now that all users are in exchange, we can safely move the code in the
'exchange' module. This function is really about processing the argument of a
'getbundle' call, so it even makes senses to do so.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Tue, 09 Aug 2016 17:00:38 +0200] rev 29818
getchangegroup: take an 'outgoing' object as argument (API)
There is various version of this function that differ mostly by the way they
define the bundled set. The flexibility is now available in the outgoing object
itself so we move the complexity into the caller themself. This will allow use
to remove a good share of the similar function to obtains a changegroup in the
'changegroup.py' module.
An important side effect is that we stop calling 'computeoutgoing' in
'getchangegroup'. This is fine as code that needs such argument processing
is actually going through the 'exchange' module which already all this function
itself.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Tue, 09 Aug 2016 22:31:38 +0200] rev 29817
outgoing: add a 'missingroots' argument
This argument can be used instead of 'commonheads' to determine the 'outgoing'
set. We remove the outgoingbetween function as its role can now be handled by
'outgoing' itself.
I've thought of using an external function instead of making the constructor
more complicated. However, there is low hanging fruit to improve the current
code flow by storing some side products of the processing of 'missingroots'. So
in my opinion it make senses to add all this to the class.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Tue, 09 Aug 2016 15:55:44 +0200] rev 29816
outgoing: adds some default value for argument
We are about to introduce a third option to create an outgoing object:
'missingroots'. This argument will be mutually exclusive with 'commonheads' so
we implement some default value handling in preparation.
This will also help use to make more use of outgoing creation around the code
base.
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Tue, 09 Aug 2016 15:26:53 +0200] rev 29815
outgoing: pass a repo object to the constructor
We are to introduce more code constructing such object in the code base. It will
be more convenient to pass a repository object, all current users already
operate at the repository level anyway. More changes to the contructor argument
are coming in later changeset.
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com> [Tue, 16 Aug 2016 08:21:16 +0000] rev 29814
match: remove matchessubrepo method (API)
Since it is no more used in cmdutil.{files,remove} and scmutil.addremove
we remove this method.
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com> [Tue, 16 Aug 2016 08:15:12 +0000] rev 29813
subrepo: cleanup of subrepo filematcher logic
Previously in the worst case we iterated the files in matcher twice and
had a method only for this, which reimplemented logic in subdirmatchers
constructor. So we replaced the method with a subdirmatcher.files() call.
Yuya Nishihara <yuya@tcha.org> [Sun, 14 Aug 2016 14:46:24 +0900] rev 29812
pycompat: delay loading modules registered to stub
Replacement _pycompatstub designed to be compatible with our demandimporter.
try-except is replaced by version comparison because ImportError will no longer
be raised immediately.
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Aug 2016 12:35:15 +0900] rev 29811
py3: import builtin wrappers automagically by code transformer
This should be less invasive than mucking builtins.
Since tokenize.untokenize() looks start/end positions of tokens, we calculates
them from the NEWLINE token of the future import.
Yuya Nishihara <yuya@tcha.org> [Sun, 14 Aug 2016 12:51:21 +0900] rev 29810
py3: provide (del|get|has|set)attr wrappers that accepts bytes
These functions will be imported automagically by our code transformer.
getattr() and setattr() are widely used in our code. We wouldn't probably
want to rewrite every single call of getattr/setattr. delattr() and hasattr()
aren't that important, but they are functions of the same kind.
Yuya Nishihara <yuya@tcha.org> [Sun, 14 Aug 2016 12:44:13 +0900] rev 29809
py3: check python version to enable builtins hack
Future patches will add (del|get|has|set)attr wrappers.
Yuya Nishihara <yuya@tcha.org> [Sun, 14 Aug 2016 12:41:54 +0900] rev 29808
py3: move xrange alias next to import lines
Builtin functions should be available in compatibility code.
Yuya Nishihara <yuya@tcha.org> [Tue, 16 Aug 2016 17:15:54 +0900] rev 29807
check-code: allow assignment to hasattr variable
Yuya Nishihara <yuya@tcha.org> [Mon, 15 Aug 2016 16:07:55 +0900] rev 29806
debugobsolete: add formatter support (issue5134)
It appears that computing index isn't cheap if --rev is specified. That's
why "index" field is available only if --index is specified.
I've named marker.flags() as "flag" because "flags" implies a list or dict
in template world.
Thanks to Piotr Listkiewicz for the initial implementation of this patch.