Manuel Jacob <me@manueljacob.de> [Thu, 09 Jul 2020 12:52:04 +0200] rev 45104
procutil: avoid use of deprecated tempfile.mktemp()
In the previous version, I used tempfile.mktemp() because it seemed to be the
only way to open a file from two processes (the Python documentation says the
file backing NamedTemporaryFile can’t be opened a second time on Windows).
However, it’s possible when passing the O_TEMPORARY flag to the second open.
Source: https://stackoverflow.com/a/
15235559/6366251
Manuel Jacob <me@manueljacob.de> [Wed, 15 Jul 2020 15:09:21 +0200] rev 45103
procutil: make _make_write_all() function private
Because this function isn’t meant for general use (e.g., it’s Python 2-only),
make in a module-private function by prefixing it with `_`.
Yuya Nishihara <yuya@tcha.org> [Mon, 13 Jul 2020 21:14:20 +0900] rev 45102
dispatch: handle late KeyboardInterrupt occurred in run()
User can press Ctrl+C while flushing streams in dispatch.run(). In such case,
I think exiting with 255 is better than printing Python traceback and exiting
with 1.
Yuya Nishihara <yuya@tcha.org> [Mon, 13 Jul 2020 21:06:34 +0900] rev 45101
dispatch: indent run() function
I'll add KeyboardInterrupt handling there.
Yuya Nishihara <yuya@tcha.org> [Thu, 09 Jul 2020 19:16:52 +0900] rev 45100
debuginstall: don't translate encoding messages
While Microsoft trained us to read mojibake text, it doesn't make sense
to print mojibake messages when debugging the exact issue.
Augie Fackler <augie@google.com> [Wed, 15 Jul 2020 10:34:59 -0400] rev 45099
merge with stable
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 06 Jul 2020 15:31:53 +0530] rev 45098
patch: refactor content diffing part in separate fn so extensions can wrap
Right now extdiff uses it's own logic using archival to diff two versions of
file using external diff tools. This makes the extdiff functionality
non-extensible.
This series is an attempt to refactor core patch and diff functionality so that
extdiff can wrap and reuse it. This will help us in using external diffing tools
at more places and not just extdiff command only then.
Differential Revision: https://phab.mercurial-scm.org/D8685
Manuel Jacob <me@manueljacob.de> [Thu, 09 Jul 2020 12:52:04 +0200] rev 45097
tests: check that procutil.std{out,err}.write() returns correct result
On Windows, we currently don’t fully test the case when the stream is connected
to a TTY, but we test the child process side by connecting them to NUL, which
is recognized as a TTY by Python. To make the large write test a bit more
useful besides checking that it doesn’t crash, we can check that the write()
method returns the correct result.
Manuel Jacob <me@manueljacob.de> [Thu, 09 Jul 2020 12:52:42 +0200] rev 45096
tests: add tests for when stdout or stderr is connected to `os.devnull`
The original motivation was that creating PTYs on Windows is not possible, but
`NUL` is recognized as a TTY, so we can have at least some test coverage for
the TTY case. I think it doesn’t hurt to run the test cases on all systems.
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 12:27:58 +0200] rev 45095
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Python 3 offers different kind of streams and it’s not guaranteed for all of
them that calling write() writes all bytes.
When Python is started in unbuffered mode, sys.std{out,err}.buffer are
instances of io.FileIO, whose write() can write less bytes for
platform-specific reasons (e.g. Linux has a 0x
7ffff000 bytes maximum and could
write less if interrupted by a signal; when writing to Windows consoles, it’s
limited to 32767 bytes to avoid the "not enough space" error). This can lead to
silent loss of data, both when using sys.std{out,err}.buffer (which may in fact
not be a buffered stream) and when using the text streams sys.std{out,err}
(I’ve created a CPython bug report for that:
https://bugs.python.org/
issue41221).
Python may fix the problem at some point. For now, we implement our own wrapper
for procutil.std{out,err} that calls the raw stream’s write() method until all
bytes have been written. We don’t use sys.std{out,err} for larger writes, so I
think it’s not worth the effort to patch them.
Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 07:47:04 +0200] rev 45094
procutil: move assignments
This should probably be part of the previous patch, but folding it results in a
less useful word diff, so I decided to keep it separate for review.
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 10:12:04 +0200] rev 45093
procutil: distribute code for stdout
It makes sense to have the distinction between Python 2 and 3 at the top level,
as we have to fight a different kind of battle on each: On Python 3, we get
consistent behavior on all platforms, but need to create correctly-behaving
binary streams. On Python 2, we have to account for platform differences.
Manuel Jacob <me@manueljacob.de> [Tue, 14 Jul 2020 10:25:41 +0200] rev 45092
convert: use bytes for value in extra dict
The keys and values of the extra dict are expected to be bytes. Before this
fix, there was a crash in mercurial.changelog.encodeextra().
Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 03:17:42 +0200] rev 45091
overlayworkingctx: remove unused `nofilechanges()` and `_compact()` methods
Differential Revision: https://phab.mercurial-scm.org/D8733
Manuel Jacob <me@manueljacob.de> [Sat, 11 Jul 2020 03:10:23 +0200] rev 45090
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 45089
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 45088
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 45087
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 45086
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 45085
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 45084
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 45083
merge with stable
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 10:12:56 +0200] rev 45082
procutil: move comment closer to relevant code
Manuel Jacob <me@manueljacob.de> [Fri, 10 Jul 2020 10:03:05 +0200] rev 45081
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.