Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 23 Sep 2015 14:00:16 -0700] rev 26395
unbundle20: allow registering handlers for stream level parameters
As a comment in the code have been asking for, it is now possible to register
piece of code that handle parameters for the stream. I've been wondering is such
function should be class methods or not. I eventually went for externally
decorated methods to stick with the culture of extensibility from an extensions
that apply to bundle2.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 23 Sep 2015 11:55:27 -0700] rev 26394
bundle2: allow to specify unsupported value on error
A client may support an argument but not some of its values (eg: coming
"compression" parameters). We allow this case to be carried in the
exception.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 23 Sep 2015 11:44:52 -0700] rev 26393
bundle2: rename error exception class for unsupported feature
The original name explicitly mention "Part", however it is also used outside of
parts related feature. We rename from 'UnsupportedPartError' to
'BundleUnknownFeatureError' to fix this.
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 23 Sep 2015 11:33:30 -0700] rev 26392
changegroup: use a different compression key for BZ in HG10
For "space saving", bundle1 "strip" the first two bytes of the BZ stream since
they always are 'BZ'. So the current code boostrap the uncompressor with 'BZ'.
This hack is impractical in more generic case so we move it in a dedicated
"decompression".
Anton Shestakov <av6@dwimlabs.net> [Sat, 26 Sep 2015 17:24:12 +0800] rev 26391
monoblue: provide links to branches, tags and bookmarks by name
This is adapted from
cd842821db2c, that was added to paper for 3.5 release.
It adds another way to refer to branches, tags and bookmarks in urls: by name.
It's still possible to navigate to a specific changeset hash, but now you can
get more descriptive urls straight from /summary page, for example.
branchentry template (and so the whole branches table on /summary and
/branches) lost the column that had a plain changeset hash, because tags and
bookmarks don't have this column and also because there is already a way to
address branch by its changeset hash (changeset link just next to it). Maybe we
can instead bring this column with a plain changeset hash to tags and
bookmarks, but this, more terse, new look feels fine.
Anton Shestakov <av6@dwimlabs.net> [Sat, 26 Sep 2015 17:15:58 +0800] rev 26390
gitweb: provide links to branches, tags and bookmarks by name
This is adapted from
cd842821db2c, that was added to paper for 3.5 release.
It adds another way to refer to branches, tags and bookmarks in urls: by name.
It's still possible to navigate to a specific changeset hash, but now you can
get more descriptive urls straight from /summary page, for example.
branchentry template (and so the whole branches table on /summary and
/branches) lost the column that had a plain changeset hash, because tags and
bookmarks don't have this column and also because there is already a way to
address branch by its changeset hash (changeset link just next to it). Maybe we
can instead bring this column with a plain changeset hash to tags and
bookmarks, but this, more terse, new look feels fine.
timeless@mozdev.org [Fri, 25 Sep 2015 03:44:15 -0400] rev 26389
cmdutil: remove HG: prefix from translation strings
timeless@mozdev.org [Fri, 25 Sep 2015 03:47:48 -0400] rev 26388
i18n-zh_CN: annotate broken HG: translations
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 22:07:55 -0700] rev 26387
lock: recognize parent locks while acquiring
This is part of a series that will allow locks to be inherited by subprocesses
in limited circumstances. This patch enables the logic introduced in previous
patches.
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 22:00:51 -0700] rev 26386
test-lock.py: fix testing for forks
The earlier test worked only because the held count went up to 2, so the first
release brought it down to 1. Making a copy of the lock fixes that issue.
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 20:40:00 -0700] rev 26385
test-lock.py: allow PID to be changed in test state
This will be used in upcoming patches to create locks that appear as if they're
being created by child processes.
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 20:22:59 -0700] rev 26384
test-lock.py: add a lock wrapper that allows faking the PID
This will be used in upcoming patches to create locks that appear as if they're
being created by child processes.
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 21:26:37 -0700] rev 26383
lock: add a wrapper to os.getpid() to make testing easier
This will allow us to fake locks across processes more easily.
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 19:52:34 -0700] rev 26382
test-lock.py: move temp dir generation to testcase
In upcoming patches we'll want to create multiple test state objects with a
common test directory.
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 17:33:13 -0700] rev 26381
test-lock.py: copy-edit assertions about file existing
Before: expected lock to exists but actually did not exists
After: expected lock to exist but actually did not exist
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 26 Sep 2015 21:43:13 -0700] rev 26380
revlog: don't flush data file after every added revision
The current behavior of revlogs is to flush the data file when writing
data to it. Tracing system calls revealed that changegroup processing
incurred numerous write(2) calls for values much smaller than the
default buffer size (Python defaults to 4096, but it can be adjusted
based on detected block size at run time by CPython).
The reason we flush revlogs is so readers have all data available.
For example, the current code in revlog.py will re-open the revlog
file (instead of seeking an existing file handle) to read the text
of a revision. This happens when starting a new delta chain when
adding several revisions from changegroups, for example. Yes, this
is likely sub-optimal (we should probably be sharing file descriptors
between readers and writers to avoid the flushing and associated
overhead of re-opening files).
While flushing revlogs is necessary, it appears all callers are
diligent about flushing files before a read is performed (see
buildtext() in _addrevision()), making the flush in
_writeentry() redundant and unncessary. So, we remove it. In practice,
this means we incur a write(2) a) when the buffer is full (typically
4096 bytes) b) when a new delta chain is created rather than after
every added revision. This applies to every revlog, but by volume
it mostly impacts filelogs.
Removing the redundant flush from _writeentry() significantly
reduces the number of write(2) calls during changegroup processing on
my Linux machine. When applying a changegroup of the hg repo based on
my local repo, the total number of write(2) calls during application
of the mercurial/localrepo.py revlogs dropped from 1,320 to 217 with
this patch applied. Total I/O related system calls dropped from 1,577
to 474.
When unbundling a mozilla-central gzipped bundle (264,403 changesets
with 1,492,215 changes to 222,507 files), total write(2) calls
dropped from 1,252,881 to 827,106 and total system calls dropped from
3,601,259 to 3,178,636 - a reduction of 425,775!
While the system call reduction is significant, it appears
to have no impact on wall time on my Linux and Windows machines. Still,
fewer syscalls is fewer syscalls. Surely this can't hurt. If nothing
else, it makes examining remaining system call usage simpler and opens
the door to experimenting with the performance impact of different
buffer sizes.
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 27 Sep 2015 16:08:18 -0700] rev 26379
revlog: use existing file handle when reading during _addrevision
_addrevision() may need to read from revlogs as part of computing
deltas. Previously, we would flush existing file handles and open
a new, short-lived file handle to perform the reading.
If we have an existing file handle, it seems logical to reuse it
for reading instead of opening a new file handle. This patch
makes that the new behavior.
After this patch, revlog files are only reopened when adding
revisions if the revlog is switched from inline to non-inline.
On Linux when unbundling a bundle of the mozilla-central repo, this
patch has the following impact on system call counts:
Call Before After Delta
write 827,639 673,390 -154,249
open 700,103 684,089 -16,014
read 74,489 74,489 0
fstat 493,924 461,896 -32,028
close 249,131 233,117 -16,014
stat 242,001 242,001 0
lstat 18,676 18,676 0
lseek 20,268 20,268 0
ioctl 14,652 13,173 -1,479
TOTAL 3,180,758 2,930,679 -250,079
It's worth noting that many of the open() calls fail due to missing
files. That's why there are many more open() calls than close().
Despite the significant system call reduction, this change does not
seem to have a significant performance impact on Linux.
On Windows 10 (not a VM, on a SSD), this patch appears to reduce
unbundle time for mozilla-central from ~960s to ~920s. This isn't
as significant as I was hoping. But a decrease it is nonetheless.
Still, Windows unbundle performance is still >2x slower than Linux.
Despite the lack of significant gains, fewer system calls is fewer
system calls. If nothing else, this will narrow the focus of potential
areas to optimize in the future.
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 27 Sep 2015 15:59:19 -0700] rev 26378
revlog: always open revlogs for reading and appending
An upcoming patch will teach revlogs to use the existing file
handle to read revision data instead of opening a new file handle
just for quick reads. For this to work, files must be opened for
reading as well.
This patch is merely cosmetic: there are no behavior changes.
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 27 Sep 2015 15:48:35 -0700] rev 26377
revlog: support using an existing file handle when reading revlogs
Currently, the low-level revlog reading code always opens a new file
handle. In some key scenarios, the revlog is already opened and an
existing file handle could be used to read. This patch paves the
road to that by teaching various revlog reading functions to accept
an optional existing file handle to read from.
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 27 Sep 2015 15:31:50 -0700] rev 26376
revlog: add docstring for checkinlinesize()
The name is deceptive: it does more than just "check." Add a docstring
to clarify what's going on.
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 27 Sep 2015 18:46:53 -0700] rev 26375
windows: insert file positioning call between reads and writes
fopen() and fdopen() have a unique-to-Windows requirement that
transitions between read and write operations in files opened
in modes r+, w+, and a+ perform a file positioning call
(fsetpos, fseek, or rewind) in between. While the MSDN docs don't
say what will happen if this is not done, observations reveal
that Python raises an IOError with errno 0. Furthermore, I
/think/ this behavior isn't deterministic. But I can reproduce
it reliably with subsequent patches applied that open revlogs
in a+ mode and perform both reads and writes.
This patch introduces a proxy class for file handles opened
in r+, w+, and a+ mode on Windows. The class intercepts calls
and audits whether a file positioning function has been called
between read and write operations. If not, a dummy, no-op seek
to the current file position is performed. This appears to be
sufficient to "trick" Windows into allowing transitions between
read and writes without raising errors.
Yuya Nishihara <yuya@tcha.org> [Sat, 26 Sep 2015 15:20:32 +0900] rev 26374
tests: suppress verbose output of svn transaction
Subversion 1.9 shows more verbose messages than 1.8 and the tests fail
because of them. These outputs are not important in our tests, so let's
suppress them by -q or grep -v.
Yuya Nishihara <yuya@tcha.org> [Wed, 23 Sep 2015 21:54:47 +0900] rev 26373
formatter: use dict.update() to set arguments passed to write functions
This isn't important, but update() is better than loop in general.
Yuya Nishihara <yuya@tcha.org> [Wed, 23 Sep 2015 21:51:48 +0900] rev 26372
formatter: verify number of arguments passed to write functions
zip() takes the shortest length, which can be a source of bug.
Yuya Nishihara <yuya@tcha.org> [Sat, 26 Sep 2015 11:50:47 +0900] rev 26371
help: unify handling of DEPRECATED/EXPERIMENTAL keywords
This fixes listexts() to exclude translated "(DEPRECATED)" marker correctly.
On the other hand, help_() doesn't need translated keywords, but I don't think
it's worth to separate untranslated keywords just for it.
Yuya Nishihara <yuya@tcha.org> [Sat, 26 Sep 2015 11:38:39 +0900] rev 26370
help: include parens in DEPRECATED/EXPERIMENTAL keywords
In some languages that have no caps, "DEPRECATED" and "deprecated" can be
translated to the same byte sequence. So it is too wild to exclude messages
by _("DEPRECATED").
Yuya Nishihara <yuya@tcha.org> [Sat, 26 Sep 2015 11:25:38 +0900] rev 26369
help: define list of keywords that should be excluded from non-verbose output
This list will be reused by the other deprecated/experimental handling.
Matt Mackall <mpm@selenic.com> [Fri, 25 Sep 2015 23:10:47 -0500] rev 26368
merge with stable
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 25 Sep 2015 13:30:49 -0700] rev 26367
unbundle: cleanly abort on unknown bundle2 feature
The exception wasn't caught and resulted in a traceback.
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Mon, 14 Sep 2015 19:25:34 -0400] rev 26366
phases: return zero for no-op operations (
issue4751) (BC)
It is rather unhelpful to return 1 if there were no changes because
the request matches the current state of phases. So we just undo that.
timeless@mozdev.org [Thu, 24 Sep 2015 14:45:17 -0400] rev 26365
help: add config.troubleshooting section at the top
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Fri, 25 Sep 2015 11:16:20 -0400] rev 26364
dispatch: don't stack trace on commands like `hg .log`
This used to stack trace because it raised a util.Abort which wasn't
handled in this block. We now handle it. Additionally, we error out
earlier instead of plodding on and showing the "log" entry of the
plain `hg help` output.
Anton Shestakov <av6@dwimlabs.net> [Fri, 25 Sep 2015 12:38:20 +0800] rev 26363
gitweb, monoblue: port highlighting linked lines from paper
This is adapted from
41c4bdd1d585,
fbfe5748ef3e and
f3393d458bf5.
Anton Shestakov <av6@dwimlabs.net> [Fri, 25 Sep 2015 03:02:38 +0800] rev 26362
gitweb, monoblue: fix vertical align of spans in .sourcelines
Empty lines in file view could produce an inexplicable margin before the next
line (most noticeable in browsers on webkit/blink engine). That was making
empty lines seem taller than the rest.
Instead of using default vertical align, let's set it to 'top'.
This issue is actually present in paper, and only recently got into gitweb
(
2239626369f5) and monoblue (
119202d4d7a4). There's a bit more to it in paper,
so that will be dealt with in a future patch.
Recipe to see live: preferably using a webkit/blink browser, such as chromium,
browse a file with empty lines, e.g. https://selenic.com/hg/file/3.5/README#l8
Selecting a block of text that includes empty lines will reveal white "breaks"
in the selection. Highlighted line (#l8) also shows such a break below itself.
timeless@mozdev.org [Fri, 25 Sep 2015 00:54:20 -0400] rev 26361
merge: fix mergestate comment
timeless@mozdev.org [Thu, 24 Sep 2015 17:51:05 -0400] rev 26360
rebase: avoid losing branch commits with --keepbranch (
issue4835)
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 16:03:26 -0700] rev 26359
lock.release: do not unlink inherited locks
This is part of a series that will allow locks to be inherited by subprocesses
in limited circumstances. A subprocess unlinking a lock will lead to potential
corruption from other concurrent processes.
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 16:00:41 -0700] rev 26358
lock: add a method to reacquire the lock after subprocesses exit
This is part of a series that will allow locks to be inherited by subprocesses
in limited circumstances.
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 10:37:13 -0700] rev 26357
lock: add a method to prepare the lock for inheritance
This is part of a series that will allow locks to be inherited by subprocesses
in limited circumstances.
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 15:57:11 -0700] rev 26356
lock: introduce state to keep track of inheritance
This is part of a series that will allow locks to be inherited by subprocesses
in limited circumstances. In upcoming patches we will refer to this state.
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 10:53:16 -0700] rev 26355
error: add an exception to indicate lock inheritance API contract violations
Sean Farley <sean@farley.io> [Thu, 24 Sep 2015 15:52:11 -0700] rev 26354
clone: check update rev for being True
In
30be3aeb5344, there was an attempt to fallback to looking up the update
revision assuming it was always a rev but the documentation states:
True means update to default rev, anything else is treated as a revision
Therefore, we should only fallback to looking up the update rev if it is not
True. This bug was found in hg-git and I couldn't think of a test that does
this in pure Mercurial since the source repository is checked for the revision
as well (and therefore gracefully falls back).
Sean Farley <sean@farley.io> [Thu, 24 Sep 2015 15:47:23 -0700] rev 26353
clone: fix over-indented continuation line
timeless@mozdev.org [Fri, 25 Sep 2015 03:51:46 -0400] rev 26352
resolve: consistently describe re-merge + unresolved
liscju <piotr.listkiewicz@gmail.com> [Thu, 10 Sep 2015 16:53:07 +0200] rev 26351
mercurial: add debugextensions command (
issue4676)
Add debugextensions command to help users debug their extension
problems. If there are no extensions command prints nothing,
otherwise it prints names of extension modules. If quiet or
verbose option is not specified it prints(after extensions name)
last version of mercurial in which given module was tested for
non internal modules or not tested with user mercurial version.
If verbose is specified it prints following information for every
extension: extension name, import source, testedwith and buglink
information.
Extensions are printed sorted by extension name.
Daniel Colascione <dancol@fb.com> [Thu, 24 Sep 2015 10:15:37 +0300] rev 26350
dispatch: stop warning about EPIPE in --debug mode
It seems silly for "hg --debug manifest | less" to print a scary
message after the user hits "q" in less. hg should just exit silently
instead, since EPIPE on stdout is a perfectly reasonable result.
Laurent Charignon <lcharignon@fb.com> [Mon, 14 Sep 2015 17:31:48 -0700] rev 26349
rebase: don't rebase obsolete commit whose successor is already rebased
This patch avoids unnecessary conflicts to resolve during rebase for the users
of changeset evolution.
This patch modifies rebase to skip obsolete commits if they are being rebased on
their successors.
It introduces a new rebase state 'revprecursor' for these revisions that are
being skipped and a new message to inform the user of what is happening.
This feature is gated behind the config flag experimental.rebaseskipobsolete
When an obsolete commit is skipped, the output is:
not rebasing 14:
9ad579b4a5de "I", already in destination as 17:
fc37a630c901 "K"
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 24 Sep 2015 00:34:15 -0700] rev 26348
check-code: forbid mutable value for default argument
default value are common to all call. Using mutable value is a classical source
of bug in Python. We forbid it.
The regexp (Courtesy of Matt Mackall) is only catching such value on the first
line of a definition, but that will be good enough for now.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 24 Sep 2015 00:54:30 -0700] rev 26347
httpconnection: remove a mutable default argument
Mutable default arguments are know to the state of California to cause bugs.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 24 Sep 2015 00:52:21 -0700] rev 26346
transplant: remove a mutable default argument
Mutable default arguments are know to the state of California to cause bugs.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 24 Sep 2015 00:50:06 -0700] rev 26345
mq: remove a mutable default argument
Mutable default arguments are know to the state of California to cause bugs. The
underlying function already handle "None" as an option value, so we do not need
to do anything else.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 24 Sep 2015 00:49:02 -0700] rev 26344
largefiles: remove a mutable default argument
Mutable default arguments are know to the state of California to cause bugs.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 24 Sep 2015 00:48:24 -0700] rev 26343
largefiles: remove a mutable default argument
Mutable default arguments are know to the state of California to cause bugs.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 24 Sep 2015 00:48:02 -0700] rev 26342
largefiles: remove a mutable default argument
Mutable default arguments are know to the state of California to cause bugs.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 24 Sep 2015 00:46:37 -0700] rev 26341
largefiles: remove a mutable default argument
Mutable default arguments are know to the state of California to cause bugs.
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 24 Sep 2015 00:46:12 -0700] rev 26340
largefiles: remove a mutable default argument
Mutable default arguments are know to the state of California to cause bugs.