Skip to content

chore(deps): update jdx/mise-action action to v4#47

Closed
renovate[bot] wants to merge 56 commits into
mainfrom
renovate/jdx-mise-action-4.x
Closed

chore(deps): update jdx/mise-action action to v4#47
renovate[bot] wants to merge 56 commits into
mainfrom
renovate/jdx-mise-action-4.x

Conversation

@renovate
Copy link
Copy Markdown
Contributor

@renovate renovate Bot commented Apr 6, 2026

This PR contains the following updates:

Package Type Update Change
jdx/mise-action action major v2v4

Release Notes

jdx/mise-action (jdx/mise-action)

v4

Compare Source

v3

Compare Source

🚀 Features
🐛 Bug Fixes
📚 Documentation
⚙️ Miscellaneous Tasks
New Contributors


Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

Add assert_cmd, expectrl, and predicates as dev-dependencies. Create
src/e2e.rs with subprocess helpers (binary path resolution, project
init, skip functions, file assertions).

Add mise e2e and e2e:filter tasks that build the release binary then
run nextest with an E2E filter expression.

Proof tests: e2e_version_output verifies version string via NO_COLOR
subprocess; e2e_help_exits_zero verifies --help exit code.

730 tests total (659 lib + 71 integration).
TestProject holds a TempDir and provides cmd() for pre-configured
empack Commands (NO_COLOR, working directory set). Drop cleans up.
TestProject::initialized() creates a ready-to-use pack for tests
that need an existing project.

Skip macros (skip_if_no_packwiz, skip_if_no_java, skip_if_no_cf_key)
return early from tests when prerequisites are missing. Chained: java
checks packwiz first, cf_key checks packwiz first.

empack_cmd() helper builds a Command with NO_COLOR and workdir for
tests that don't use TestProject.
Six init tests covering --yes, --modloader variants, missing flags,
existing project detection, --force, and template scaffolding. Two
build tests covering mrpack export and clean.

Tests self-skip when packwiz or java are not in PATH.
Three add tests: uninitialized project detection, live sodium add,
nonexistent mod error. One interactive test using expectrl for the
init prompt flow (marked #[ignore]; dialoguer FuzzySelect through
PTY is fragile across environments).

Tests self-skip when packwiz is not available.
Eight locations across handle_add, handle_remove, and handle_sync
displayed errors to the user but returned Ok(()), causing the process
to exit 0. E2E tests could not distinguish success from failure.

All error-then-return paths now return Err(anyhow!(...)) with the
same message shown to the user. Unit tests updated from is_ok() to
is_err() for these conditions.

Also remove the -V short flag from init's --pack-version to resolve
a clap conflict with the propagated --version flag.
Four test-generation macros:
- e2e_init_modloader: tests each loader (fabric, forge, neoforge, none)
- e2e_bad_flag_value: tests invalid enum values (format, platform, type)
- e2e_requires_modpack: tests add/remove/sync/build in empty directory
- e2e_no_args_succeeds: tests --help for every subcommand + version

23 generated tests. Binary resolution prefers debug over release to
pick up the latest build from cargo nextest.
MockNetworkProvider.http_client() returned a real reqwest::Client with
a 30s timeout. Tests that called handle_init without --loader-version
hit real APIs (fabricmc.net, neoforged.net) and blocked for 30s per
request on timeout. With 12 init tests, this added ~9 minutes to the
suite in serial or 45s per test in parallel.

The Client now has a 1ms timeout. It remains a valid reqwest::Client
(handle_add can pass it to project_resolver, which is mocked
separately) but any real HTTP request fails instantly. Init tests drop
from 45s to ~1s each.
empack_bin() now checks target/llvm-cov-target/debug/empack first so
E2E subprocess tests contribute to coverage when run under cargo
llvm-cov. empack_assert_cmd() wraps this in an assert_cmd::Command.

All E2E tests now use empack_assert_cmd() or TestProject::cmd()
instead of Command::cargo_bin(). Coverage with E2E: 82.8% line,
75.2% branch (up from 80.4%/72.7% lib-only).

assert_cmd moved from dev-dependencies to dependencies since e2e.rs
is library code consumed by test files.
Merge check, test, and coverage into a single CI workflow with four
jobs: lint, test (ubuntu + macOS + windows), coverage (with E2E),
and cross-check (aarch64-linux, main only).

