Mon, 13 Jun 2022 11:18:41 -0400 windows: drop some py2 compatibility code
Matt Harbison <matt_harbison@yahoo.com> [Mon, 13 Jun 2022 11:18:41 -0400] rev 49318
windows: drop some py2 compatibility code The comment was wrong- the exception handler was the py3 case.
Mon, 13 Jun 2022 11:06:33 -0400 windows: prevent bytes from being passed to registry APIs
Matt Harbison <matt_harbison@yahoo.com> [Mon, 13 Jun 2022 11:06:33 -0400] rev 49317
windows: prevent bytes from being passed to registry APIs There was a TortoiseHg bug report in this area[1], and from inspection, it looks like passing `b""` as `valname` would fail to convert to unicode. The underlying API allows both `""` and `NULL` to return the default value for the key. [1] https://foss.heptapod.net/mercurial/tortoisehg/thg/-/issues/5803
Thu, 02 Jun 2022 16:56:39 +0200 relnotes: add 6.1.3
Raphaël Gomès <rgomes@octobus.net> [Thu, 02 Jun 2022 16:56:39 +0200] rev 49316
relnotes: add 6.1.3
Thu, 12 May 2022 13:53:50 +0400 logcmdutil: use the same data as {file*} template keywords (issue6642) stable
Anton Shestakov <av6@dwimlabs.net> [Thu, 12 May 2022 13:53:50 +0400] rev 49315
logcmdutil: use the same data as {file*} template keywords (issue6642) Since 0c72eddb4be5 template keywords that show files use a different source of data than ctx.p1().status(ctx). These two functions in logcmdutil also show file lists when needed (e.g. log with --debug flag), but previously they used the old way of just looking at status compared to p1 and it resulted in differences between e.g. hg log --debug and hg log -T '{file*}'. test-phases.t needs an adjustment because 7 is a merge commit of two topological branches and one of them introduces files C, D and E.
Thu, 12 May 2022 13:52:10 +0400 tests: show that hg log --debug output differs from {file*} template keywords stable
Anton Shestakov <av6@dwimlabs.net> [Thu, 12 May 2022 13:52:10 +0400] rev 49314
tests: show that hg log --debug output differs from {file*} template keywords hg log --debug -T xml doesn't differ, but let's test it because we can.
Wed, 01 Jun 2022 01:45:49 +0200 cleanup: return directly instead of assigning variable
Manuel Jacob <me@manueljacob.de> [Wed, 01 Jun 2022 01:45:49 +0200] rev 49313
cleanup: return directly instead of assigning variable
Wed, 01 Jun 2022 01:30:48 +0200 commit: remove special handling of IOError (actually dead code)
Manuel Jacob <me@manueljacob.de> [Wed, 01 Jun 2022 01:30:48 +0200] rev 49312
commit: remove special handling of IOError (actually dead code) In the past, IOError was used to mark a file as removed. The differentiation between OSError and IOError in this place was introduced in e553a425751d, to avoid that “normal” OSErrors / IOErrors accidentally mark files as removed. This weird internal API was removed in 650b5b6e75ed. It seems like that changeset should have removed the differentiation, at least I don’t see any reason for keeping it. On Python 3, OSError and IOError are aliased. Therefore the removed code was actually dead.
Wed, 01 Jun 2022 02:21:41 +0200 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de> [Wed, 01 Jun 2022 02:21:41 +0200] rev 49311
py3: catch specific OSError subclasses instead of checking errno On Python 3, the "not a directory" error is mapped to ENOTDIR instead of EINVAL. Therefore, catching the NotADirectoryError subclass is sufficient.
Wed, 01 Jun 2022 00:47:25 +0200 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de> [Wed, 01 Jun 2022 00:47:25 +0200] rev 49310
py3: catch specific OSError subclasses instead of checking errno Contrary to the previous changesets in this series, this covers cases where errno was checked for multiple values. EACCES -> PermissionError ENOENT -> FileNotFoundError ENOTDIR -> NotADirectoryError EISDIR -> IsADirectoryError
Tue, 31 May 2022 23:45:33 +0200 py3: catch ProcessLookupError instead of checking errno == ESRCH
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 23:45:33 +0200] rev 49309
py3: catch ProcessLookupError instead of checking errno == ESRCH
Tue, 31 May 2022 23:41:15 +0200 py3: catch PermissionError instead of checking errno == EPERM
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 23:41:15 +0200] rev 49308
py3: catch PermissionError instead of checking errno == EPERM
Tue, 31 May 2022 23:38:51 +0200 py3: catch PermissionError instead of checking errno == EACCES
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 23:38:51 +0200] rev 49307
py3: catch PermissionError instead of checking errno == EACCES
Tue, 31 May 2022 22:50:01 +0200 py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 22:50:01 +0200] rev 49306
py3: catch FileNotFoundError instead of checking errno == ENOENT
Tue, 31 May 2022 21:16:17 +0200 py3: catch FileExistsError instead of checking errno == EEXIST
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 21:16:17 +0200] rev 49305
py3: catch FileExistsError instead of checking errno == EEXIST
Tue, 31 May 2022 16:54:58 +0200 py3: catch BrokenPipeError instead of checking errno == EPIPE
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 16:54:58 +0200] rev 49304
py3: catch BrokenPipeError instead of checking errno == EPIPE
Tue, 31 May 2022 04:18:22 +0200 py3: catch ChildProcessError instead of checking errno == ECHILD
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 04:18:22 +0200] rev 49303
py3: catch ChildProcessError instead of checking errno == ECHILD
Tue, 31 May 2022 04:11:34 +0200 py3: remove retry on EINTR errno
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 04:11:34 +0200] rev 49302
py3: remove retry on EINTR errno Since the implementation of PEP 475 (Python 3.5), Python retries system calls failing with EINTR. Therefore we don’t need the logic that retries it in Python code.
Tue, 31 May 2022 03:39:42 +0200 py3: stop catching TypeError that was raised on Python 2
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 03:39:42 +0200] rev 49301
py3: stop catching TypeError that was raised on Python 2
Tue, 31 May 2022 03:06:05 +0200 py3: use `x.hex()` instead of `pycompat.sysstr(node.hex(x))`
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 03:06:05 +0200] rev 49300
py3: use `x.hex()` instead of `pycompat.sysstr(node.hex(x))`
Tue, 31 May 2022 02:47:22 +0200 tests: assume that `raw` attribute is present on original socket file object
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 02:47:22 +0200] rev 49299
tests: assume that `raw` attribute is present on original socket file object It seems like the original socket file object is always an io.BufferedIO instance. If not, the code will fail and we should try harder to get the socket object (e.g. if the original socket file object is unbuffered, we can get the `_sock` attribute directly from it).
Tue, 31 May 2022 02:36:05 +0200 tests: constant-fold a `pycompat.ispy3` in testlib/badserverext.py
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 02:36:05 +0200] rev 49298
tests: constant-fold a `pycompat.ispy3` in testlib/badserverext.py
Tue, 31 May 2022 02:19:07 +0200 tests: remove Python 2 special cases in test-stdio.py
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 02:19:07 +0200] rev 49297
tests: remove Python 2 special cases in test-stdio.py
Sun, 29 May 2022 15:43:21 +0200 py3: remove dead code to make file descriptors non-inheritable
Manuel Jacob <me@manueljacob.de> [Sun, 29 May 2022 15:43:21 +0200] rev 49296
py3: remove dead code to make file descriptors non-inheritable On Python 3, file descriptors are already non-inheritable by default.
Sun, 29 May 2022 15:53:01 +0200 py3: remove hack that removed flush argument from print() calls on Python 2
Manuel Jacob <me@manueljacob.de> [Sun, 29 May 2022 15:53:01 +0200] rev 49295
py3: remove hack that removed flush argument from print() calls on Python 2
Sun, 29 May 2022 16:12:27 +0200 py3: remove long() compatibility code
Manuel Jacob <me@manueljacob.de> [Sun, 29 May 2022 16:12:27 +0200] rev 49294
py3: remove long() compatibility code
Tue, 31 May 2022 02:04:24 +0200 zeroconf: constant-fold a `pycompat.ispy3`
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 02:04:24 +0200] rev 49293
zeroconf: constant-fold a `pycompat.ispy3` I’ve checked that both bytes and str gets passed as the `name` parameter, so the rest of the condition is still required. Because there aren’t really any tests for the extensions, I didn’t want to refactor it to pass a single type.
Tue, 31 May 2022 01:23:19 +0200 py3: remove conditional to import collections.abc.MutableMapping
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 01:23:19 +0200] rev 49292
py3: remove conditional to import collections.abc.MutableMapping
Sun, 29 May 2022 16:24:44 +0200 py3: remove dead code to open file with O_CLOEXEC on Python 2
Manuel Jacob <me@manueljacob.de> [Sun, 29 May 2022 16:24:44 +0200] rev 49291
py3: remove dead code to open file with O_CLOEXEC on Python 2 The O_CLOEXEC flag is passed by default on Python 3.
Tue, 31 May 2022 01:16:41 +0200 py3: don’t encode node.bin() argument
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 01:16:41 +0200] rev 49290
py3: don’t encode node.bin() argument It accepts str and bytes.
Tue, 31 May 2022 01:06:29 +0200 convert: inline Python 3 variant of url2pathname_like_subversion()
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 01:06:29 +0200] rev 49289
convert: inline Python 3 variant of url2pathname_like_subversion()
Tue, 31 May 2022 00:50:29 +0200 py3: constant-fold some `pycompat.ispy3`
Manuel Jacob <me@manueljacob.de> [Tue, 31 May 2022 00:50:29 +0200] rev 49288
py3: constant-fold some `pycompat.ispy3`
Sun, 29 May 2022 15:38:01 +0200 py3: use `zip()` instead of trying to use `itertools.izip()`
Manuel Jacob <me@manueljacob.de> [Sun, 29 May 2022 15:38:01 +0200] rev 49287
py3: use `zip()` instead of trying to use `itertools.izip()`
Sun, 29 May 2022 15:33:39 +0200 py3: replace mention of “xrange” in docstring by “range”
Manuel Jacob <me@manueljacob.de> [Sun, 29 May 2022 15:33:39 +0200] rev 49286
py3: replace mention of “xrange” in docstring by “range”
Sun, 29 May 2022 15:32:43 +0200 py3: remove xrange() compatibility code
Manuel Jacob <me@manueljacob.de> [Sun, 29 May 2022 15:32:43 +0200] rev 49285
py3: remove xrange() compatibility code Some code used its own xrange() compatibility code instead of pycompat.xrange().
Sun, 29 May 2022 15:17:27 +0200 py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de> [Sun, 29 May 2022 15:17:27 +0200] rev 49284
py3: replace `pycompat.xrange` by `range`
Sun, 29 May 2022 12:38:54 +0200 hgweb: remove dead code handling UnicodeDecodeError
Manuel Jacob <me@manueljacob.de> [Sun, 29 May 2022 12:38:54 +0200] rev 49283
hgweb: remove dead code handling UnicodeDecodeError I’m quite confident that the error can’t happen on Python 3, as the main motivation for separating bytes and str in Python 3 was to avoid this class of errors.
Sun, 29 May 2022 12:28:31 +0200 cleanup: remove import of already imported module
Manuel Jacob <me@manueljacob.de> [Sun, 29 May 2022 12:28:31 +0200] rev 49282
cleanup: remove import of already imported module
Sun, 29 May 2022 12:25:24 +0200 cleanup: rename some functions to avoid redefinitions
Manuel Jacob <me@manueljacob.de> [Sun, 29 May 2022 12:25:24 +0200] rev 49281
cleanup: rename some functions to avoid redefinitions
Sat, 28 May 2022 22:08:13 +0200 thirdparty: remove Python 2-specific selectors2 copy
Manuel Jacob <me@manueljacob.de> [Sat, 28 May 2022 22:08:13 +0200] rev 49280
thirdparty: remove Python 2-specific selectors2 copy The selectors module was added in Python 3.4. Because we require Python 3.6, it will always be available. Therefore the selectors2 module is not imported. I’ve verified that the selectors2-specific workaround in commandserver.py is not necessary with the selectors module from the standard library. It returns an empty list if timeout was exceeded. The pytype directive was needed to silence the following error: File "/tmp/mercurial-ci/mercurial/worker.py", line 299, in _posixworker: No attribute 'close' on int [attribute-error] In Union[_typeshed.HasFileno, int] File "/tmp/mercurial-ci/mercurial/worker.py", line 299, in _posixworker: No attribute 'close' on _typeshed.HasFileno [attribute-error] In Union[_typeshed.HasFileno, int]
Wed, 08 Jun 2022 15:46:04 +0200 branching: merge stable into default
Raphaël Gomès <rgomes@octobus.net> [Wed, 08 Jun 2022 15:46:04 +0200] rev 49279
branching: merge stable into default
Wed, 08 Jun 2022 14:03:23 +0200 docker: avoid /tmp write access issues by fixing permissions stable
Mathias De Mare <mathias.de_mare@nokia.com> [Wed, 08 Jun 2022 14:03:23 +0200] rev 49278
docker: avoid /tmp write access issues by fixing permissions
Sat, 04 Jun 2022 02:39:38 +0200 url: raise error if CONNECT request to proxy was unsuccessful stable
Manuel Jacob <me@manueljacob.de> [Sat, 04 Jun 2022 02:39:38 +0200] rev 49277
url: raise error if CONNECT request to proxy was unsuccessful The deleted code didn’t work on Python 3. On Python 2 (or Python 3 after adapting it), the function returned in the error case. The subsequent creation of SSL socket fails during handshake with a nonsense error. Instead, the user should get an error of what went wrong. I don’t see how the deleted code would be useful in the error case. The new code is also closer of what the standard library is doing nowadays that it has proxy support (which we don’t use in the moment). In the test, I use port 0 because all the HGPORTs were already taken. In practice, there should not be any server listening on port 0.
Fri, 03 Jun 2022 17:18:46 +0200 revset: fix the doc of "nodefromfile" stable
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 03 Jun 2022 17:18:46 +0200] rev 49276
revset: fix the doc of "nodefromfile" This should maybe be called "nodesfromfile", but at least the documentation is correct (it was previously a copy past from follow).
Thu, 02 Jun 2022 23:57:56 +0200 chg: replace mercurial.util.recvfds() by simpler pure Python implementation
Manuel Jacob <me@manueljacob.de> [Thu, 02 Jun 2022 23:57:56 +0200] rev 49275
chg: replace mercurial.util.recvfds() by simpler pure Python implementation On Python 3, we have socket.socket.recvmsg(). This makes it possible to receive FDs in pure Python code. The new code behaves like the previous implementations, except that it’s more strict about the format of the ancillary data. This works because we know in which format the FDs are passed. Because the code is (and always has been) specific to chg (payload is 1 byte, number of passed FDs is limited) and we now have only one implementation and the code is very short, I decided to stop exposing a function in mercurial.util. Note on terminology: The SCM_RIGHTS mechanism is used to share open file descriptions to another process over a socket. The sending side passes an array of file descriptors and the receiving side receives an array of file descriptors. The file descriptors are different in general on both sides but refer to the same open file descriptions. The two terms are often conflated, even in the official documentation. That’s why I used “FD” above, which could mean both “file descriptor” and “file description”.
Thu, 02 Jun 2022 04:39:49 +0200 py3: don’t subscript socket.error stable
Manuel Jacob <me@manueljacob.de> [Thu, 02 Jun 2022 04:39:49 +0200] rev 49274
py3: don’t subscript socket.error On Python 2, socket.error was subscriptable. On Python 3, socket.error is an alias to OSError and is not subscriptable. The except block passes the exception to self.send_error(). This fails on both Python 2 (if it was executed) and Python 3, as it expects a string. Getting the attribute .strerror works on Python 2 and Python 3, and has the same effect as the previous code on Python 2.
Mon, 06 Jun 2022 13:58:32 +0400 parsers: drop one extra argument to PyErr_Format
Anton Shestakov <av6@dwimlabs.net> [Mon, 06 Jun 2022 13:58:32 +0400] rev 49273
parsers: drop one extra argument to PyErr_Format GCC gave the following warning during `make local`: mercurial/cext/parsers.c: In function 'dirstate_item_from_v1_data': mercurial/cext/parsers.c:413:30: warning: too many arguments for format [-Wformat-extra-args] 413 | "unknown state: `%c` (%d, %d, %d)", state, mode, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To reproduce, you might need to add the -Wformat-extra-args flag, because it isn't present for me when building for the default python3. But I can see this warning while simply building 6.1 with `make PYTHON=python2 clean local`. I don't think this NULL was useful, because other instances of PyErr_Format() don't have any NULLs as the final argument, but keep in mind that I don't know python's C API.
Thu, 02 Jun 2022 02:05:11 +0200 demandimport: eagerly load msvcrt module on PyPy stable
Manuel Jacob <me@manueljacob.de> [Thu, 02 Jun 2022 02:05:11 +0200] rev 49272
demandimport: eagerly load msvcrt module on PyPy
Fri, 03 Jun 2022 17:39:58 +0200 search-discovery-case: update documentation of a function
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 03 Jun 2022 17:39:58 +0200] rev 49271
search-discovery-case: update documentation of a function We return data, it is simpler when we know what these data means.
(0) -30000 -10000 -3000 -1000 -300 -100 -48 +48 +100 +300 +1000 tip