chore(deps): update jdx/mise-action action to v4#47
Closed
renovate[bot] wants to merge 56 commits into
Closed
Conversation
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.
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.
…oml_options when both params are None
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
|
PR author is not in the allowed authors list. |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
Contributor
Author
Renovate Ignore NotificationBecause you closed this PR without merging, Renovate will ignore this update. You will not get PRs for any future If you accidentally closed this PR, or if you changed your mind: rename this PR to get a fresh replacement PR. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
v2→v4Release Notes
jdx/mise-action (jdx/mise-action)
v4Compare Source
v3Compare Source
🚀 Features
🐛 Bug Fixes
awaittocore.groupcalls (#305) by @smorimoto in #305📚 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.
This PR was generated by Mend Renovate. View the repository job log.