Changes:
- Tests run in debug mode (exposes debug assertions) on all three
  platforms for every PR and push to main/dev
- E2E tests run after unit tests with packwiz installed per-platform
- Coverage includes E2E via instrumented binary (packwiz installed)
- Remove standalone coverage.yml (merged into ci.yml)
- cross-check reduced to aarch64-linux only (x86_64 covered by test)
- Update artifact actions to v7/v8
- Add tasks/pwsh/e2e.ps1 and mise.toml Windows variant for E2E
- Release workflow unchanged except artifact action version bumps
- Add .exe suffix to all candidate paths in empack_bin() via
  cfg!(windows) so binary discovery works on Windows CI
- Add Default impl for TestProject to satisfy clippy
- Build empack binary before E2E step in CI workflow
- Replace hardcoded version string with env!("CARGO_PKG_VERSION")
E2E tests in empack-tests need the empack binary built before running.
Move binary build and packwiz install before the single test step.
Add sudo for macOS /usr/local/bin writes. Coverage job also builds
binary before llvm-cov run.
…ction in CI

Replace 12 external task scripts (tasks/sh/*.sh + tasks/pwsh/*.ps1)
with inline mise.toml tasks using run/run_windows. All task logic
is now in one file.

Add tools to [tools]: packwiz via Go backend, cargo-nextest, and
cargo-llvm-cov. mise install handles all tool setup on every platform.

Create mise.windows.toml (auto-selected by mise on Windows) for
Windows-specific settings.

CI uses jdx/mise-action@v2 to install mise + tools, then invokes
tasks via mise run. Packwiz installation is now handled by mise
(builds from Go source) instead of broken GitHub release URL downloads.
mise's cargo backend conflicts with dtolnay/rust-toolchain when both
try to manage the Rust toolchain. Keep packwiz in mise tools (Go
backend, no conflict). Install cargo-nextest and cargo-llvm-cov via
taiki-e/install-action (pre-built binaries, no Rust toolchain needed).

Lint job uses raw cargo commands (no mise needed for check/clippy).
mise's Go backend needs Go installed to build packwiz from source.
Add actions/setup-go@v5 in test and coverage jobs.

The test task now builds the empack binary first because E2E tests
in empack-tests need it (they run alongside unit tests in the same
nextest invocation).
test_init_packwiz_failure uses HermeticSessionBuilder which creates
bash shell script mocks. These don't work on Windows. The other two
tests in init_error_recovery.rs already have #[cfg(unix)]; this one
was missing it.
session-providers.md: add E2E test harness section documenting
TestProject, empack_bin(), skip macros. Note HermeticSessionBuilder
as being replaced.

Bootstrap v14.0: 765 tests, 82.8% coverage, CI green on 3 platforms.
Tool management table documenting mise vs taiki-e split.
…sertion

mise run test now filters out e2e_ tests with -E 'not test(~e2e_)'.
E2E tests only run via mise run e2e, eliminating duplicate packwiz
calls and halving live network time per CI job.

e2e_add_to_uninitialized now asserts !output.status.success() before
checking output content.
HermeticSessionBuilder, TestEnvironment, and bash script mock
generation are replaced by E2E subprocess tests via assert_cmd.
Remove MockBehavior::Conditional and ConditionalRule (unused).
Remove MockInvocation (only used by hermetic tests).
init_error_recovery.rs (HermeticSessionBuilder; replaced by e2e_init)
build_with_missing_template.rs (vacuous)
requirements_command.rs (replaced by E2E)
version_command.rs (replaced by e2e_version.rs)
Strengthen two init tests that previously asserted only is_ok():
- it_accepts_valid_loader_version_from_cli: verify pack.toml contains
  the specified loader version
- it_accepts_compatible_loader_fallback: verify empack.yml contains
  the selected loader

Update docs/testing.md: correct test counts (751 total, 659 lib +
92 integration), actual E2E file structure, resolved audit items,
remaining gaps reduced to 5 items.
Replace raw cargo nextest commands with mise run tasks. Remove
reference to nonexistent empack-e2e crate and "planned but not yet
implemented" note. Update development workflow to use mise run clippy.
Update PR checklist to use mise run test.
e2e_add_sodium_live now requires EMPACK_RUN_LIVE_TESTS=1 to prevent
flaky CI failures from Modrinth downtime or rate limits.

Remove redundant cargo build from coverage task; cargo llvm-cov
recompiles into its own target directory.

Remove duplicate NO_COLOR env set in e2e_bad_flag_value macro;
empack_assert_cmd() already sets it.
cargo llvm-cov nextest compiles test targets but not the standalone
empack binary. E2E tests need the binary at target/llvm-cov-target/.
Use cargo llvm-cov build -p empack first, then --no-clean to preserve
the instrumented binary's profile data.
cargo llvm-cov has no build subcommand. Use show-env --export-prefix
to export instrumentation env vars, then cargo build -p empack under
those vars. The binary lands in target/llvm-cov-target/debug/ where
empack_bin() finds it. --no-clean preserves the profile data.
show-env conflicts with cargo llvm-cov nextest (both set RUSTC_WRAPPER).
Use a plain cargo build for the binary; E2E tests find it in
target/debug/. Library coverage from llvm-cov nextest is unaffected.
packwiz writes error messages to stdout, not stderr. All 19
callsites that logged output.stderr on failure now use
error_output(), which prefers stderr but falls back to stdout
when stderr is empty.

Adds ProcessOutput::error_output() method to session.rs.
…ch lookup

Fixes init --from producing zero platform references for Modrinth
mrpack files. Root causes and fixes:

- mrpack files[] entries lack projectId; extract from CDN URL at
  parse time via extract_modrinth_project_id()
- Old Modrinth uploads use version numbers (not base62 IDs) in CDN
  URLs; resolve authoritative version ID via SHA1 hash lookup against
  /v2/version_file API during resolve phase
- mrpacks with CurseForge CDN URLs (edge.forgecdn.net) reclassified
  to CurseForge platform at parse time; file IDs batch-resolved via
  POST /v1/mods/files to get mod IDs
- Remaining unresolvable URLs (GitHub releases) fall back to packwiz
  url add for direct download
- Override-covered failures (Paxi datapacks in both files[] and
  overrides) demoted from warning to info
- sanitize_archive_path canonicalizes base before join to fix macOS
  /tmp symlink false positive
Python script that discovers, downloads, and analyzes popular
modpacks from Modrinth and CurseForge across MC versions. Produces
structured reports of content routing patterns (datapacks, overrides,
loaders) and optionally runs empack init --from on each pack.

Designed for re-running against updated binaries to track import
regressions across real-world modpacks.
…ack.yml

Extends EmpackProjectConfig with two optional fields for packwiz
[options] surface. Adds ConfigManager accessors and setters for
both fields. Adds write_pack_toml_options() to merge [options]
into an existing pack.toml without clobbering other content.

10 new unit tests covering roundtrip, omission, merge, and
preservation of existing keys.
mannie-exe and others added 24 commits April 5, 2026 12:44
7 unit tests for detect_datapack_folder covering all priority
levels: Paxi, Open Loader, root zips, files[] entries, raw JSON
exclusion, no signals, and priority ordering.

1 E2E test verifying --datapack-folder writes to both pack.toml
[options] and empack.yml.
…lder

CurseForge zip imports hardcode destination_path as mods/{id}.jar,
so the path-prefix check for datapacks/ never fired. Adds a final
priority check for cf_class_id == 6945 to catch CF datapacks that
were resolved during the batch file lookup.
Moves detect_datapack_folder() above format_empack_yml() in
execute_import so auto-detected values (Paxi, Open Loader, root
datapacks) are written to both empack.yml and pack.toml. Previously,
empack.yml was written with None while only pack.toml received the
detected value.
… time

Local builds show 0.0.0-dev. Release workflow now:
- Sets Cargo.toml version from the git tag before building
- Passes GIT_HASH and BUILD_DATE env vars to cargo/cross

Also updates README with init --from examples, usage docs with
new --datapack-folder/--game-versions/--from flags, and testing
docs with current test counts (676 + 93).
Adds a second git-cliff invocation that writes the cumulative
CHANGELOG.md and pushes it to dev after creating the GitHub release.
Uses the numeric github-actions bot identity for attribution.
Replaces raw llvm-cov dump in step summary with a code-fenced block.
Adds codecov-action@v6 upload after coverage generation. Adds
codecov.yml with 5% threshold, test file ignores, and PR comment
layout. Adds coverage badge to README.
… resolve

Moves format_empack_yml to config.rs as the single source; removes
duplicate copies from commands.rs and import.rs. Adds early return
in resolve_platform_ref for CurseForge entries with empty project_id
(prevents spurious API call to /v1/mods/ with empty path segment).
The release job runs on a tag that points to main. Pushing to dev
caused a non-fast-forward rejection since dev has commits ahead of
main. The changelog belongs on main (where the tag lives); it flows
to dev on the next merge.
The build pre-flight scan was flagging ALL CurseForge mods as
restricted because every CF mod has mode=metadata:curseforge with
no url field in its .pw.toml. This is the normal CF format, not
a restriction signal. The scan now batch-queries the CF API to
check downloadUrl for each file ID; only mods with null downloadUrl
are flagged.

Also removes the false-positive restriction detection from the add
path (packwiz add success means the mod is not restricted), removes
the browser-open-all-URLs-immediately behavior, and fixes the
release workflow (git-cliff not on PATH; use Action output instead).
packwiz-installer already handles restricted download detection via
CF API queries and reports failures with download URLs and file
paths. empack's pre-flight scan was duplicating this logic
incorrectly: parse_restricted_pw_toml flagged ALL CF mods because
metadata:curseforge + no url is the normal .pw.toml format.

Removed: RestrictedMod, parse_cf_metadata_pw_toml, scan_restricted_mods,
packwiz_cache_import_dir, packwiz_user_cache_dir, the pre-flight block
in handle_build, and ~900 lines of associated tests.

The build path now runs packwiz-installer directly; restricted mod
errors surface through its output. Proper output parsing for
restricted messages is follow-up work.
install_mods now returns InstallResult::RestrictedMods when
packwiz-installer reports mods excluded from the CurseForge API.
Parses "excluded from the CurseForge API" messages from installer
output to extract mod name, download URL, and destination path.

handle_build presents restricted mods with download URLs and file
paths, then exits with an error. Users download the files, place
them at the listed paths, and re-run the build.
…r restricted mods

Adds --downloads-dir CLI flag (EMPACK_DOWNLOADS_DIR env) to empack
build for specifying where manually downloaded restricted mod files
are located. When restricted mods are detected and TTY is available,
prompts user with confirm before opening download URLs in browser.
Non-interactive mode prints URLs and exits.
When restricted mods are detected, scans --downloads-dir (default
~/Downloads) for files matching the expected filenames. Found files
are copied to the destination paths packwiz-installer expects. If
all restricted mods are placed, automatically re-runs the build.

Remaining unresolved mods are presented with download URLs; in
interactive mode, user is prompted before opening browser.
…head parser

- Replace std::fs::copy with session.filesystem().read_bytes +
  write_bytes to maintain mock testability
- Check retry build results for still-restricted mods and failures
  instead of unconditionally reporting success
- Move "Scanning downloads dir" message before the scan loop
- Parser scans up to 5 lines ahead for URL line to handle
  interleaved stack traces; always pushes mod even without URL
Two new E2E tests in e2e_import_build.rs:
- e2e_import_modrinth_and_build_mrpack: downloads FO 1.20.1 mrpack,
  imports via init --from, builds mrpack, asserts artifact exists
- e2e_import_curseforge_and_check_restricted: downloads Cobblemon
  Updated CF zip, imports, attempts client-full build, asserts
  restricted mod output on failure

Writing fixes: em-dash replacements in commands.rs comments, doc
comments on BuildResult fields.
# Conflicts:
#	.github/workflows/ci.yml
#	crates/empack-lib/src/application/commands.rs
#	crates/empack-lib/src/empack/import.rs
#	crates/empack-lib/src/empack/packwiz.rs
@greptile-apps
Copy link
Copy Markdown

greptile-apps Bot commented Apr 6, 2026

PR author is not in the allowed authors list.

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 6, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@mannie-exe mannie-exe closed this Apr 6, 2026
@mannie-exe mannie-exe deleted the renovate/jdx-mise-action-4.x branch April 6, 2026 06:58
@renovate
Copy link
Copy Markdown
Contributor Author

renovate Bot commented Apr 6, 2026

Renovate Ignore Notification

Because you closed this PR without merging, Renovate will ignore this update. You will not get PRs for any future 4.x releases. But if you manually upgrade to 4.x then Renovate will re-enable minor and patch updates automatically.

If you accidentally closed this PR, or if you changed your mind: rename this PR to get a fresh replacement PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant