Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2024 17:08:11 +0100] rev 52216
ci: shard the test run on mac os X
This should comes with some benefit:
- spread the load across more runner,
- reduce the real-time CI run,
- reduce the "retry" run when we need them.
We start with the Mac jobs, but that would be tremendously useful for Windows
too.
For linux, we need to reduce the startup overhead for this to be worth it.
Building smaller image and speeding up clone should help with that.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 22 Sep 2022 01:02:06 +0200] rev 52215
run-tests: implement crude sharding support
It will help to spread the testing load across more CI runners.
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2024 21:41:02 +0100] rev 52214
ci: have the mac test run if you trigger building the mac wheel
The mac test job now depends on the wheel building. And the wheel building is
manual. So if the mac test job is set to "on_success" if will be "skipped" by
default, and automatically run if the wheel are build.
That is especially handy as we are about to shard that test and that the UI for
manual sharded test sucks.
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2024 21:22:02 +0100] rev 52213
ci: adjust the starting port range to runner concurrency
If multiple job runs on the same runner, they should not use the port range.
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2024 17:28:33 +0100] rev 52212
ci: move the "tempory work dir" to "concurrency-safe" location
Lets not use a global location and move at the root of the directory dedicated
to the job.
Pierre-Yves David <pierre-yves.david@octobus.net> [Mon, 28 Oct 2024 03:29:29 +0100] rev 52211
ci: abstract the of absolute /tmp/ path
We now have a TMP_WORK_DIR directory that we can update to a more sensible value
in the next changesets.
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2024 14:56:54 +0100] rev 52210
ci: rationalize variable usage
The usage of "extends" allow to skip a lot of duplication. We also introduce
more fine grained variables to help finer override.
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2024 14:44:56 +0100] rev 52209
ci: move some variables closer to their usage
These were defined globaly because we had trouble making them inherited. This
is now fixed, so we can get them were they belong.
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2024 14:35:57 +0100] rev 52208
ci: use extends instead of <<: *x
The old form is a yaml construct that make it hard to share variable definition.
The "extends:" key is a gitlab specific that preserve the variable definition
and just add the new ones. This will help us to reduce duplication.
This has the effect of fixing some of variants definition we though we set while
we did actually not. Most notably, the "rust" variant for 3.12 and 3.13 seems
fully broken in the CI (possibly because some rust-cpython version issue?).
This changeset only reveal such breackage and does not introduce them.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 07 Nov 2024 17:22:05 +0100] rev 52207
ci: use the macos wheel to run tests
Pierre-Yves David <pierre-yves.david@octobus.net> [Tue, 15 Oct 2024 05:17:37 +0200] rev 52206
wheel: build mac os wheel through the CI
Let's start building wheel for mac os X too.
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2024 12:53:40 +0100] rev 52205
pycompat: drop some now useless workaround for makedirs
This `exists_ok` flag was added in Python 3.2
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 07 Nov 2024 23:13:32 +0100] rev 52204
run-tests: install wheel using --prefix instead of --user
--user does not work if a venv is enabled when calling run-tests.py
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2024 02:02:32 +0100] rev 52203
ci: automatically compute the python tag we use to identify tag
This make the determination more automatic and less error prone. In addition,
this will make it possible to run on a runner without a pre-determined Python
version, like what we do for the macos and windows workers.
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2024 02:50:34 +0100] rev 52202
pytype: add relative timestamp to the output if `ts` is available
This should help to identify the module that are the slower to analyze.
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 06 Nov 2024 16:40:58 +0100] rev 52201
ci: build (and use) wheel for all supported version
We test wheel building for all supported version and use them where applicable
The usage is more verbose than I wish because .gitlab-ci is not that great.
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 06 Nov 2024 16:39:45 +0100] rev 52200
ci: use a pre-setup many-linux image to build wheel
This produce wheel that are more universal and identical to the one we want to
publish.
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 06 Nov 2024 16:38:57 +0100] rev 52199
ci: use smaller VM to build wheel
There is no need for large machine for this job, Python will be mostly singled
threaded anyway.
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 06 Nov 2024 16:32:15 +0100] rev 52198
setup: add a way to force the setup to translate (or fail)
we add the `MERCURIAL_SETUP_FORCE_TRANSLATIONS` variable that is intended to
make sure we don't stop building the translation silently.
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 06 Nov 2024 16:37:10 +0100] rev 52197
ci: pre-adjust some identation
We adjust a couple of job to consistently use double space identation. This will
make the next changesets clearer.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 07 Nov 2024 11:02:35 +0100] rev 52196
test-install: glob instance of "python" in warning
If run with something else (e.g. python3.12) the message says "python3.12" so we
just glob that away.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 07 Nov 2024 01:30:08 +0100] rev 52195
test-install: use the global hg for the install step
This prevent error in some cases.
Matt Harbison <matt_harbison@yahoo.com> [Tue, 05 Nov 2024 12:02:38 -0500] rev 52194
tests: bump the wait timeouts in test-racy-mutations.t
This was done to try to figure out why there's output differences in the
previous two commits- low timeouts have been a cause of a lot of problems on
Windows. That doesn't seem to be the case here, but I'm leaving it in anyway
to avoid sporadic failures.
Matt Harbison <matt_harbison@yahoo.com> [Tue, 05 Nov 2024 11:50:29 -0500] rev 52193
tests: add a "missing" tests for manifest content in test-racy-mutations.t
Trying to figure out why the divergence in behavior on Windows. The first test
shows everything is the same on all platforms; the second shows that the other
#testcase also diverges. The difference might be that `00manifest.i` doesn't
get updated (and copied over) after `pre-race` is created, but I've no idea why
that would be either.
Matt Harbison <matt_harbison@yahoo.com> [Tue, 05 Nov 2024 11:48:22 -0500] rev 52192
tests: conditionalize missing output in test-racy-mutations.t on Windows
No idea why this is only missing on Windows. I verified that the line marked
as missing directly above this for the changelog is, in fact, missing on both
Windows and Linux. So there's probably work to do in this area on all
platforms. It would be nice to figure out what is going on, but this appeases
CI in the meantime.
Matt Harbison <matt_harbison@yahoo.com> [Thu, 07 Nov 2024 10:36:12 -0500] rev 52191
tests: disable a section of `test-paths.t` that may hit a zeroconf bug
This effectively re-disables the same test as
cce9e7d2fb92, but unconditionally
because it's not a pyoxidizer-specific problem.
74e16d8ca5f3 disabled the other
related test for the same reason- this one was missed because it wasn't failing
for the few runs when that was tested.
Raphaël Gomès <rgomes@octobus.net> [Tue, 05 Nov 2024 15:21:09 +0100] rev 52190
rust-update: make `update_from_null` respect `worker.numcpu` config option
This was overlooked in the original series.
This is important for tests (because we run many at once), and for the
occasional end user that wants to keep their CPU usage in check.
A future series should clean up this `worker` parameter tunelling business by
rewriting the config in Rust, but doing so on stable would be a very bad
idea.
Raphaël Gomès <rgomes@octobus.net> [Tue, 05 Nov 2024 15:18:32 +0100] rev 52189
rust-cpython: add a TODO about repo reuse
This will need to be done soon-ish to prevent any surprises.
Matt Harbison <matt_harbison@yahoo.com> [Mon, 04 Nov 2024 16:43:05 -0500] rev 52188
streamclone: disable the volatile file open handle optimization on Windows
Leaving files open caused new failures like this, since
a47f09da8bd1:
diff --git a/tests/test-persistent-nodemap-stream-clone.t b/tests/test-persistent-nodemap-stream-clone.t
--- a/tests/test-persistent-nodemap-stream-clone.t
+++ b/tests/test-persistent-nodemap-stream-clone.t
@@ -115,7 +115,12 @@ Do a mix of clone and commit at the same
$ (hg clone -U --stream ssh://user@dummy/test-repo stream-clone-race-1 --debug 2>> clone-output | grep -E '00(changelog|manifest)' >> clone-output; touch $HG_TEST_STREAM_WALKED_FILE_3) &
$ $RUNTESTDIR/testlib/wait-on-file 10 $HG_TEST_STREAM_WALKED_FILE_1
$ hg -R test-repo/ commit -m foo
- created new head
+ transaction abort!
+ failed to recover 00changelog.n ([WinError 32] The process cannot access the file because it is being used by another process: b'$STR_REPR_TESTTMP\\test-repo/.hg/store/00changelog.n' -> b'$STR_REPR_TESTTMP\\test-repo/.hg/store/00changelog.n-
f418dcd6')
+ rollback failed - please run hg recover
+ (failure reason: [WinError 32] The process cannot access the file because it is being used by another process: b'$STR_REPR_TESTTMP\\test-repo/.hg/store/00changelog.n' -> b'$STR_REPR_TESTTMP\\test-repo/.hg/store/00changelog.n-
f418dcd6')
+ abort: The process cannot access the file because it is being used by another process: '$TESTTMP\test-repo\.hg\store\00changelog.n'
+ [255]
$ touch $HG_TEST_STREAM_WALKED_FILE_2
$ $RUNTESTDIR/testlib/wait-on-file 10 $HG_TEST_STREAM_WALKED_FILE_3
$ cat clone-output
Since the `VolatileManager` falls back to the old copy method when the open file
threshold is exceeded, this just drops the threshold so that only 1 file is
open. The actual value used (2) is unexpected, and explained inline. I'd like
to have a config option for this so that we can test both ways (in theory, it
could resort to copies on non-Windows systems too), but I don't see a `uimod.ui`
handy.
Alternately, I tried replacing the 3 `open()` calls in the `VolatileManager`
with `util.posixfile()`, but that simply hung the test on Windows for some
reason, I think on the same line that's indicated as failing above. (There was
a `grep` command hanging around, as well as `hg -R test-repo serve --stdio`.)
Matt Harbison <matt_harbison@yahoo.com> [Mon, 04 Nov 2024 17:42:30 -0500] rev 52187
tests: treat `select` as a built-in module on Windows
This fixes:
--- C:/Users/Matt/hg/tests/test-check-module-imports.t
+++ C:/Users/Matt/hg/tests/test-check-module-imports.t.err
@@ -43,3 +43,15 @@
> -X tests/test-verify-repo-operations.py \
> -X tests/test-extension.t \
> | sed 's-\\-/-g' | "$PYTHON" "$import_checker" -
+ hgext/zeroconf/Zeroconf.py:86: stdlib import "socket" follows local import: select\r (esc)
+ hgext/zeroconf/Zeroconf.py:87: stdlib import "struct" follows local import: select\r (esc)
+ hgext/zeroconf/Zeroconf.py:88: stdlib import "threading" follows local import: select\r (esc)
+ hgext/zeroconf/Zeroconf.py:89: stdlib import "time" follows local import: select\r (esc)
+ hgext/zeroconf/Zeroconf.py:90: stdlib import "traceback" follows local import: select\r (esc)
+ mercurial/posix.py:18: stdlib import "stat" follows local import: select\r (esc)
+ mercurial/posix.py:19: stdlib import "sys" follows local import: select\r (esc)
+ mercurial/posix.py:20: stdlib import "tempfile" follows local import: select\r (esc)
+ mercurial/posix.py:21: stdlib import "typing" follows local import: select\r (esc)
+ tests/tinyproxy.py:19: stdlib import "socket" follows local import: select\r (esc)
+ tests/tinyproxy.py:20: stdlib import "sys" follows local import: select\r (esc)
+ [1]
ERROR: test-check-module-imports.t output changed
Raphaël Gomès <rgomes@octobus.net> [Mon, 21 Oct 2024 12:58:40 +0200] rev 52186
rust-vfs: add docstrings to all VFS methods on the trait
Raphaël Gomès <rgomes@octobus.net> [Thu, 10 Oct 2024 15:54:45 +0200] rev 52185
rust-vfs: support checkambig
This was missing from the Rust code, which means worse caching. See
https://wiki.mercurial-scm.org/ExactCacheValidationPlan.
Explanations on what ambiguity means inline.
Raphaël Gomès <rgomes@octobus.net> [Tue, 08 Oct 2024 16:10:30 +0200] rev 52184
rust-vfs: add tests to `AtomicFile`
This also makes it more usable from Rust by separating `from_file` and `new`.
Raphaël Gomès <rgomes@octobus.net> [Tue, 08 Oct 2024 16:09:39 +0200] rev 52183
rust-vfs: delete the temp file and not the target on drop
Oops. This never affected anything since `close()` is correct and no code
has dropped an `AtomicFile` without a close first yet.
Next patch will add tests.
Raphaël Gomès <rgomes@octobus.net> [Thu, 26 Sep 2024 14:26:24 +0200] rev 52182
rust: don't star export from the `revlog` module
This made a lot of the imports confusing because they didn't make sense
at the top level (so, outside of `revlog`), and they hide the more common
types when autocompleting.
Raphaël Gomès <rgomes@octobus.net> [Thu, 01 Aug 2024 11:27:20 +0200] rev 52181
rust: populate mmaps in a separate thread if possible
Same rationale as
b619ba39d10a.
Raphaël Gomès <rgomes@octobus.net> [Wed, 31 Jul 2024 15:41:08 +0200] rev 52180
rust-revlog: build an in-memory nodemap if a given revlog gets queried a lot
This will help with non-persistent nodemap repos that would benefit from
one, and mirrors what the C implementation does.
Raphaël Gomès <rgomes@octobus.net> [Wed, 31 Jul 2024 15:11:27 +0200] rev 52179
rust-revlog: generalize an error message
This is used for more than the nodemap data.
Raphaël Gomès <rgomes@octobus.net> [Wed, 31 Jul 2024 13:35:54 +0200] rev 52178
rust-revlog: don't create an in-memory nodemap for filelogs from Python
Explanations inline.
Benchmarks from this change affect positively the only repo that showed this
being a problem:
```
### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
default: 62.848869 ~~~~~
before-this-patch: 58.113051 (-7.54%, -4.74)
this-patch: 57.407533 (-8.66%, -5.44)
### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 10
# benchmark.variants.patch = yes
# benchmark.variants.rev = none
default: 3.173532 ~~~~~
before-this-patch: 3.543591 (+11.66%, +0.37)
this-patch: 3.297235 (+3.90%, +0.12)
```
Raphaël Gomès <rgomes@octobus.net> [Wed, 31 Jul 2024 15:02:55 +0200] rev 52177
rust-revlog: move non-persistent-nodemap rev lookup to the index
It only uses index features and does not need to be on the revlog. A later
patch will make use of this function from a different context.
Raphaël Gomès <rgomes@octobus.net> [Mon, 29 Jul 2024 20:39:34 +0200] rev 52176
revlog: add glue to use a pure-Rust VFS
This will save us a lot of calling back into Python, which is always
horribly expensive.
We are now faster in all benchmarked cases except for `log --patch`
specifically on mozilla-try. Fixing this will happen in a later patch.
```
### data-env-vars.name = mercurial-devel-2024-03-22-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
e679697a6ca4: 1.760765 ~~~~~
5559d7e63ec3: 1.555513 (-11.66%, -0.21)
### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
e679697a6ca4: 62.848869 ~~~~~
5559d7e63ec3: 58.113051 (-7.54%, -4.74)
### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 10
# benchmark.variants.patch = yes
# benchmark.variants.rev = none
e679697a6ca4: 3.173532 ~~~~~
5559d7e63ec3: 3.543591 (+11.66%, +0.37)
### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
e679697a6ca4: 1.214698 ~~~~~
5559d7e63ec3: 1.192478 (-1.83%, -0.02)
### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
e679697a6ca4: 56.205474 ~~~~~
5559d7e63ec3: 51.520074 (-8.34%, -4.69)
### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 10
# benchmark.variants.patch = yes
# benchmark.variants.rev = none
e679697a6ca4: 2.105419 ~~~~~
5559d7e63ec3: 2.051849 (-2.54%, -0.05)
### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
e679697a6ca4: 0.309960 ~~~~~
5559d7e63ec3: 0.299035 (-3.52%, -0.01)
### data-env-vars.name = tryton-public-2024-03-22-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
e679697a6ca4: 1.849832 ~~~~~
5559d7e63ec3: 1.805076 (-2.42%, -0.04)
### data-env-vars.name = tryton-public-2024-03-22-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 10
# benchmark.variants.patch = yes
# benchmark.variants.rev = none
e679697a6ca4: 0.289521 ~~~~~
5559d7e63ec3: 0.279889 (-3.33%, -0.01)
### data-env-vars.name = tryton-public-2024-03-22-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
e679697a6ca4: 0.332270 ~~~~~
5559d7e63ec3: 0.323324 (-2.69%, -0.01)
```
Raphaël Gomès <rgomes@octobus.net> [Mon, 29 Jul 2024 20:35:44 +0200] rev 52175
fncache: add attribute to check whether we're using dotencode
This will make it easy to know if we can use the Rust implementation that
doesn't support older forms of encoding.
Raphaël Gomès <rgomes@octobus.net> [Mon, 29 Jul 2024 20:34:38 +0200] rev 52174
fncachestore: add typing information
This helps with autocomplete.
Raphaël Gomès <rgomes@octobus.net> [Mon, 29 Jul 2024 20:34:06 +0200] rev 52173
fncache: refactor load check into a property
This makes the intent more obvious new callers less prone to error.
Raphaël Gomès <rgomes@octobus.net> [Mon, 29 Jul 2024 20:49:07 +0200] rev 52172
hg-core: add FnCacheVFS
This will allow us to only call back into Python to add items to the fncache,
which should save us a lot of FFI overhead.
This is also of course a stepping stone for more pure Rust work.
Raphaël Gomès <rgomes@octobus.net> [Mon, 29 Jul 2024 20:47:43 +0200] rev 52171
hg-core: add a complete VFS
This will be used from Python in a later change.
More changes are needed in hg-core and rhg to properly clean up the APIs
of the old VFS implementation but it can be done when the dust settles
and we start adding more functionality to the pure Rust VFS.
Raphaël Gomès <rgomes@octobus.net> [Mon, 29 Jul 2024 20:28:42 +0200] rev 52170
hg-core: add fncache module
For now it's only a super simple trait. It will be used for calling back into
Python soon, and later will be fleshed out into a full fncache.
Raphaël Gomès <rgomes@octobus.net> [Thu, 26 Sep 2024 13:55:26 +0200] rev 52169
rust: populate mmap by default if available
See
522b4d729e89edc76544fa549ed36de4aea0b7fb for more details.
Background population to follow in a later patch.
Raphaël Gomès <rgomes@octobus.net> [Wed, 19 Jun 2024 18:20:22 +0200] rev 52168
rust-changelog: switch away from deprecated APIs for datetime use
This was caught by clippy, nothing was changed aside from some light API
changes.
Raphaël Gomès <rgomes@octobus.net> [Wed, 19 Jun 2024 19:10:49 +0200] rev 52167
revlog: add the glue to use the Rust `InnerRevlog` from Python
The performance of this has been looked at for quite some time, and some
workflows are actually quite a bit faster than with the Python + C code.
However, we are still (up to 20%) slower in some crucial places like cloning
certain repos, log, cat, which makes this an incomplete rewrite. This is
mostly due to the high amount of overhead in Python <-> Rust FFI, especially
around the VFS code. A future patch series will rewrite the VFS code in
pure Rust, which should hopefully get us up to par with current perfomance,
if not better in all important cases.
This is a "save state" of sorts, as this is a ton of code, and I don't want
to pile up even more things in a single review.
Continuing to try to match the current performance will take an extremely
long time, if it's not impossible, without the aforementioned VFS work.
Raphaël Gomès <rgomes@octobus.net> [Wed, 19 Jun 2024 17:03:13 +0200] rev 52166
changelog: also set the general delta config flag in the data config
This duplication is dubious, but it's a decision to be made at a later date,
this is the fix.
Raphaël Gomès <rgomes@octobus.net> [Mon, 29 Jul 2024 15:03:52 +0200] rev 52165
rust-index: use `IndexEntry::offset` to compute read segments
This only matters for inline revlogs where the impact is debatable, but
this is what the C index does.
Raphaël Gomès <rgomes@octobus.net> [Thu, 10 Oct 2024 10:34:51 +0200] rev 52164
rust-revlog: add a Rust-only `InnerRevlog`
This mirrors the Python `InnerRevlog` and will be used in a future patch
to replace said Python implementation. This allows us to start doing more
things in pure Rust, in particular reading and writing operations.
A lot of changes have to be introduced all at once, it wouldn't be very
useful to separate this patch IMO since all of them are either interlocked
or only useful with the rest.
Raphaël Gomès <rgomes@octobus.net> [Thu, 10 Oct 2024 10:38:35 +0200] rev 52163
rust-index: fix the computation of data start
This was falling into place instead of being correct, we clean up the logic
by differenciating the on-disk offset and the actual start of the data
more cleanly.
Raphaël Gomès <rgomes@octobus.net> [Thu, 10 Oct 2024 10:38:10 +0200] rev 52162
rust-index: return an error on a bad index header
This is more idiomatic and allows us to better handle the problem later.
Raphaël Gomès <rgomes@octobus.net> [Thu, 17 Oct 2024 15:22:38 +0200] rev 52161
rust-vfs: add a TODO to remember a decision taken about naming
Explanations inline.
Raphaël Gomès <rgomes@octobus.net> [Wed, 25 Sep 2024 18:24:15 +0200] rev 52160
rust-revlog: introduce an `options` module
This helps group all the relevant revlog options code and makes the `mod.rs`
more readable.
Raphaël Gomès <rgomes@octobus.net> [Wed, 25 Sep 2024 18:10:03 +0200] rev 52159
rust-revlog: add file IO helpers
This will be useful for the upcoming `InnerRevlog`.
Raphaël Gomès <rgomes@octobus.net> [Wed, 25 Sep 2024 16:42:21 +0200] rev 52158
rust-revlog: add compression helpers
This will be used in the upcoming `InnerRevlog` when reading/writing data.
Matt Harbison <matt_harbison@yahoo.com> [Thu, 31 Oct 2024 17:24:18 -0400] rev 52157
hgweb: skip logging ConnectionAbortedError
Not stacktracing on `ConnectionResetError` was added in
6bbb12cba5a8 (though it
was spelled differently for py2 support), but for some reason Windows
occasionally triggers a `ConnectionAbortedError` here across various *.t files
(notably `test-archive.t` and `test-lfs-serve-access.t`, but there are others).
The payload that fails to send seems to be the html that describes the error to
the client, so I suspect some code is seeing the error status code and closing
the connection before the server gets to write this html. So don't log it, for
test stability- nothing we can do anyway.
FWIW, the CPython implementation of wsgihander specifically ignores these two
errors, plus `BrokenPipeError`, with a comment that "we expect the client to
close the connection abruptly from time to time"[1]. The `BrokenPipeError` is
swallowed a level up in `do_write()`, and avoids writing the response following
this stacktrace. I'm puzzled why a response is being written after these
connection errors are detected- the CPython code referenced doesn't, and the
connection is now broken at this point. Perhaps these errors should both be
handled with the `BrokenPipeError` after the freeze.
(The refactoring away from py2 compat may not be desireable in the freeze, but
this is much easier to read, and obviously correct given the referenced CPython
code.)
I suspect this is what
6bceecb28806 was attempting to fix, but it wasn't
specific about the sporadic errors it was seeing.
[1] https://github.com/python/cpython/blob/
b2eaa75b176e07730215d76d8dce4d63fb493391/Lib/wsgiref/handlers.py#L139
Matt Harbison <matt_harbison@yahoo.com> [Fri, 25 Oct 2024 17:15:53 -0400] rev 52156
ci: add a runner for Windows 10
This is currently only manually invoked, and allows for failure because we only
have a single runner that takes over 2h for a full run, and there are a handful
of flakey tests, plus 3 known failing tests.
The system being used here is running MSYS, Python, Visual Studio, etc, as
installed by `install-windows-dependencies.ps1`. This script installs
everything to a specific directory instead of using the defaults, so we adjust
the MinGW shell path to compensate. Additionally, the script doesn't install
the launcher `py.exe`. It is possible to adjust the script to install it, but
it's an option to an existing python install (instead of a standalone installer),
and I've had the whole python install fail and rollback when requested to install
the launcher if it detects a newer one is already installed. In short, it is
a point of failure for a feature we don't (yet?) need.
Unlike other systems where the intepreter name includes the version, everything
here is `python.exe`, so they can't all exist on `PATH` and let the script
choose the desired one. (The `py.exe` launcher would accomplish, using the
registry instead of `PATH`, but that wouldn't allow for venv installs.) Because
of this, switch to the absolute path of the python interpreter to be used (in
this case a venv created from the py39 install, which is old, but what both
pyoxidizer and TortoiseHg currently use).
The `RUNTEST_ARGS` hardcodes `-j8` because this system has 4 cores, and
therefore runs 4 parallel tests by default. However on Windows, using more
parallel tests than cores results in better performance for whatever reason. I
don't have an optimal value yet (ideally the runner itself can make the
adjustment on Windows), but this results in saving ~15m on a full run that
otherwise takes ~2.5h. I'm also not concerned about how it would affect other
Windows machines, because we don't have any at this point, and I have no idea
when we can get more.
As far as system setup goes, the CI is run by a dedicated user that lacks admin
rights. The install script was run by an admin user, and then the standard user
was configured to use it. If I set this up again, I'd probably give the
dedicated user admin rights to run the install script, and reset to standard
user rights when done. The python intepreter failed in weird ways when run by
the standard user until it was manually reinstalled by the standard user:
Fatal Python error: init_fs_encoding: failed to get the Python codec of the
filesystem encoding
Additionally, changing the environment through the Windows UI prompts to
escalate to an admin user, and then setting the user level environment variables
like `TEMP` and `PATH` (to try to avoid exceeding the 260 character path limit)
didn't actually change the user's environment. (Likely it changed the admin
user's environment, but I didn't confirm that.) I ended up having to use the
registry editor for the standard user to make those changes.
Matt Harbison <matt_harbison@yahoo.com> [Fri, 11 Oct 2024 15:04:13 -0400] rev 52155
tests: disable a section of `test-hgrc.t` that may hit a zeroconf bug
This effectively re-disables the same test as
cce9e7d2fb92, but unconditionally
because it's not a pyoxidizer-specific problem (see below and
997c9b2069d1).
I can run the test locally fine, with the same venv as CI is using, and have had
multiple CI runs that don't hit this. But one failed with this:
--- /private/tmp/mercurial-ci/tests/test-hgrc.t
+++ /private/tmp/mercurial-ci/tests/test-hgrc.t.err
@@ -305,5 +305,17 @@
[255]
$ HGRCSKIPREPO=1 hg paths --config extensions.zeroconf=
+ Traceback (most recent call last):
+ File "/private/tmp/hgtests.7idf706t/install/lib/python/hgext/zeroconf/Zeroconf.py", line 966, in run
+ self.readers[sock].handle_read()
+ File "/private/tmp/hgtests.7idf706t/install/lib/python/hgext/zeroconf/Zeroconf.py", line 1020, in handle_read
+ msg = DNSIncoming(data)
+ File "/private/tmp/hgtests.7idf706t/install/lib/python/hgext/zeroconf/Zeroconf.py", line 537, in __init__
+ self.readOthers()
+ File "/private/tmp/hgtests.7idf706t/install/lib/python/hgext/zeroconf/Zeroconf.py", line 650, in readOthers
+ self.readCharacterString(),
+ File "/private/tmp/hgtests.7idf706t/install/lib/python/hgext/zeroconf/Zeroconf.py", line 584, in readCharacterString
+ length = ord(self.data[self.offset])
+ TypeError: ord() expected string of length 1, but int found
foo = $TESTTMP/bar
The zeroconf extension has bytes vs str problems that are obvious from
inspection alone, and nobody has complained, so I'm not going to let this block
getting CI for macOS up and running. Given that it's in the packet read code,
I suspect that this 1) requires something on the network to speak mDNS, and 2)
it is a timing issue if this is seen or not. (The bytes vs str issue itself is
real, but only happen if a response is received quickly.)
Matt Harbison <matt_harbison@yahoo.com> [Fri, 11 Oct 2024 11:03:21 -0400] rev 52154
tests: disable `test-git-interop.t` with a requirements directive
Note that the failures in this test affect all platforms.
I don't like this, but the test has been broken for awhile because of dirstate
API changes, and nobody noticed because the required `pygit2` package isn't
installed on the CI systems. I did install it on the mac CI system, which
triggers this failure. Disabling it is no worse than not running it due to the
missing package, but at least this way the CI systems can get the package
installed, and the test can be enabled and fixed eventually, without needing to
alter the CI systems.
The feature here is kind of abused. I thought about adding one specifically to
test for CI, but didn't feel like doing it at this point. Maybe if we need to
disable things to get the Windows CI off the ground (but that likely requires
testing for CI + platform).
Matt Harbison <matt_harbison@yahoo.com> [Fri, 01 Nov 2024 16:22:40 -0400] rev 52153
tests: stabilize `test-extdiff.t` on macOS
The recent change in the extdiff extension to take into account whether the GUI
is accessible in
d1b54c152673 started triggering this. I was able to run the
test cleanly without this change at the console, but somewhere along the line, I
read that the CI runner isn't able to access the GUI when not run as the root
user. This is causing CI failures, so we conditionalize these tests out where
`DISPLAY` is set to a non empty value to force `procutil.isgui()` to be True,
when it in fact doesn't have GUI access.