Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 03:10:23 +0200] rev 45091
rebase: correctly check for empty commit in in-memory mode
The new code has a small overhead in the empty commit case, as a `memctx` object
is always created, but I don’t think it’s justified here to duplicate code
to optimize a relatively unlikely code path.
Differential Revision: https://phab.mercurial-scm.org/D8732
Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 02:13:19 +0200] rev 45090
memctx: make `parents()` return list of one element if it’s not a merge
It is part of the contract of `parents()` that non-merges return a list of one
element. `self._parents` is always a list of two elements in `memctx`.
Differential Revision: https://phab.mercurial-scm.org/D8731
Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 01:14:00 +0200] rev 45089
commit: factor out empty commit check to `basectx.isempty()`
This enables reuse in other places, e.g. those dealing with `memctx`.
Differential Revision: https://phab.mercurial-scm.org/D8729
Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 00:53:34 +0200] rev 45088
overlayworkingctx: rename misleadingly named `isempty()` method
This method is only about whether there are file changes, not about whether the
commit will be empty or not.
One user of the method was incorrectly assuming the latter meaning, leading to
the bug for which a test case was added in D8727. I’ve added a FIXME to the
code.
The original motivation for the rename was that I want to add
`committablectx.isempty()`, that properly checks if a commit will be empty,
using the exact same logic as in `repo.commit()`, and I wanted to avoid a name
clash.
Differential Revision: https://phab.mercurial-scm.org/D8728
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 01:36:19 +0200] rev 45087
rebase: add test case that shows that inmemory rebase does not preserve merges
Differential Revision: https://phab.mercurial-scm.org/D8727
Manuel Jacob <me@manueljacob.de> [Thu, 09 Jul 2020 07:00:32 +0200] rev 45086
rebase: remove now unnecessary logic to allow empty commit when branch changes
This was a workaround for a bug in the empty commit check in repo.commit(),
where the parent branch name was incorrectly compared with the wdir branch name
instead of the branch name passed via `extra`. The bug was fixed in D8724.
The workaround was introduced in b2415e94b2f5.
Differential Revision: https://phab.mercurial-scm.org/D8725
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 00:44:18 +0200] rev 45085
commit: check branch change on to-be-committed changeset
This makes a difference when a branch name is passed via the `extra` argument,
which will be used as the branch name for the created changeset. The empty
commit check should use that branch name instead of whatever was set on the
working directory.
Besides fixing the bug for which a test case was extended, it enables to remove
a workaround in the rebase extension, which will be done in a follow-up patch
(D8725).
Differential Revision: https://phab.mercurial-scm.org/D8724
Augie Fackler <augie@google.com> [Mon, 13 Jul 2020 13:06:12 -0400] rev 45084
merge with stable
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 10:12:56 +0200] rev 45083
procutil: move comment closer to relevant code
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 10:03:05 +0200] rev 45082
procutil: use mercurial.windows.winstdout only on Python 2 and TTYs
Python 3 already works around the bug. The workaround is only needed when
writing to consoles. If stdout is a console, sys.stdout.isatty() is true.
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 09:59:36 +0200] rev 45081
procutil: split if condition
This prepares the code for subsequent changes where we need to differentiate
between the two cases.
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 09:55:38 +0200] rev 45080
procutil: explain better why line buffering is not possible
The sentence “On Python 3, buffered binary streams can't be set line-buffered.”
was imprecise, as all streams are just Python classes and we can implement our
own (which we did).
Manuel Jacob <me@manueljacob.de> [Tue, 07 Jul 2020 12:13:40 +0200] rev 45079
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 06:03:22 +0200] rev 45078
procutil: back out 8403cc54bc83 (make ....procutil.stderr unbuffered)
Changeset 8403cc54bc83 introduced code that opens a second file object
referring to the stderr file descriptor. This broke tests on Windows. The
reason is that on Windows, sys.stderr is buffered and procutil.stderr closed
the file descriptor when it got garbage collected before sys.stderr had the
chance to flush buffered data.
`procutil.stdout` had the same problem for a long time, but we didn’t realize,
as in CI test runs, stdout is not a TTY and in this case no second file object
is opened.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 09 Jul 2020 02:16:26 +0200] rev 45077
test-clone-uncompressed: use config to silence the lock warning
The ui.timeout.warn option can solve the issue6237 in a cleaner way than what
was done in 752da6863e39. That way, possible other unexpected error output will
not be silenced.
Differential Revision: https://phab.mercurial-scm.org/D8726
Joerg Sonnenberger <joerg@bec.de> [Thu, 21 May 2020 18:18:50 +0200] rev 45076
hooklib: fix detection of successors for changeset_obsoleted
Provide a hook for obsutil.getobsolete to be used with either a
transaction or the changes item of the transaction, since hooks only
have access to the latter. Use that to find the correct list of
revisions with obsmarkers, even new ones, and then filter out revisions
with known successors.
Move the processing from pretxnclose to txnclose as the transaction
access itself is no longer necessary. This is more in line with notify
and ensures that sanity checks can abort the transaction first.
Differential Revision: https://phab.mercurial-scm.org/D8575
Rodrigo Damazio Bovendorp <rdamazio@google.com> [Thu, 09 Jul 2020 20:46:52 -0700] rev 45075
fix: prefetch file contents
This prevents the worker subprocesses from contacting the server individually,
which is either inefficient, or leads to problems if the connection is shared
among them.
Differential Revision: https://phab.mercurial-scm.org/D8723
Rodrigo Damazio Bovendorp <rdamazio@google.com> [Thu, 09 Jul 2020 20:45:35 -0700] rev 45074
fix: obtain base paths before starting workers
This moves calculation of base paths to before work is dispatched.
While this does mean that copy tracing will be serialized instead of
parallel, it is necessary to be able to prefetch the base contents
in a batch, which will likely be more efficient.
Differential Revision: https://phab.mercurial-scm.org/D8722
Rodrigo Damazio Bovendorp <rdamazio@google.com> [Thu, 09 Jul 2020 18:48:55 -0700] rev 45073
scmutil: allowing different files to be prefetched per revision
The old API takes a list of revision separate from the file matcher, and thus
provides no way to fetch different sets of files from each revision. In
preparation for adding one such usage, I'm changing the API to take a list of
(revision, file matcher) tuples instead.
Differential Revision: https://phab.mercurial-scm.org/D8721
Pulkit Goyal <7895pulkit@gmail.com> [Sat, 11 Jul 2020 00:31:21 +0530] rev 45072
tests: update test-devel-warnings.t output with chg
Manuel Jacob <me@manueljacob.de> [Tue, 07 Jul 2020 11:10:07 +0200] rev 45071
tests: make names in test-stdio.py more distinctive
This way, more tests can be added without name clashes.
Manuel Jacob <me@manueljacob.de> [Tue, 07 Jul 2020 12:35:29 +0200] rev 45070
tests: terminate subprocess in test-stdio.py in case of exception
If an error happened while reading the output of the subprocess, the pipe / TTY
buffer can fill up and prevent that the subprocess ends. Therefore we should
terminate the subprocess in case of an exception.
Manuel Jacob <me@manueljacob.de> [Tue, 07 Jul 2020 11:06:37 +0200] rev 45069
tests: proof test-stdio.py against buffer fill-up
With the previous code, it could in theory happen that the pipe / PTY buffer of
the child stdout / stderr fills up and the process never finishes.
To prevent that, we read all of the stream before waiting for the end of the
process. To ensure that the stream reaches EOF when the child finishes, we must
close the parent "copy" of the child stdout / stderr.
Matt Harbison <matt_harbison@yahoo.com> [Thu, 09 Jul 2020 23:03:34 -0400] rev 45068
tests: stablize test-serve.t on Windows
I forget the reason that the subprocess on Windows doesn't print this, but all
other instances of this are similarly conditionalized, so I didn't think too
hard about it.
Also, the server needs to be killed so it doesn't prevent the next run from
working, especially since the port isn't randomized.
Differential Revision: https://phab.mercurial-scm.org/D8720
Pierre-Yves David <pierre-yves.david@octobus.net> [Mon, 06 Jul 2020 21:08:15 +0200] rev 45067
commitctx: document the manifest writing function
Same spirit as for `_filecommit` lets document the input and output before
making any change or improvement.
This is part of a larger refactoring/cleanup of the commitctx code to clarify
and augment the logic gathering metadata useful for copy tracing. The current
code is a tad too long and entangled to make such update easy. We start with
easy and small cleanup.
Differential Revision: https://phab.mercurial-scm.org/D8705
Pierre-Yves David <pierre-yves.david@octobus.net> [Mon, 06 Jul 2020 19:16:04 +0200] rev 45066
commitctx: reorder some conditional for efficiency in _filecommit
Checking if a dict is empty will be faster than comparing text. I don't expect
it to be a huge performance win, but still a good (but gratuitous) cleanup to
do while we are at it.
This is part of a larger refactoring/cleanup of the commitctx code to clarify
and augment the logic gathering metadata useful for copy tracing. The current
code is a tad too long and entangled to make such update easy. We start with
easy and small cleanup.
Differential Revision: https://phab.mercurial-scm.org/D8701
Pierre-Yves David <pierre-yves.david@octobus.net> [Mon, 06 Jul 2020 18:52:19 +0200] rev 45065
commitctx: document _filecommit input and output
This is the beginning of a larger refactoring/cleanup of the commitctx code to
clarify and augment the logic gathering metadata useful for copy tracing. The
current code is a tad too long and entangled to make such update easy. We start
with easy and small cleanup.
Differential Revision: https://phab.mercurial-scm.org/D8699
Joerg Sonnenberger <joerg@bec.de> [Tue, 07 Jul 2020 21:57:46 +0200] rev 45064
phases: replace magic number by constant
Differential Revision: https://phab.mercurial-scm.org/D8695
Joerg Sonnenberger <joerg@bec.de> [Mon, 22 Jun 2020 00:00:07 +0200] rev 45063
clonebundles: optional memory-requirement attribution
The new REQUIREDRAM option allows a client to skip bundles it isn't
expected to handle well, e.g. without swapping. This allows a fallback
path to be provided e.g. using zstd level 10 instead of 22.
Differential Revision: https://phab.mercurial-scm.org/D8645
Joerg Sonnenberger <joerg@bec.de> [Tue, 09 Jun 2020 11:22:31 +0200] rev 45062
util: provide a helper function to estimate RAM size
For POSIX systems, it uses sysconf. For Windows, it uses the win32 API
directly.
Differential Revision: https://phab.mercurial-scm.org/D8644
Joerg Sonnenberger <joerg@bec.de> [Thu, 02 Jul 2020 19:59:59 +0200] rev 45061
tests: allow timing difference in output
Differential Revision: https://phab.mercurial-scm.org/D8676
Pierre-Yves David <pierre-yves.david@octobus.net> [Mon, 22 Jun 2020 13:32:20 +0200] rev 45060
documentation: add some internals documentation about bid merge
This is an important algorithm that was only documented on the wiki so far.
Some update to the algorithm (and associated doc) is to expected in the future
since the bid merge algorithm is bug-ridden when it comes to file deletion comes
to play.
Differential Revision: https://phab.mercurial-scm.org/D8711
Yuya Nishihara <yuya@tcha.org> [Sun, 28 Jun 2020 17:32:32 +0900] rev 45059
cmdserver: document message-encodings and channel output options
While writing the previous patch, I noticed these options are undocumented.
In my testing, a separate status/error message channel works well in GUI
frontend as we no longer have to sort out data and message from mixed outputs.
So let's mark it as not experimental.
Yuya Nishihara <yuya@tcha.org> [Sat, 27 Jun 2020 21:46:23 +0900] rev 45058
cmdserver: add option to not exit from message loop on SIGINT
Sending SIGINT to server is the only way to interrupt a command running in
command-server process. SIGINT will be caught at dispatch.dispatch() if
we're lucky. Otherwise it will terminate the serer process. This is
fundamentally unreliable as signals are delivered asynchronously.
"cmdserver.shutdown-on-interrupt=False" mitigate the issue by making the
server basically block SIGINT.
Manuel Jacob <me@manueljacob.de> [Mon, 06 Jul 2020 17:51:18 +0200] rev 45057
pycompat: remove pycompat.{stdin,stdout,stderr}
All users have been changed to use procutil.{stdin,stdout,stderr}, which provide
consistent behavior across platforms and Python versions.
Manuel Jacob <me@manueljacob.de> [Mon, 06 Jul 2020 17:44:25 +0200] rev 45056
pycompat: change users of pycompat.{stdin,stdout,stderr} to use procutil.std*
On Python 3, pycompat.{stdin,stdout,stderr} are usually block-buffered even if
connected to a TTY. procutil.{stdin,stdout,stderr} provide consistent behavior
across platforms and Python versions.
Antoine Cezar <antoine.cezar@octobus.net> [Mon, 06 Jul 2020 10:30:55 +0200] rev 45055
hgignore: add mypy cache files
Differential Revision: https://phab.mercurial-scm.org/D8692
Joerg Sonnenberger <joerg@bec.de> [Mon, 06 Jul 2020 14:30:13 +0200] rev 45054
revlog: avoid hard-coded hash sizes
Differential Revision: https://phab.mercurial-scm.org/D8683
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 03 Jul 2020 19:00:01 +0200] rev 45053
test: restore expected output in test-persistent-nodemap.t
The merge 78cafd48b9b2 had a small error and wrongly dropped the output updated
from one side of the merge.
This changeset re-install it.
Differential Revision: https://phab.mercurial-scm.org/D8678
Antoine Cezar <antoine.cezar@octobus.net> [Mon, 06 Jul 2020 09:30:26 +0200] rev 45052
heptapod-ci: build rhg before tests run
Differential Revision: https://phab.mercurial-scm.org/D8682
Antoine Cezar <antoine.cezar@octobus.net> [Tue, 07 Jul 2020 14:05:15 +0530] rev 45051
rhg: add a limited `rhg root` subcommand
Clap has been choosen for argument parsing for the following reasons:
- it's a wildly used and maintained crate
- it can deal with OS encoding making it suitable for any encoding
- it supports nonambiguous prefix matching as already available in hg
- it will soon allow for structopts-style declarative pattern instead of the
currently used builder pattern
Differential Revision: https://phab.mercurial-scm.org/D8613
Antoine Cezar <antoine.cezar@octobus.net> [Fri, 05 Jun 2020 09:01:35 +0200] rev 45050
rhg: add RootCommand using hg-core FindRoot operation to prepare `hg root`
The println macro is not used to avoid string usage.
Dealing only with bytes allows us to be compatible with any encoding
and not just UTF8.
Later on, format macro will be made to have more readable code.
Differential Revision: https://phab.mercurial-scm.org/D8612
Augie Fackler <augie@google.com> [Mon, 06 Jul 2020 22:02:50 -0400] rev 45049
merge with stable
Manuel Jacob <me@manueljacob.de> [Sun, 05 Jul 2020 13:09:22 +0200] rev 45048
procutil: make mercurial.utils.procutil.stderr unbuffered
For most Mercurial code, it doesn’t make a difference, as the ui object flushes
stderr explicitly (after the change, we could get rid of the explicit flush).
One example where it makes a observable difference is mercurial.util.timed().
Without the patch, the time is not immediately shown on Python 3. With the
patch, it’s shown immediately on all Python versions and platforms.
Manuel Jacob <me@manueljacob.de> [Sun, 05 Jul 2020 13:05:06 +0200] rev 45047
tests: generalize common test case code in test-stdio.py
Manuel Jacob <me@manueljacob.de> [Sat, 04 Jul 2020 11:41:39 +0200] rev 45046
procutil: make stdout line-buffered on Windows if connected to TTY
Windows doesn’t support line buffering. Previously, we worked around that by
setting the stream unbuffered. Instead, we can use our own line buffering we
already use on Python 3.
Manuel Jacob <me@manueljacob.de> [Sat, 04 Jul 2020 11:21:44 +0200] rev 45045
procutil: split import and reassignment
Besides making the code clearer, it will reduce the diff in the next patch.
Manuel Jacob <me@manueljacob.de> [Sat, 04 Jul 2020 11:15:58 +0200] rev 45044
procutil: move assignments closer to reassignments
Doing reassignments is an anti-pattern IMHO, but I see how it makes sense here.
When first looking at this code after jumping here with ctags, I missed the
fact that stdout was reassigned. To make the code clearer, the assignments
should be as close as possible to the reassignments.
Manuel Jacob <me@manueljacob.de> [Sat, 04 Jul 2020 12:15:41 +0200] rev 45043
procutil: factor out conditional creation of LineBufferedWrapper
At the same time, document the logic and generalize it to work on all Python
versions.
Manuel Jacob <me@manueljacob.de> [Thu, 02 Jul 2020 04:37:18 +0200] rev 45042
procutil: define LineBufferedWrapper on all Python versions
There’s nothing Python 3-only about LineBufferedWrapper. In the future, we may
want to use it on Windows, to work around missing line-buffering support.
Manuel Jacob <me@manueljacob.de> [Sat, 04 Jul 2020 10:47:04 +0200] rev 45041
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de> [Thu, 02 Jul 2020 02:51:09 +0200] rev 45040
cleanup: use slightly more meaningful name for temporary variable
Not that it makes a big difference, but using `p` instead of `x` is clearer to
me.
Manuel Jacob <me@manueljacob.de> [Thu, 02 Jul 2020 02:46:15 +0200] rev 45039
cleanup: use any() instead of checking truthiness of temporary list
It was not immediately obvious to me, when first seeing this, why a list was
created. It needed a second look to understand that the purpose was to check
whether the condition is true for any of the parents. Using any() for that is
clearer.
Pulkit Goyal <7895pulkit@gmail.com> [Fri, 03 Jul 2020 13:45:59 +0530] rev 45038
chg: suppress OSError in _restoreio() and add some logging (issue6330)
According to issue6330, running chg on heavy loaded systems can lead to
following error:
```
Traceback (most recent call last):
File "path-to-hg/mercurial/commandserver.py", line 650, in _acceptnewconnection
self._runworker(conn)
File "path-to-hg/mercurial/commandserver.py", line 701, in _runworker
prereposetups=[self._reposetup],
File "path-to-hg/mercurial/commandserver.py", line 470, in _serverequest
sv.cleanup()
File "path-to-hg/mercurial/chgserver.py", line 381, in cleanup
self._restoreio()
File "path-to-hg/mercurial/chgserver.py", line 444, in _restoreio
os.dup2(fd, fp.fileno())
OSError: [Errno 16] Device or resource busy
```
[man dup2] indicates that, on Linux, EBUSY comes from a race condition
between open() and dup2().
However it's not clear why open() race occurred for newfd=stdin/out/err.
We suppress the OSError in _restoreio() since the forked worker process will
finish anyway and add some logging.
Thanks to Mitchell Plamann for a detailed bug description and Yuya Nishihara for
suggesting the fix.
Joerg Sonnenberger <joerg@bec.de> [Thu, 02 Jul 2020 19:54:44 +0200] rev 45037
ui: fix Python 2.7 support for ui.timestamp-output
Differential Revision: https://phab.mercurial-scm.org/D8675
Augie Fackler <augie@google.com> [Wed, 01 Jul 2020 14:28:12 -0400] rev 45036
merge with stable
Joerg Sonnenberger <joerg@bec.de> [Thu, 18 Jun 2020 15:13:38 +0200] rev 45035
ui: add option to timestamp status and diagnostic messages
Differential Revision: https://phab.mercurial-scm.org/D8640
Yuya Nishihara <yuya@tcha.org> [Mon, 29 Jun 2020 20:53:32 +0900] rev 45034
merge with stable
Manuel Jacob <me@manueljacob.de> [Sun, 28 Jun 2020 17:52:29 +0200] rev 45033
compat: back out a25343d16ebe (initialize LC_CTYPE locale on all Python ...)
As Yuya Nishihara pointed out, setting LC_CTYPE changes the behavior of some
str methods on Python 2.
Manuel Jacob <me@manueljacob.de> [Sun, 28 Jun 2020 17:49:14 +0200] rev 45032
curses: back out d2227d4c9e6b (do not initialize LC_ALL to user settings)
The changeset was based on a25343d16ebe, which will be backed out, too.
Another fix for the problem will be resubmitted to the stable branch.
Julien Cristau <jcristau@debian.org> [Thu, 25 Jun 2020 11:22:34 +0200] rev 45031
test: redirect stderr so warning messages don't change output (issue6237)
clone and commit race for the lock, and if commit has to wait more than
a second it prints a warning to stderr. Since this is somewhat expected
here, silence it.
Differential Revision: https://phab.mercurial-scm.org/D8664
Martin von Zweigbergk <martinvonz@google.com> [Thu, 25 Jun 2020 12:02:34 -0700] rev 45030
locks: expect repo lock, not wlock, when writing to .hg/strip-backup/
There should be no need for a working copy lock when creating (or
reading) bundles in `.hg/strip-backup/` since they don't affect the
working copy.
I noticed this because we have an extension that tries to strip some
revisions while holding only a repo lock. I guess we have no such
cases in core, which seems a bit surprising. Maybe we always take a
wlock at a higher level so the working copy is not updated while the
target commit is being stripped.
Differential Revision: https://phab.mercurial-scm.org/D8666
Martin von Zweigbergk <martinvonz@google.com> [Thu, 25 Jun 2020 13:37:56 -0700] rev 45029
graft: leverage cmdutil.check_incompatible_arguments() for --abort/--stop
Differential Revision: https://phab.mercurial-scm.org/D8669
Martin von Zweigbergk <martinvonz@google.com> [Thu, 25 Jun 2020 13:29:05 -0700] rev 45028
graft: leverage cmdutil.check_incompatible_arguments() for --no-commit
Differential Revision: https://phab.mercurial-scm.org/D8668