Matt Harbison <matt_harbison@yahoo.com> [Fri, 04 Nov 2022 17:35:44 -0400] rev 49572
util: implement `writelines()` on atomictempfile
With typehints on the vfs objects, pytype will flag this:
FAILED: /mnt/c/Users/Matt/hg/.pytype/pyi/mercurial/patch.pyi
/usr/bin/python3.8 -m pytype.single
--imports_info /mnt/c/Users/Matt/hg/.pytype/imports/mercurial.patch.imports
--module-name mercurial.patch -V 3.7
-o /mnt/c/Users/Matt/hg/.pytype/pyi/mercurial/patch.pyi
--analyze-annotated --nofail --quick
/mnt/c/Users/Matt/hg/mercurial/patch.py
File "/mnt/c/Users/Matt/hg/mercurial/patch.py", line 535, in writerej:
No attribute 'writelines' on mercurial.util.atomictempfile [attribute-error]
In Union[
mercurial.util.atomictempfile,
mercurial.vfs.checkambigatclosing,
mercurial.vfs.delayclosedfile,
mercurial.windows.fdproxy,
mercurial.windows.mixedfilemodewrapper
]
It's not a real problem there (atomictempfile is only created by passing
different args), but it's reasonable for this to implement the function and
behave like a normal file. There are other functions missing that can be added
if/when needed.
Matt Harbison <matt_harbison@yahoo.com> [Wed, 02 Nov 2022 16:43:01 -0400] rev 49571
typing: add basic type hints to localrepo.py
There's a lot more that could be done, but this sticks to the obviously correct
stuff that is either related to existing imports or primitives. Hopefully this
helps smoke out more path related bytes vs str issues in TortoiseHg.
I'm avoiding the interfaces for now, because they seem to confuse pytype and/or
PyCharm. It might be worth typing the return of `makelocalrepository` to
`localrepository`, but that leaks an implementation detail, so that can be
revisited later.
Matt Harbison <matt_harbison@yahoo.com> [Sat, 05 Nov 2022 00:38:02 -0400] rev 49570
check-code: drop the check for whitespace around named parameters
This check flags py3 annotations of named parameters, because `black` adds
spaces around the assignment in this case. Since the chosen formatter has
opinions (and pylint also wants the space in the case of annotations), drop the
check so we can use py3 annotations.
Raphaël Gomès <rgomes@octobus.net> [Thu, 03 Nov 2022 16:30:35 +0100] rev 49569
rhg: add a config option to fall back immediately
This is useful for debugging the behavior of the "default" `hg` in tests
without having to manually substitute the fallback path.
Raphaël Gomès <rgomes@octobus.net> [Thu, 03 Nov 2022 15:57:37 +0100] rev 49568
rhg: stop shadowing `exit` function
This will be useful for the next patch which needs it.
Raphaël Gomès <rgomes@octobus.net> [Thu, 03 Nov 2022 15:43:04 +0100] rev 49567
config: add alias from `hg help rhg` to `hg help rust`
This will make using `rhg` more user-friendly and features more
discoverable.
Raphaël Gomès <rgomes@octobus.net> [Thu, 03 Nov 2022 15:42:33 +0100] rev 49566
rhg: add `config.rhg` helptext
This will make using `rhg` more user-friendly and features more
discoverable.
Raphaël Gomès <rgomes@octobus.net> [Thu, 03 Nov 2022 15:44:54 +0100] rev 49565
config: fix indentation of some`share-safe` options
This makes the output much more readable.
Raphaël Gomès <rgomes@octobus.net> [Wed, 19 Oct 2022 12:38:06 +0200] rev 49564
rust-status: query fs traversal metadata lazily
Currently, any time the status algorithm needs to read a directory from the
filesystem (because the stat-only optimization is not available), it also
stats each directory entry eagerly.
Stat'ing the entries is only needed in a few cases (like when checking
the mtime of a directory for caching): this patch creates a wrapper struct
`DirEntry` that only stats the directory entry it represents when needed.
Excerpt of an `strace` before this change on Mozilla Central:
```
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
newfstatat(3, "", {st_mode=S_IFDIR|0755, st_size=3540, ...}, AT_EMPTY_PATH) = 0
getdents64(3, 0x55dc970bd440 /* 139 entries */, 32768) = 5072
statx(3, ".hg", AT_STATX_SYNC_AS_STAT|AT_SYMLINK_NOFOLLOW, STATX_ALL, {stx_mask=STATX_ALL|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0755, stx_size=772, ...}) = 0
[... 135 other successful `statx` calls]
getdents64(3, 0x55dc970bd440 /* 0 entries */, 32768) = 0
close(3) = 0
```
After this change:
```
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
newfstatat(3, "", {st_mode=S_IFDIR|0755, st_size=3540, ...}, AT_EMPTY_PATH) = 0
getdents64(3, 0x561567c10190 /* 139 entries */, 32768) = 5072
getdents64(3, 0x561567c10190 /* 0 entries */, 32768) = 0
close(3) = 0
```
Raphaël Gomès <rgomes@octobus.net> [Wed, 19 Oct 2022 14:46:19 +0200] rev 49563
rust-status: make `DirEntry` attributes clearer
Pierre-Yves David <pierre-yves.david@octobus.net> [Sun, 16 Oct 2022 04:48:21 +0200] rev 49562
perf-unbundle: do a quick and dirty fix to make it run on more commit
Without this change, the perf commands fails within the
f67741e8264b::18415fc918a1 range (boundary excluded).
Check inline comment for details.
With this fix, the command is able to run on this range, with a slightly
different behavior (as no revset is "uninlined"). However this is still much
better than not being able to run anything in this range. Especially because
that range do see some performance regression for unbundle.
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 19 Oct 2022 01:54:04 +0200] rev 49561
perf-unbundle: pre-indent the main block in per::unbundle
This makes the next changeset clearer.
Jason R. Coombs <jaraco@jaraco.com> [Wed, 19 Oct 2022 16:23:42 -0400] rev 49560
shelve: handle empty parents and nodestoremove in shelvedstate (issue6748)
Raphaël Gomès <rgomes@octobus.net> [Thu, 03 Nov 2022 14:58:58 +0100] rev 49559
rhg: fallback when encountering ellipsis revisions
Ellipsis revisions are still experimental and buggy in non-trivial
histories. We currently have no plans to improve this situation nor
to add support for ellipsis revisions in `rhg`.
Falling back should be done carefully (since we may have already done
some work that is visible to the user), but in this case it's highly
unlikely that we're doing anything useful with a repo with ellipsis
revisions, so this should be strictly better, also since the
error message is more explicit.
Raphaël Gomès <rgomes@octobus.net> [Wed, 02 Nov 2022 12:05:34 +0100] rev 49558
dirstate-v2: hash the source of the ignore patterns as well
Fixes the test introduced in the last changeset. This caused the hash
to change, which means that the check in the test had to be adapted.
Since this hash is only done as a caching mechanism, invalidation does
not pose any backwards compatibility issues.
Raphaël Gomès <rgomes@octobus.net> [Wed, 02 Nov 2022 15:24:39 +0100] rev 49557
dirstate-v2: add test that shows a collision in ignore patterns hash
This hash is used for optimizing dirstate `status`. We demonstrate that the
hash is incorrectly ignoring the changes to the semantics of the ignore
files just because the contents (but not their source) haven't changed.
This is fixed in the next changeset.
Raphaël Gomès <rgomes@octobus.net> [Thu, 03 Nov 2022 12:08:02 +0100] rev 49556
testlib: add `--raw-sha1` option to `f`
This will be used in the patch fixing the ignore hash collision in
dirstate-v2 to check the behavior of the new hashing function.
Raphaël Gomès <rgomes@octobus.net> [Wed, 19 Oct 2022 16:28:41 +0200] rev 49555
rust-status: save new dircache even if just invalidated
There was a functional race between invalidating the cache (not acted upon
until the end of the status algorithm) and populating the new cache (which
relies upon an up-to-date version of the cache).
We simply inform the cache populating function that we've just invalidated
the cache for this particular directory since the information is present in
the same scope.
Raphaël Gomès <rgomes@octobus.net> [Wed, 19 Oct 2022 15:11:05 +0200] rev 49554
rust-status: fix typos and add docstrings to dircache related fields
Arseniy Alekseyev <aalekseyev@janestreet.com> [Thu, 22 Sep 2022 15:34:27 -0400] rev 49553
rhg: show a bug where repeated [hg status] is needed to cache everything
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 04 Nov 2022 16:15:12 -0400] rev 49552
upgrade: no longer keep all revlogs in memory at any point
Keeping all object open is unsustainable, so we will open them on demand. This
mean opening them multiple times, but this is a lesser evil.
Each revlog consume a small amount of memory (index content, associated nodemap,
etc). While there are few "big" revlog, the sheer amount of small filelog can
become a significant issue memory wise, consuming multiple GB of memory. If you
combines this extra usage with the use of multiprocessing, this usage can
quickly get out of control. This can effectively block the upgrade of larger
repository. This changeset fixes this issue.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 22 Sep 2022 16:27:17 +0200] rev 49551
tests: remove non-python3 line matching and tests block
We don't support Python2 anymore
Matt Harbison <matt_harbison@yahoo.com> [Wed, 02 Nov 2022 14:23:09 -0400] rev 49550
demandimport: convert ignored modules from bytes -> str in extensions
The default list of ignored modules are str, and test for bypassing the lazy
import is `module.__name__ in ignores`, so these were effectively NOT ignored.
Most of these date back to the grand byteification in 687b865b95ad, with some
subsequent additions that followed the existing example.
I have no idea if these modules in fact need to bypass lazy importing, but at
least it follows the intent of the code.
Raphaël Gomès <rgomes@octobus.net> [Wed, 26 Oct 2022 18:46:56 +0200] rev 49549
dirstate-v2: fix edge case where entries aren't sorted
See previous commit for more details.
Raphaël Gomès <rgomes@octobus.net> [Wed, 26 Oct 2022 18:24:34 +0200] rev 49548
dirstate-v2: highlight a bug when Python-packed but used in `rhg`
The Python packer creates unsorted entries in the edge case that a file
starts with the same name as a sibling folder.
This bug has no effect on the Python `hg status` since Python ignores
directories. `rhg` assumes that all on-disk entries are sorted (which is
a property of the format) including folder, hence the issue highlighted.
This is also technically broken in Rust-augmented `hg status`, but it
makes setting up the test more complex than necessary, since it requires
the packing to be Python only (which it isn't if you have Rust extensions).
Fix is in the next commit.
Raphaël Gomès <rgomes@octobus.net> [Wed, 26 Oct 2022 12:20:23 +0200] rev 49547
dirstate-v2: correct documented return values of `pack_dirstate`
Raphaël Gomès <rgomes@octobus.net> [Wed, 26 Oct 2022 12:19:47 +0200] rev 49546
dirstate-v2: fix typos in docstrings
Raphaël Gomès <rgomes@octobus.net> [Fri, 04 Nov 2022 14:52:16 -0400] rev 49545
dirstate-v2: update constant that wasn't kept in sync
Despite the best efforts of the comment, this constant wasn't kept in sync
when the flags were being rewritten.
The fact that this doesn't actually break anything in the Rust implementation
too much (which does use directories) relies on the fact that all nodes
can have children and that dirstate traversal is not based on that flag, but
for metadata in optimizations. However the bug could become more serious should
we start encoding stronger guarantees using a combination of flags including
this one.
Matt Harbison <matt_harbison@yahoo.com> [Tue, 18 Oct 2022 13:56:45 -0400] rev 49544
lfs: avoid closing connections when the worker doesn't fork
Probably not much more than an minor optimization, but could be useful in the
case of `hg verify` where missing blobs are fetched one at a time.
Matt Harbison <matt_harbison@yahoo.com> [Tue, 18 Oct 2022 13:36:33 -0400] rev 49543
lfs: fix blob corruption when tranferring with workers on posix
The problem seems to be that the connection used to request the location of the
blobs is sitting in the connection pool, and then when workers are forked, they
all see and attempt to use the same connection. This garbles everything. I
have no clue how this ever worked reliably (but it seems to, even on Linux, with
SCM Manager 1.58). See previous discussion when worker support was added[1].
It shouldn't be a problem on Windows, since the workers are just threads in the
same process, and can see which connections are marked available and which are
in use. (The fact that `mercurial.keepalive.ConnectionManager.set_ready()`
doesn't acquire a lock does give me some pause though.)
[1] https://phab.mercurial-scm.org/D1568#31621