From 4ab1e52121f15e0879614a27090384cd4f26c5f0 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Tue, 13 May 2025 08:06:13 -0400 Subject: [PATCH 001/119] QPM 2 proof of concept packaging --- qpm2.jsonc | 85 +++++++++++++++++++++++++++++++++++++++++++++++ qpm2.qpkg.jsonc | 12 +++++++ qpm2.shared.jsonc | 65 ++++++++++++++++++++++++++++++++++++ 3 files changed, 162 insertions(+) create mode 100644 qpm2.jsonc create mode 100644 qpm2.qpkg.jsonc create mode 100644 qpm2.shared.jsonc diff --git a/qpm2.jsonc b/qpm2.jsonc new file mode 100644 index 0000000..aab3e72 --- /dev/null +++ b/qpm2.jsonc @@ -0,0 +1,85 @@ +{ + // proof of concept for qpm2 + "id": "foo", + "version": "0.0.1", + // directories that will be exported to the .qpkg + + // restore location for dependencies + "dependenciesDirectory": "extern", + "sharedDirectories": ["include"], + "workspace": { + // scripts to run before building + "scripts": { + "build": ["echo 'prebuild script'"] + }, + // directories to search for including files + "qmodSearchDirs": ["include"], + // files to include in the build + "qmodIncludeFiles": ["README.md"], + // output directory for the build + "qmodOutput": null + }, + // additional data to be included in the .qpkg + "additionalData": { + "description": "A test package", + "author": "Your Name", + "license": "MIT" + }, + "triplet": { + // applies settings to all triplets. Overrides can be set in the triplet section + // and will be merged with the default settings + // Overriden keys are NOT merged with the default settings, and will be replaced + // with the new value + "default": { + "dependencies": { + // dependencies that will be included in the .qpkg + "beatsaber-hook": { + "versionRange": "^6.1.9", + "triplet": "android/arm64/shared" + }, + "flamingo": { + "versionRange": "^6.1.9", + "triplet": "android/arm64/static" + }, + "chroma": { + "versionRange": "^6.1.9", + "triplet": "android/arm64/headerOnly", + // if true, this dependency will be included in the dependency tree + // by consumers + "export": true, + // if true, this dependency will be included in the qmod + // either as a shared library or as qmod link + "qmodExport": true + } + }, + "env": { + "QMOD_PACKAGE_ID": "foo", + "QMOD_PACKAGE_VERSION": "0.0.1" + } + }, + "android/arm64/shared": { + "dependencies": { + "custom-json-data": { + "versionRange": "^6.1.9", + "triplet": "android/arm64/shared" + } + } + }, + "android/arm64/static": { + "dependencies": { + "curl": { + "versionRange": "^6.1.9", + "triplet": "android/arm64/static" + } + } + }, + "android/arm64/headerOnly": { + "dependencies": { + "chroma": { + "versionRange": "^6.1.9", + "triplet": "android/arm64/headerOnly" + } + } + } + } +} diff --git a/qpm2.qpkg.jsonc b/qpm2.qpkg.jsonc new file mode 100644 index 0000000..168e584 --- /dev/null +++ b/qpm2.qpkg.jsonc @@ -0,0 +1,12 @@ +{ + // qpkg information about the distributed package + // per triplet + "android/arm64/shared": { + // path to the shared binary + "path": "android/arm64/shared/libfoo.so", + }, + "android/arm64/static": { + // path to the static binary + "path": "libfoo.a", + }, +} \ No newline at end of file diff --git a/qpm2.shared.jsonc b/qpm2.shared.jsonc new file mode 100644 index 0000000..514af59 --- /dev/null +++ b/qpm2.shared.jsonc @@ -0,0 +1,65 @@ +{ + // proof of concept for qpm2 + "config": {}, + + // triplets restore rules + // this should only be used for restoring the current package + // and not during the dependency restore process + "lockedTriplet": { + // default should not appear here. All triplets should be listed + // TODO: Include checksums here? + // TODO: Include qpkg urls here? + + + "android/arm64/shared": { + "restoredDependencies": { + // inherited from default + "beatsaber-hook": { + "restoredVersion": "6.2.9", + "versionRange": "^6.1.9", + "triplet": "android/arm64/shared" + }, + "flamingo": { + "restoredVersion": "6.2.9", + "versionRange": "^6.1.9", + "triplet": "android/arm64/static" + }, + "chroma": { + "restoredVersion": "6.2.9", + "versionRange": "^6.1.9", + "triplet": "android/arm64/headerOnly" + }, + // specific to this triplet + "custom-json-data": { + "versionRange": "^6.1.9", + "triplet": "android/arm64/shared" + } + } + }, + "android/arm64/static": { + "restoredDependencies": { + // inherited from default + "beatsaber-hook": { + "restoredVersion": "6.2.9", + "versionRange": "^6.1.9", + "triplet": "android/arm64/shared" + }, + "flamingo": { + "restoredVersion": "6.2.9", + "versionRange": "^6.1.9", + "triplet": "android/arm64/static" + }, + "chroma": { + "restoredVersion": "6.2.9", + "versionRange": "^6.1.9", + "triplet": "android/arm64/headerOnly" + }, + // specific to this triplet + "curl": { + "versionRange": "^6.1.9", + "triplet": "android/arm64/shared" + } + } + } + } +} \ No newline at end of file From a70cb21264a03888c136f135bbeae6d4653a8b57 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Tue, 13 May 2025 08:10:50 -0400 Subject: [PATCH 002/119] multiple file restore --- qpm2.qpkg.jsonc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/qpm2.qpkg.jsonc b/qpm2.qpkg.jsonc index 168e584..472fe00 100644 --- a/qpm2.qpkg.jsonc +++ b/qpm2.qpkg.jsonc @@ -3,10 +3,15 @@ // per triplet "android/arm64/shared": { // path to the shared binary - "path": "android/arm64/shared/libfoo.so", + "files": [ + "android/arm64/shared/libfoo.so", + "android/arm64/shared/libfoo_dependency.so" + ] }, "android/arm64/static": { // path to the static binary - "path": "libfoo.a", + "files": [ + "libfoo.a" + ] }, } \ No newline at end of file From 73e7645d1c8f0947b81fb8c79b3c871cf6c44d7c Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 28 May 2025 19:19:30 -0400 Subject: [PATCH 003/119] Begin QPM2 transformation --- Cargo.lock | 1971 ++++++++-------------------------------------------- Cargo.toml | 26 +- 2 files changed, 292 insertions(+), 1705 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index db7ea67..f7bb905 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,29 +17,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy 0.7.35", -] - [[package]] name = "aho-corasick" version = "1.1.3" @@ -64,12 +41,6 @@ dependencies = [ "alloc-no-stdlib", ] -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - [[package]] name = "anstream" version = "0.6.18" @@ -111,12 +82,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" dependencies = [ "anstyle", - "once_cell", + "once_cell_polyfill", "windows-sys 0.59.0", ] @@ -135,12 +106,6 @@ dependencies = [ "derive_arbitrary", ] -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - [[package]] name = "async-compression" version = "0.4.23" @@ -155,12 +120,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - [[package]] name = "autocfg" version = "1.4.0" @@ -190,7 +149,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -207,18 +166,9 @@ checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" [[package]] name = "bitflags" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" - -[[package]] -name = "block-buffer" -version = "0.10.4" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "brotli" @@ -241,29 +191,12 @@ dependencies = [ "alloc-stdlib", ] -[[package]] -name = "bstr" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" -dependencies = [ - "memchr", - "regex-automata", - "serde", -] - [[package]] name = "bumpalo" version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - [[package]] name = "bytes" version = "1.10.1" @@ -291,9 +224,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.21" +version = "1.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" +checksum = "16595d3be041c03b09d08d0858631facccee9221e579704070e6e9e4915d3bc7" dependencies = [ "jobserver", "libc", @@ -312,21 +245,11 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - [[package]] name = "clap" -version = "4.5.37" +version = "4.5.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" +checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f" dependencies = [ "clap_builder", "clap_derive", @@ -334,9 +257,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.37" +version = "4.5.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" +checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51" dependencies = [ "anstream", "anstyle", @@ -346,9 +269,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.50" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91d3baa3bcd889d60e6ef28874126a0b384fd225ab83aa6d8a801c519194ce1" +checksum = "8d2267df7f3c8e74e38268887ea5235d4dfadd39bfff2d56ab82d61776be355e" dependencies = [ "clap", ] @@ -371,12 +294,6 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" -[[package]] -name = "clru" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbd0f76e066e64fdc5631e3bb46381254deab9ef1158292f27c8c57e3bf3fe59" - [[package]] name = "color-eyre" version = "0.6.4" @@ -410,12 +327,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - [[package]] name = "content_inspector" version = "0.2.4" @@ -425,46 +336,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - [[package]] name = "crc32fast" version = "1.4.2" @@ -508,16 +379,6 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - [[package]] name = "cursed-semver-parser" version = "0.1.0" @@ -555,17 +416,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] - [[package]] name = "dirs" version = "6.0.0" @@ -616,15 +466,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -633,9 +474,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", "windows-sys 0.59.0", @@ -651,16 +492,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "faster-hex" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7223ae2d2f179b803433d9c830478527e92b8117eab39460edae7f1614d9fb73" -dependencies = [ - "heapless", - "serde", -] - [[package]] name = "fastrand" version = "2.3.0" @@ -776,16 +607,6 @@ dependencies = [ "slab", ] -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - [[package]] name = "getrandom" version = "0.2.16" @@ -801,9 +622,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "js-sys", @@ -835,1028 +656,170 @@ dependencies = [ ] [[package]] -name = "gix" -version = "0.72.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01237e8d3d78581f71642be8b0c2ae8c0b2b5c251c9c5d9ebbea3c1ea280dce8" -dependencies = [ - "gix-actor", - "gix-attributes", - "gix-command", - "gix-commitgraph", - "gix-config", - "gix-credentials", - "gix-date", - "gix-diff", - "gix-discover", - "gix-features", - "gix-filter", - "gix-fs", - "gix-glob", - "gix-hash", - "gix-hashtable", - "gix-ignore", - "gix-index", - "gix-lock", - "gix-negotiate", - "gix-object", - "gix-odb", - "gix-pack", - "gix-path", - "gix-pathspec", - "gix-prompt", - "gix-protocol", - "gix-ref", - "gix-refspec", - "gix-revision", - "gix-revwalk", - "gix-sec", - "gix-shallow", - "gix-submodule", - "gix-tempfile", - "gix-trace", - "gix-transport", - "gix-traverse", - "gix-url", - "gix-utils", - "gix-validate", - "gix-worktree", - "gix-worktree-state", - "once_cell", - "prodash", - "smallvec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-actor" -version = "0.35.1" +name = "glob" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b300e6e4f31f3f6bd2de5e2b0caab192ced00dc0fcd0f7cc56e28c575c8e1ff" -dependencies = [ - "bstr", - "gix-date", - "gix-utils", - "itoa", - "thiserror 2.0.12", - "winnow", -] +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] -name = "gix-attributes" -version = "0.26.0" +name = "hashbrown" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e26b3ac280ddb25bb6980d34f4a82ee326f78bf2c6d4ea45eef2d940048b8e" -dependencies = [ - "bstr", - "gix-glob", - "gix-path", - "gix-quote", - "gix-trace", - "kstring", - "smallvec", - "thiserror 2.0.12", - "unicode-bom", -] +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" [[package]] -name = "gix-bitmap" -version = "0.2.14" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1db9765c69502650da68f0804e3dc2b5f8ccc6a2d104ca6c85bc40700d37540" -dependencies = [ - "thiserror 2.0.12", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "gix-chunk" -version = "0.4.11" +name = "http" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b1f1d8764958699dc764e3f727cef280ff4d1bd92c107bbf8acd85b30c1bd6f" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ - "thiserror 2.0.12", + "bytes", + "fnv", + "itoa", ] [[package]] -name = "gix-command" -version = "0.6.0" +name = "http-body" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f47f3fb4ba33644061e8e0e1030ef2a937d42dc969553118c320a205a9fb28" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ - "bstr", - "gix-path", - "gix-quote", - "gix-trace", - "shell-words", + "bytes", + "http", ] [[package]] -name = "gix-commitgraph" -version = "0.28.0" +name = "http-body-util" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05050fd6caa6c731fe3bd7f9485b3b520be062d3d139cb2626e052d6c127951" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ - "bstr", - "gix-chunk", - "gix-hash", - "memmap2", - "thiserror 2.0.12", + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", ] [[package]] -name = "gix-config" -version = "0.45.1" +name = "httparse" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f3c8f357ae049bfb77493c2ec9010f58cfc924ae485e1116c3718fc0f0d881" -dependencies = [ - "bstr", - "gix-config-value", - "gix-features", - "gix-glob", - "gix-path", - "gix-ref", - "gix-sec", - "memchr", - "once_cell", - "smallvec", - "thiserror 2.0.12", - "unicode-bom", - "winnow", -] +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] -name = "gix-config-value" -version = "0.15.0" +name = "humantime" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439d62e241dae2dffd55bfeeabe551275cf9d9f084c5ebc6b48bad49d03285b7" -dependencies = [ - "bitflags", - "bstr", - "gix-path", - "libc", - "thiserror 2.0.12", -] +checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" [[package]] -name = "gix-credentials" -version = "0.29.0" +name = "humantime-serde" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce1c7307e36026b6088e5b12014ffe6d4f509c911ee453e22a7be4003a159c9b" +checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" dependencies = [ - "bstr", - "gix-command", - "gix-config-value", - "gix-path", - "gix-prompt", - "gix-sec", - "gix-trace", - "gix-url", - "thiserror 2.0.12", + "humantime", + "serde", ] [[package]] -name = "gix-date" -version = "0.10.1" +name = "hyper" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a98593f1f1e14b9fa15c5b921b2c465e904d698b9463e21bb377be8376c3c1a" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ - "bstr", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", "itoa", - "jiff", + "pin-project-lite", "smallvec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-diff" -version = "0.52.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e9b43e95fe352da82a969f0c84ff860c2de3e724d93f6681fedbcd6c917f252" -dependencies = [ - "bstr", - "gix-hash", - "gix-object", - "thiserror 2.0.12", + "tokio", + "want", ] [[package]] -name = "gix-discover" -version = "0.40.1" +name = "hyper-rustls" +version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dccfe3e25b4ea46083916c56db3ba9d1e6ef6dce54da485f0463f9fc0fe1837c" +checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" dependencies = [ - "bstr", - "dunce", - "gix-fs", - "gix-hash", - "gix-path", - "gix-ref", - "gix-sec", - "thiserror 2.0.12", + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", ] [[package]] -name = "gix-features" -version = "0.42.1" +name = "hyper-util" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f4399af6ec4fd9db84dd4cf9656c5c785ab492ab40a7c27ea92b4241923fed" +checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" dependencies = [ + "base64", "bytes", - "crc32fast", - "flate2", - "gix-path", - "gix-trace", - "gix-utils", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", "libc", - "once_cell", - "prodash", - "thiserror 2.0.12", - "walkdir", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", ] [[package]] -name = "gix-filter" -version = "0.19.1" +name = "icu_collections" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90c21f0d61778f518bbb7c431b00247bf4534b2153c3e85bcf383876c55ca6c" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ - "bstr", - "encoding_rs", - "gix-attributes", - "gix-command", - "gix-hash", - "gix-object", - "gix-packetline-blocking", - "gix-path", - "gix-quote", - "gix-trace", - "gix-utils", - "smallvec", - "thiserror 2.0.12", + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", ] [[package]] -name = "gix-fs" -version = "0.15.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a0637149b4ef24d3ea55f81f77231401c8463fae6da27331c987957eb597c7" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ - "bstr", - "fastrand", - "gix-features", - "gix-path", - "gix-utils", - "thiserror 2.0.12", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "gix-glob" -version = "0.20.0" +name = "icu_normalizer" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2926b03666e83b8d01c10cf06e5733521aacbd2d97179a4c9b1fdddabb9e937d" -dependencies = [ - "bitflags", - "bstr", - "gix-features", - "gix-path", -] - -[[package]] -name = "gix-hash" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d4900562c662852a6b42e2ef03442eccebf24f047d8eab4f23bc12ef0d785d8" -dependencies = [ - "faster-hex", - "gix-features", - "sha1-checked", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-hashtable" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b5cb3c308b4144f2612ff64e32130e641279fcf1a84d8d40dad843b4f64904" -dependencies = [ - "gix-hash", - "hashbrown 0.14.5", - "parking_lot", -] - -[[package]] -name = "gix-ignore" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae358c3c96660b10abc7da63c06788dfded603e717edbd19e38c6477911b71c8" -dependencies = [ - "bstr", - "gix-glob", - "gix-path", - "gix-trace", - "unicode-bom", -] - -[[package]] -name = "gix-index" -version = "0.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d505aea7d7c4267a3153cb90c712a89970b4dd02a2cb3205be322891f530b5" -dependencies = [ - "bitflags", - "bstr", - "filetime", - "fnv", - "gix-bitmap", - "gix-features", - "gix-fs", - "gix-hash", - "gix-lock", - "gix-object", - "gix-traverse", - "gix-utils", - "gix-validate", - "hashbrown 0.14.5", - "itoa", - "libc", - "memmap2", - "rustix", - "smallvec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-lock" -version = "17.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "570f8b034659f256366dc90f1a24924902f20acccd6a15be96d44d1269e7a796" -dependencies = [ - "gix-tempfile", - "gix-utils", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-negotiate" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e1ea901acc4d5b44553132a29e8697210cb0e739b2d9752d713072e9391e3c9" -dependencies = [ - "bitflags", - "gix-commitgraph", - "gix-date", - "gix-hash", - "gix-object", - "gix-revwalk", - "smallvec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-object" -version = "0.49.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d957ca3640c555d48bb27f8278c67169fa1380ed94f6452c5590742524c40fbb" -dependencies = [ - "bstr", - "gix-actor", - "gix-date", - "gix-features", - "gix-hash", - "gix-hashtable", - "gix-path", - "gix-utils", - "gix-validate", - "itoa", - "smallvec", - "thiserror 2.0.12", - "winnow", -] - -[[package]] -name = "gix-odb" -version = "0.69.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "868f703905fdbcfc1bd750942f82419903ecb7039f5288adb5206d6de405e0c9" -dependencies = [ - "arc-swap", - "gix-date", - "gix-features", - "gix-fs", - "gix-hash", - "gix-hashtable", - "gix-object", - "gix-pack", - "gix-path", - "gix-quote", - "parking_lot", - "tempfile", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-pack" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d49c55d69c8449f2a0a5a77eb9cbacfebb6b0e2f1215f0fc23a4cb60528a450" -dependencies = [ - "clru", - "gix-chunk", - "gix-features", - "gix-hash", - "gix-hashtable", - "gix-object", - "gix-path", - "gix-tempfile", - "memmap2", - "parking_lot", - "smallvec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-packetline" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ddc034bc67c848e4ef7596ab5528cd8fd439d310858dbe1ce8b324f25deb91c" -dependencies = [ - "bstr", - "faster-hex", - "gix-trace", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-packetline-blocking" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c44880f028ba46d6cf37a66d27a300310c6b51b8ed0e44918f93df061168e2f3" -dependencies = [ - "bstr", - "faster-hex", - "gix-trace", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-path" -version = "0.10.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c091d2e887e02c3462f52252c5ea61150270c0f2657b642e8d0d6df56c16e642" -dependencies = [ - "bstr", - "gix-trace", - "gix-validate", - "home", - "once_cell", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-pathspec" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce061c50e5f8f7c830cacb3da3e999ae935e283ce8522249f0ce2256d110979d" -dependencies = [ - "bitflags", - "bstr", - "gix-attributes", - "gix-config-value", - "gix-glob", - "gix-path", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-prompt" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d024a3fe3993bbc17733396d2cefb169c7a9d14b5b71dafb7f96e3962b7c3128" -dependencies = [ - "gix-command", - "gix-config-value", - "parking_lot", - "rustix", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-protocol" -version = "0.50.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5c17d78bb0414f8d60b5f952196dc2e47ec320dca885de9128ecdb4a0e38401" -dependencies = [ - "bstr", - "gix-credentials", - "gix-date", - "gix-features", - "gix-hash", - "gix-lock", - "gix-negotiate", - "gix-object", - "gix-ref", - "gix-refspec", - "gix-revwalk", - "gix-shallow", - "gix-trace", - "gix-transport", - "gix-utils", - "maybe-async", - "thiserror 2.0.12", - "winnow", -] - -[[package]] -name = "gix-quote" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a375a75b4d663e8bafe3bf4940a18a23755644c13582fa326e99f8f987d83fd" -dependencies = [ - "bstr", - "gix-utils", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-ref" -version = "0.52.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1b7985657029684d759f656b09abc3e2c73085596d5cdb494428823970a7762" -dependencies = [ - "gix-actor", - "gix-features", - "gix-fs", - "gix-hash", - "gix-lock", - "gix-object", - "gix-path", - "gix-tempfile", - "gix-utils", - "gix-validate", - "memmap2", - "thiserror 2.0.12", - "winnow", -] - -[[package]] -name = "gix-refspec" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445ed14e3db78e8e79980085e3723df94e1c8163b3ae5bc8ed6a8fe6cf983b42" -dependencies = [ - "bstr", - "gix-hash", - "gix-revision", - "gix-validate", - "smallvec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-revision" -version = "0.34.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78d0b8e5cbd1c329e25383e088cb8f17439414021a643b30afa5146b71e3c65d" -dependencies = [ - "bstr", - "gix-commitgraph", - "gix-date", - "gix-hash", - "gix-object", - "gix-revwalk", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-revwalk" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc756b73225bf005ddeb871d1ca7b3c33e2417d0d53e56effa5a36765b52b28" -dependencies = [ - "gix-commitgraph", - "gix-date", - "gix-hash", - "gix-hashtable", - "gix-object", - "smallvec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-sec" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0dabbc78c759ecc006b970339394951b2c8e1e38a37b072c105b80b84c308fd" -dependencies = [ - "bitflags", - "gix-path", - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "gix-shallow" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9a6f6e34d6ede08f522d89e5c7990b4f60524b8ae6ebf8e850963828119ad4" -dependencies = [ - "bstr", - "gix-hash", - "gix-lock", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-submodule" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f51472f05a450cc61bc91ed2f62fb06e31e2bbb31c420bc4be8793f26c8b0c1" -dependencies = [ - "bstr", - "gix-config", - "gix-path", - "gix-pathspec", - "gix-refspec", - "gix-url", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-tempfile" -version = "17.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c750e8c008453a2dba67a2b0d928b7716e05da31173a3f5e351d5457ad4470aa" -dependencies = [ - "gix-fs", - "libc", - "once_cell", - "parking_lot", - "tempfile", -] - -[[package]] -name = "gix-trace" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c396a2036920c69695f760a65e7f2677267ccf483f25046977d87e4cb2665f7" - -[[package]] -name = "gix-transport" -version = "0.47.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfe22ba26d4b65c17879f12b9882eafe65d3c8611c933b272fce2c10f546f59" -dependencies = [ - "base64", - "bstr", - "gix-command", - "gix-credentials", - "gix-features", - "gix-packetline", - "gix-quote", - "gix-sec", - "gix-url", - "reqwest", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-traverse" -version = "0.46.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39094185f6d9a4d81101130fbbf7f598a06441d774ae3b3ae7930a613bbe1157" -dependencies = [ - "bitflags", - "gix-commitgraph", - "gix-date", - "gix-hash", - "gix-hashtable", - "gix-object", - "gix-revwalk", - "smallvec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-url" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a1ad0b04a5718b5cb233e6888e52a9b627846296161d81dcc5eb9203ec84b8" -dependencies = [ - "bstr", - "gix-features", - "gix-path", - "percent-encoding", - "thiserror 2.0.12", - "url", -] - -[[package]] -name = "gix-utils" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5351af2b172caf41a3728eb4455326d84e0d70fe26fc4de74ab0bd37df4191c5" -dependencies = [ - "fastrand", - "unicode-normalization", -] - -[[package]] -name = "gix-validate" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77b9e00cacde5b51388d28ed746c493b18a6add1f19b5e01d686b3b9ece66d4d" -dependencies = [ - "bstr", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-worktree" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54f1916f8d928268300c977d773dd70a8746b646873b77add0a34876a8c847e9" -dependencies = [ - "bstr", - "gix-attributes", - "gix-features", - "gix-fs", - "gix-glob", - "gix-hash", - "gix-ignore", - "gix-index", - "gix-object", - "gix-path", - "gix-validate", -] - -[[package]] -name = "gix-worktree-state" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81e31496d034dbdac87535b0b9d4659dbbeabaae1045a0dce7c69b5d16ea7d6" -dependencies = [ - "bstr", - "gix-features", - "gix-filter", - "gix-fs", - "gix-glob", - "gix-hash", - "gix-index", - "gix-object", - "gix-path", - "gix-worktree", - "io-close", - "thiserror 2.0.12", -] - -[[package]] -name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - -[[package]] -name = "h2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hash32" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" -dependencies = [ - "byteorder", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "hashbrown" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" - -[[package]] -name = "heapless" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" -dependencies = [ - "hash32", - "stable_deref_trait", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "humantime" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" - -[[package]] -name = "humantime-serde" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" -dependencies = [ - "humantime", - "serde", -] - -[[package]] -name = "hyper" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots 0.26.11", -] - -[[package]] -name = "hyper-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "libc", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -1864,67 +827,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "idna" version = "1.0.3" @@ -1938,9 +888,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -1959,34 +909,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.3", + "hashbrown", ] [[package]] -name = "inout" -version = "0.1.4" +name = "ipnet" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "generic-array", -] +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] -name = "io-close" -version = "0.3.7" +name = "iri-string" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cadcf447f06744f8ce713d2d6239bb5bde2c357a452397a9ed90c625da390bc" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" dependencies = [ - "libc", - "winapi", + "memchr", + "serde", ] -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -2008,54 +949,13 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" -[[package]] -name = "jiff" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02000660d30638906021176af16b17498bd0d12813dbfe7b276d8bc7f3c0806" -dependencies = [ - "jiff-static", - "jiff-tzdb-platform", - "log", - "portable-atomic", - "portable-atomic-util", - "serde", - "windows-sys 0.59.0", -] - -[[package]] -name = "jiff-static" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c30758ddd7188629c6713fc45d1188af4f44c90582311d0c8d8c9907f60c48" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "jiff-tzdb" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1283705eb0a21404d2bfd6eef2a7593d240bc42a0bdb39db0ad6fa2ec026524" - -[[package]] -name = "jiff-tzdb-platform" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" -dependencies = [ - "jiff-tzdb", -] - [[package]] name = "jobserver" version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", "libc", ] @@ -2078,15 +978,6 @@ dependencies = [ "log", ] -[[package]] -name = "kstring" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558bf9508a558512042d3095138b1f7b8fe90c5467d94f9f1da28b3731c5dbd1" -dependencies = [ - "static_assertions", -] - [[package]] name = "lazy_static" version = "1.5.0" @@ -2113,6 +1004,26 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "liblzma" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66352d7a8ac12d4877b6e6ea5a9b7650ee094257dc40889955bea5bc5b08c1d0" +dependencies = [ + "liblzma-sys", +] + +[[package]] +name = "liblzma-sys" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5839bad90c3cc2e0b8c4ed8296b80e86040240f81d46b9c0e9bc8dd51ddd3af1" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "libredox" version = "0.1.3" @@ -2167,19 +1078,9 @@ checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" - -[[package]] -name = "lock_api" -version = "0.4.12" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "log" @@ -2198,64 +1099,29 @@ dependencies = [ [[package]] name = "logos-derive" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d849148dbaf9661a6151d1ca82b13bb4c4c128146a88d05253b38d4e2f496c" -dependencies = [ - "beef", - "fnv", - "proc-macro2", - "quote", - "regex-syntax 0.6.29", - "syn 1.0.109", -] - -[[package]] -name = "lzma-rs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" -dependencies = [ - "byteorder", - "crc", -] - -[[package]] -name = "lzma-sys" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - -[[package]] -name = "maybe-async" -version = "0.2.10" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" +checksum = "a1d849148dbaf9661a6151d1ca82b13bb4c4c128146a88d05253b38d4e2f496c" dependencies = [ + "beef", + "fnv", "proc-macro2", "quote", - "syn 2.0.101", + "regex-syntax 0.6.29", + "syn 1.0.109", ] [[package]] -name = "memchr" -version = "2.7.4" +name = "lru-slab" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] -name = "memmap2" -version = "0.9.5" +name = "memchr" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" -dependencies = [ - "libc", -] +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -2274,13 +1140,13 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2289,6 +1155,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" +[[package]] +name = "nt-time" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c367e8edaff1f8a871e56343eb5e03888f6e0d1c2861880ccf4b7dc830899ed" +dependencies = [ + "time", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -2319,6 +1194,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "openssl" version = "0.10.72" @@ -2381,9 +1262,9 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "os_pipe" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" +checksum = "db335f4760b14ead6290116f2427bf33a14d4f0617d49f78a246de10c1831224" dependencies = [ "libc", "windows-sys 0.59.0", @@ -2391,32 +1272,9 @@ dependencies = [ [[package]] name = "owo-colors" -version = "4.2.0" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1036865bb9422d3300cf723f657c2851d0e9ab12567854b1f4eba3d77decf564" - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] +checksum = "26995317201fa17f3656c36716aed4a7c81743a9634ac4c99c0eeda495db0cec" [[package]] name = "pathdiff" @@ -2424,16 +1282,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest", - "hmac", -] - [[package]] name = "pbr" version = "1.1.1" @@ -2470,18 +1318,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] -name = "portable-atomic" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" - -[[package]] -name = "portable-atomic-util" -version = "0.2.4" +name = "potential_utf" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" dependencies = [ - "portable-atomic", + "zerovec", ] [[package]] @@ -2496,14 +1338,14 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.25", + "zerocopy", ] [[package]] name = "priority-queue" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef08705fa1589a1a59aa924ad77d14722cb0cd97b67dd5004ed5f4a4873fce8d" +checksum = "b816314f0ba557376adec2392396a0b5c8195b25ef5394b7eea496ac26e353e4" dependencies = [ "autocfg", "equivalent", @@ -2519,16 +1361,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "prodash" -version = "29.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04bb108f648884c23b98a0e940ebc2c93c0c3b89f04dbaf7eb8256ce617d1bc" -dependencies = [ - "log", - "parking_lot", -] - [[package]] name = "pubgrub" version = "0.3.0" @@ -2564,7 +1396,6 @@ dependencies = [ "cursed-semver-parser", "dirs", "fs_extra", - "gix", "itertools", "keyring", "openssl", @@ -2592,8 +1423,8 @@ dependencies = [ [[package]] name = "qpm_package" -version = "0.4.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git#822a247a99dc6131f12bdb176838e5d262d8e7e0" +version = "2.0.0" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#2c1a2cbe714ae88c61b4fa4d9d7bff2728a8008e" dependencies = [ "cursed-semver-parser", "schemars", @@ -2615,9 +1446,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.7" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" +checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" dependencies = [ "bytes", "cfg_aliases", @@ -2635,12 +1466,13 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.11" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcbafbbdbb0f638fe3f35f3c56739f77a8a1d070cb25603226c83339b391472b" +checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" dependencies = [ "bytes", - "getrandom 0.3.2", + "getrandom 0.3.3", + "lru-slab", "rand", "ring", "rustc-hash", @@ -2708,7 +1540,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", ] [[package]] @@ -2788,18 +1620,16 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.15" +version = "0.12.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" dependencies = [ "async-compression", "base64", "bytes", - "encoding_rs", "futures-channel", "futures-core", "futures-util", - "h2", "http", "http-body", "http-body-util", @@ -2815,24 +1645,22 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-rustls", "tokio-util", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.26.11", - "windows-registry", + "webpki-roots", ] [[package]] @@ -2888,15 +1716,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" version = "1.12.0" @@ -2909,9 +1728,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.2" +version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7149975849f1abb3832b246010ef62ccc80d3a76169517ada7188252b9cfb437" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ "ring", "rustls-pki-types", @@ -2920,9 +1739,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "ryu" @@ -2964,12 +1783,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - [[package]] name = "semver" version = "1.0.26" @@ -3055,27 +1868,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha1-checked" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89f599ac0c323ebb1c6082821a54962b839832b03984598375bff3975b804423" -dependencies = [ - "digest", - "sha1", -] - [[package]] name = "sharded-slab" version = "0.1.7" @@ -3085,12 +1877,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shell-words" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" - [[package]] name = "shlex" version = "1.3.0" @@ -3157,9 +1943,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -3171,12 +1957,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.11.1" @@ -3237,35 +2017,14 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "tempfile" -version = "3.19.1" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ "fastrand", - "getrandom 0.3.2", + "getrandom 0.3.3", "once_cell", "rustix", "windows-sys 0.59.0", @@ -3373,9 +2132,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -3398,9 +2157,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.0" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", @@ -3478,6 +2237,24 @@ dependencies = [ "tower-service", ] +[[package]] +name = "tower-http" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fdb0c213ca27a9f57ab69ddb290fd80d970922355b83ae380b395d3986b8a2e" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -3555,33 +2332,12 @@ dependencies = [ "toml_edit", ] -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "unicode-bom" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eec5d1121208364f6793f7d2e222bf75a915c19557537745b195b253dd64217" - [[package]] name = "unicode-ident" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - [[package]] name = "untrusted" version = "0.9.0" @@ -3599,12 +2355,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -3650,12 +2400,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - [[package]] name = "wait-timeout" version = "0.2.1" @@ -3790,15 +2534,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.0", -] - [[package]] name = "webpki-roots" version = "1.0.0" @@ -3839,48 +2574,13 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-link" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" - -[[package]] -name = "windows-registry" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets 0.53.0", -] - -[[package]] -name = "windows-result" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -3889,7 +2589,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -3898,30 +2598,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" -dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] @@ -3930,96 +2614,48 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - [[package]] name = "winnow" version = "0.7.10" @@ -4038,17 +2674,11 @@ dependencies = [ "bitflags", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "xml-rs" @@ -4056,20 +2686,11 @@ version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" -[[package]] -name = "xz2" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" -dependencies = [ - "lzma-sys", -] - [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -4079,9 +2700,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", @@ -4089,33 +2710,13 @@ dependencies = [ "synstructure", ] -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive 0.7.35", -] - [[package]] name = "zerocopy" version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "zerocopy-derive 0.8.25", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", + "zerocopy-derive", ] [[package]] @@ -4155,26 +2756,23 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] [[package]] -name = "zeroize_derive" -version = "1.4.2" +name = "zerotrie" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", + "displaydoc", + "yoke", + "zerofrom", ] [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -4183,9 +2781,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", @@ -4194,28 +2792,19 @@ dependencies = [ [[package]] name = "zip" -version = "2.6.1" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dcb24d0152526ae49b9b96c1dcf71850ca1e0b882e4e28ed898a93c41334744" +checksum = "153a6fff49d264c4babdcfa6b4d534747f520e56e8f0f384f3b808c4b64cc1fd" dependencies = [ - "aes", "arbitrary", "bzip2", - "constant_time_eq", "crc32fast", - "crossbeam-utils", "deflate64", "flate2", - "getrandom 0.3.2", - "hmac", "indexmap", - "lzma-rs", + "liblzma", "memchr", - "pbkdf2", - "sha1", - "time", - "xz2", - "zeroize", + "nt-time", "zopfli", "zstd", ] diff --git a/Cargo.toml b/Cargo.toml index cc43334..dd07332 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,10 +17,9 @@ required-features = [] [features] -default = ["templatr", "network_test", "cli", "gitoxide"] +default = ["templatr", "network_test", "cli"] templatr = ["dep:templatr"] cli = ["dep:clap", "dep:clap_complete", "dep:vergen", "dep:pbr"] -gitoxide = ["dep:gix"] network_test = [] [build-dependencies] @@ -37,7 +36,7 @@ trycmd = { version = "0.15" } [dependencies] #qpm -qpm_package = { git = "https://github.com/QuestPackageManager/QPM.Package.git" } +qpm_package = { git = "https://github.com/QuestPackageManager/QPM.Package.git", branch = "qpm2" } qpm_qmod = { git = "https://github.com/QuestPackageManager/QPM.Qmod.git" } qpm_arg_tokenizer = { git = "https://github.com/QuestPackageManager/QPM.arg_tokenizer.git" } templatr = { git = "https://github.com/QuestPackageManager/templatr.git", optional = true } @@ -73,17 +72,16 @@ owo-colors = "4" dirs = "6.0.0" keyring = "3" -gix = { version = "*", features = [ - "command", - "attributes", - "progress-tree", - "worktree-mutation", - "blocking-network-client", - "blocking-http-transport-reqwest-rust-tls", -], optional = true, default-features = false} - -# Use PR with symlink fix for Unix systems. -zip = "2" +zip = { version = "4", default-features = false, features = [ + "zstd", + "nt-time", + "deflate", + "deflate-flate2", + "deflate-zopfli", + "deflate64", + "lzma", + "bzip2", +] } walkdir = "2" symlink = "0.1.0" From 172f225c74ceb239ab4ee013ec04be768c0ae64c Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 29 May 2025 17:20:40 -0400 Subject: [PATCH 004/119] Update dependencies and refactor package handling for triplet support --- Cargo.lock | 10 ++-- src/models/package.rs | 70 ++++++++++++++++---------- src/repository/mod.rs | 8 +-- src/repository/qpackages.rs | 62 +++++++++++------------ src/resolver/dependency.rs | 99 ++++++++++++++++++++++--------------- src/terminal/colors.rs | 5 ++ src/utils/cmake.rs | 15 +++--- 7 files changed, 155 insertions(+), 114 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f7bb905..fb77e0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1202,9 +1202,9 @@ checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" [[package]] name = "openssl" -version = "0.10.72" +version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ "bitflags", "cfg-if", @@ -1243,9 +1243,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.108" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", @@ -1424,7 +1424,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#2c1a2cbe714ae88c61b4fa4d9d7bff2728a8008e" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#aca1b31ca177a7170b3329486902fba5f9cfa7da" dependencies = [ "cursed-semver-parser", "schemars", diff --git a/src/models/package.rs b/src/models/package.rs index 821fe2b..642b739 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -1,13 +1,15 @@ -use std::{collections::HashSet, fs::File, io::BufReader, path::Path}; +use std::{ + collections::{HashMap, HashSet}, + fs::File, + io::BufReader, + path::Path, +}; use color_eyre::{Result, Section, eyre::Context, owo_colors::OwoColorize}; use itertools::Itertools; -use qpm_package::{ - extensions::package_metadata::PackageMetadataExtensions, - models::{ - dependency::{Dependency, SharedDependency, SharedPackageConfig}, - package::PackageConfig, - }, +use qpm_package::models::{ + package::{PackageConfig, PackageTripletSettings, TripletId}, + shared_package::{SharedPackageConfig, SharedTriplet, SharedTripletDependencyInfo}, }; use qpm_qmod::models::mod_json::{ModDependency, ModJson}; use semver::VersionReq; @@ -41,9 +43,9 @@ pub trait SharedPackageConfigExtensions: Sized { fn resolve_from_package( config: PackageConfig, repository: &impl Repository, - ) -> Result<(Self, Vec)>; + ) -> Result<(Self, HashMap>)>; - fn to_mod_json(self) -> ModJson; + fn to_mod_json(self, triplet: &TripletId) -> ModJson; fn try_write_toolchain(&self, repo: &impl Repository) -> Result<()>; } @@ -156,40 +158,56 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { fn resolve_from_package( config: PackageConfig, repository: &impl Repository, - ) -> Result<(Self, Vec)> { - let resolved_deps = resolve(&config, repository)?.collect_vec(); + ) -> Result<(Self, HashMap>)> { + let triplet_dependencies: HashMap> = config + .triplet + .specific_triplets + .iter() + .map(|(triplet_id, triplet)| -> color_eyre::Result<_> { + let resolved = resolve(&config, repository, triplet_id)?.collect_vec(); + + Ok((triplet_id.clone(), resolved)) + }) + .try_collect()?; Ok(( SharedPackageConfig { config, - restored_dependencies: resolved_deps + locked_triplet: triplet_dependencies .iter() - .map(|d| SharedDependency { - dependency: Dependency { - id: d.config.info.id.clone(), - version_range: VersionReq::parse(&format!( - "={}", - d.config.info.version - )) - .expect("Unable to parse version"), - additional_data: d.config.info.additional_data.clone(), - }, - version: d.config.info.version.clone(), + .map(|(triplet_id, dependencies)| { + ( + triplet_id.clone(), + SharedTriplet { + restored_dependencies: dependencies + .iter() + .map(|(dep, dep_triplet)| { + ( + dep.config.id.clone(), + SharedTripletDependencyInfo { + restored_version: dep.config.version.clone(), + triplet: dep_triplet.clone(), + }, + ) + }) + .collect(), + }, + ) }) .collect(), }, - resolved_deps, + triplet_dependencies, )) } - fn to_mod_json(self) -> ModJson { + fn to_mod_json(self, triplet: &TripletId) -> ModJson { // Self { // id: dep.id, // version_range: dep.version_range, // mod_link: dep.additional_data.mod_link, // } - let local_deps = &self.config.dependencies; + let local_deps = &self.config.triplet.specific_triplets[triplet]; // Only bundle mods that are not specifically excluded in qpm.json or if they're not header-only let restored_deps: Vec<_> = self diff --git a/src/repository/mod.rs b/src/repository/mod.rs index 8234545..50514e5 100644 --- a/src/repository/mod.rs +++ b/src/repository/mod.rs @@ -3,7 +3,7 @@ use itertools::Itertools; use semver::Version; use qpm_package::models::{ - backend::PackageVersion, dependency::SharedPackageConfig, package::PackageConfig, + backend::PackageVersion, dependency::SharedPackageConfig, package::{DependencyId, PackageConfig}, }; use self::{ @@ -17,14 +17,14 @@ pub mod multi; pub mod qpackages; pub trait Repository { - fn get_package_names(&self) -> Result>; + fn get_package_names(&self) -> Result>; /// Get the package versions for a given package id /// Returns None if the package is not found in any repository /// Ordered by version descending - fn get_package_versions(&self, id: &str) -> Result>>; + fn get_package_versions(&self, id: &DependencyId) -> Result>>; - fn get_package(&self, id: &str, version: &Version) -> Result>; + fn get_package(&self, id: &DependencyId, version: &Version) -> Result>; // add to the db cache // this just stores the shared config itself, not the package fn add_to_db_cache(&mut self, config: SharedPackageConfig, permanent: bool) -> Result<()>; diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 3206669..08a9896 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -17,8 +17,7 @@ use zip::ZipArchive; use serde::Deserialize; use qpm_package::{ - extensions::package_metadata::PackageMetadataExtensions, - models::{backend::PackageVersion, dependency::SharedPackageConfig, package::PackageConfig}, + extensions::package_metadata::PackageMetadataExtensions, models::{package::PackageConfig, shared_package::SharedPackageConfig}, }; use crate::{ @@ -86,7 +85,7 @@ impl QPMRepository { pub fn publish_package(package: &SharedPackageConfig, auth: &str) -> Result<()> { let url = format!( "{}/{}/{}", - API_URL, &package.config.info.id, &package.config.info.version + API_URL, &package.config.id, &package.config.version ); let resp = get_agent() @@ -120,23 +119,23 @@ impl QPMRepository { println!( "Checking cache for dependency {} {}", - config.info.id.dependency_id_color(), - config.info.version.version_id_color() + config.id.dependency_id_color(), + config.version.version_id_color() ); let user_config = get_combine_config(); let base_path = user_config .cache .as_ref() .unwrap() - .join(&config.info.id) - .join(config.info.version.to_string()); + .join(&config.id) + .join(config.version.to_string()); let src_path = base_path.join("src"); let lib_path = base_path.join("lib"); let tmp_path = base_path.join("tmp"); - let so_path = lib_path.join(config.info.get_so_name2()); - let debug_bin_name = config.info.get_so_name2().with_extension("debug.so"); + let so_path = lib_path.join(config.get_so_name2()); + let debug_bin_name = config.get_so_name2().with_extension("debug.so"); let debug_so_path = lib_path.join(debug_bin_name.file_name().unwrap()); let src_exists = src_path.join("qpm.shared.json").exists(); @@ -145,8 +144,8 @@ impl QPMRepository { SharedPackageConfig::read(&src_path).with_context(|| { format!( "Failed to get config {}:{} in cache", - config.info.id.dependency_id_color(), - config.info.version.version_id_color() + config.id.dependency_id_color(), + config.version.version_id_color() ) })?; } @@ -160,15 +159,15 @@ impl QPMRepository { })?; } - // src did not exist, this means that we need to download the repo/zip file from packageconfig.info.url + // src did not exist, this means that we need to download the repo/zip file from packageconfig.url fs::create_dir_all(&base_path) .with_context(|| format!("Failed to create lib path {base_path:?}"))?; - let url = config.info.url.as_ref().unwrap(); + let url = config.url.as_ref().unwrap(); if url.contains("github.com") { // github url! git::clone( url.clone(), - config.info.additional_data.branch_name.as_ref(), + config.additional_data.branch_name.as_ref(), &tmp_path, ) .context("Clone")?; @@ -190,7 +189,7 @@ impl QPMRepository { // the only way the above if else would break is if someone put a link to a zip file on github in the url slot // if you are reading this and think of doing that so I have to fix this, fuck you - let sub_package_path = match &config.info.additional_data.sub_folder { + let sub_package_path = match &config.additional_data.sub_folder { Some(sub_folder) => { // the package exists in a subfolder of the downloaded thing, just move the subfolder to src tmp_path.join(sub_folder) @@ -247,25 +246,24 @@ impl QPMRepository { Ok(downloaded_package) => // check if downloaded config is the same version as expected, if not, panic { - if downloaded_package.config.info.version != config.info.version { + if downloaded_package.config.version != config.version { bail!( "Downloaded package ({}) version ({}) does not match expected version ({})!", - config.info.id.dependency_id_color(), + config.id.dependency_id_color(), downloaded_package .config - .info .version .to_string() .version_id_color(), - config.info.version.to_string().version_id_color(), + config.version.to_string().version_id_color(), ) } } Err(e) => println!( "Unable to validate shared package of {}:{} due to: \"{}\", continuing", - config.info.name.dependency_id_color(), - config.info.version.dependency_version_color(), + config.name.dependency_id_color(), + config.version.dependency_version_color(), e.red() ), } @@ -275,7 +273,7 @@ impl QPMRepository { fs::create_dir_all(&lib_path).context("Failed to create lib path")?; } - // libs didn't exist or the release object didn't exist, we need to download from packageconfig.info.additional_data.so_link and packageconfig.info.additional_data.debug_so_link + // libs didn't exist or the release object didn't exist, we need to download from packageconfig.additional_data.so_link and packageconfig.additional_data.debug_so_link let download_binary = |path: &Path, url_opt: Option<&String>| -> Result<_> { // only download if file doesn't exist already if path.exists() { @@ -329,21 +327,21 @@ impl QPMRepository { Ok(()) }; - download_binary(&so_path, config.info.additional_data.so_link.as_ref())?; + download_binary(&so_path, config.additional_data.so_link.as_ref())?; download_binary( &debug_so_path, - config.info.additional_data.debug_so_link.as_ref(), + config.additional_data.debug_so_link.as_ref(), )?; - if config.info.additional_data.so_link.is_none() - && config.info.additional_data.debug_so_link.is_none() - && config.info.additional_data.static_link.is_none() - && !config.info.additional_data.headers_only.unwrap_or(false) + if config.additional_data.so_link.is_none() + && config.additional_data.debug_so_link.is_none() + && config.additional_data.static_link.is_none() + && !config.additional_data.headers_only.unwrap_or(false) { eprintln!( "No binaries are provided for {}:{} but is also not header only!", - config.info.id.dependency_id_color(), - config.info.version.version_id_color() + config.id.dependency_id_color(), + config.version.version_id_color() ); } Ok(()) @@ -382,8 +380,8 @@ impl Repository for QPMRepository { self.download_package(config).with_context(|| { format!( "QPackages {}:{}", - config.info.id.dependency_id_color(), - config.info.version.version_id_color() + config.id.dependency_id_color(), + config.version.version_id_color() ) })?; diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index 79f565d..99b9bd5 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -6,6 +6,7 @@ use std::{ time::Instant, }; +use super::semver::{VersionWrapper, req_to_range}; use crate::{ models::package::SharedPackageConfigExtensions, repository::{Repository, local::FileRepository}, @@ -21,9 +22,12 @@ use pubgrub::{ DefaultStringReporter, Dependencies, DependencyProvider, PackageResolutionStatistics, PubGrubError, Reporter, }; -use qpm_package::models::{dependency::SharedPackageConfig, package::PackageConfig}; - -use super::semver::{VersionWrapper, req_to_range}; +use qpm_package::models::{ + package::{ + DependencyId, PackageConfig, PackageTripletDependency, PackageTripletSettings, TripletDependencyMap, TripletId + }, + shared_package::{SharedPackageConfig, SharedTriplet}, +}; pub struct PackageDependencyResolver<'a, 'b, R> where R: Repository, @@ -31,8 +35,23 @@ where root: &'a PackageConfig, repo: &'b R, } + +#[derive(Clone, Debug, Eq, PartialEq, Hash)] +struct PubgrubDependencyTarget(pub DependencyId, pub TripletId); + +impl Display for PubgrubDependencyTarget { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}:{}", + self.0.0.dependency_id_color(), + self.1.0.triplet_id_color() + ) + } +} + impl DependencyProvider for PackageDependencyResolver<'_, '_, R> { - type P = String; + type P = PubgrubDependencyTarget; type V = VersionWrapper; type VS = pubgrub::Ranges; type M = String; @@ -49,20 +68,22 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> fn get_dependencies( &self, - package: &String, + package: &PubgrubDependencyTarget, version: &VersionWrapper, ) -> Result, PubgrubErrorWrapper> { // Root dependencies - if package == &self.root.info.id && version == &self.root.info.version { + if package.0 == self.root.id && version == &self.root.version { // resolve dependencies of root - let deps = self - .root + let triplet = self.root.triplet.specific_triplets[&package.1]; + + let deps = triplet .dependencies .iter() - .map(|dep| { - let id = &dep.id; + .map(|(dep_id, dep)| { + let pubgrub_dep = PubgrubDependencyTarget(dep_id.clone(), dep.triplet); + let range = req_to_range(dep.version_range.clone()); - (id.clone(), range) + (pubgrub_dep, range) }) .collect(); return Ok(Dependencies::Available(deps)); @@ -71,9 +92,8 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> // Find dependencies of dependencies let pkg = self .repo - .get_package(package, &version.clone().into()) - .with_context(|| format!("Could not find package {package} with version {version}"))? - .unwrap(); + .get_package(&package.0, &version.clone().into())? + .with_context(|| format!("Could not find package {package} with version {version}"))?; let deps = pkg .config @@ -92,14 +112,14 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> fn choose_version( &self, - package: &String, + package: &PubgrubDependencyTarget, range: &pubgrub::Ranges, ) -> Result, PubgrubErrorWrapper> { - if *package == self.root.info.id { - return Ok(Some(self.root.info.version.clone().into())); + if package.0 == self.root.id { + return Ok(Some(self.root.version.clone().into())); } - let Some(dependencies) = self.repo.get_package_versions(package)? else { + let Some(dependencies) = self.repo.get_package_versions(&package.0)? else { return Ok(None); }; @@ -117,12 +137,12 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> range: &Self::VS, package_statistics: &PackageResolutionStatistics, ) -> Self::Priority { - if *package == self.root.info.id { + if package.0 == self.root.id { return (0, Reverse(0)); } // Get versions available for the package, if none return default priority - let Ok(Some(versions)) = self.repo.get_package_versions(package) else { + let Ok(Some(versions)) = self.repo.get_package_versions(&package.0) else { return (package_statistics.conflict_count(), Reverse(0)); }; @@ -146,20 +166,22 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> pub fn resolve<'a>( root: &'a PackageConfig, repository: &'a impl Repository, -) -> Result + 'a> { + triplet: &TripletId, +) -> Result + 'a> { let resolver = PackageDependencyResolver { root, repo: repository, }; let time = Instant::now(); - let result = match pubgrub::resolve(&resolver, root.info.id.clone(), root.info.version.clone()) - { + let target = PubgrubDependencyTarget(root.id.clone(), triplet.clone()); + let result = match pubgrub::resolve(&resolver, target, root.version.clone()) { Ok(deps) => Ok(deps.into_iter().filter_map(move |(id, version)| { - if id == root.info.id && version == root.info.version { + if id.0 == root.id && version == root.version { return None; } - repository.get_package(&id, &version.into()).unwrap() + let package = repository.get_package(&id.0, &version.into()).unwrap()?; + Some((package, id.1)) })), Err(PubGrubError::NoSolution(tree)) => { @@ -185,18 +207,14 @@ pub fn restore>( for dep in resolved_deps { println!( "Pulling {}:{}", - &dep.config.info.id.dependency_id_color(), - &dep.config - .info - .version - .to_string() - .dependency_version_color() + &dep.config.id.0.dependency_id_color(), + &dep.config.version.to_string().dependency_version_color() ); repository.download_to_cache(&dep.config).with_context(|| { format!( "Requesting {}:{}", - dep.config.info.id.dependency_id_color(), - dep.config.info.version.version_id_color() + dep.config.id.0.dependency_id_color(), + dep.config.version.version_id_color() ) })?; repository.add_to_db_cache(dep.clone(), true)?; @@ -216,23 +234,26 @@ pub fn restore>( pub fn locked_resolve<'a, R: Repository>( root: &'a SharedPackageConfig, repository: &'a R, + triplet: &'a SharedTriplet, ) -> Result + 'a> { // TODO: ensure restored dependencies take precedence over - Ok(root + Ok(triplet .restored_dependencies .iter() - .map(|d| { + .map(|(dep_id, dep)| { repository - .get_package(&d.dependency.id, &d.version) + .get_package(&dep_id, &dep.restored_version) .unwrap_or_else(|e| { panic!( "Encountered an issue resolving for package {}:{}, {e}", - d.dependency.id, d.version + dep_id.0, dep.restored_version ) }) - .unwrap_or_else(|| panic!("No package found for {}:{}", d.dependency.id, d.version)) + .unwrap_or_else(|| { + panic!("No package found for {}:{}", dep_id.0, dep.restored_version) + }) }) - .dedup_by(|x, y| x.config.info.id == y.config.info.id)) + .dedup_by(|x, y| x.config.id == y.config.id)) } pub struct PubgrubErrorWrapper(color_eyre::Report); diff --git a/src/terminal/colors.rs b/src/terminal/colors.rs index 89eaf6d..23742ae 100644 --- a/src/terminal/colors.rs +++ b/src/terminal/colors.rs @@ -33,6 +33,11 @@ pub trait QPMColor: OwoColorize { ) -> FgColorDisplay { self.yellow() } + + #[inline(always)] + fn triplet_id_color(&self) -> FgColorDisplay { + self.green() + } } impl QPMColor for D {} diff --git a/src/utils/cmake.rs b/src/utils/cmake.rs index 32354c8..2030fbf 100644 --- a/src/utils/cmake.rs +++ b/src/utils/cmake.rs @@ -6,8 +6,7 @@ use std::{ use color_eyre::{Result, eyre::Context}; use qpm_package::{ - extensions::package_metadata::PackageMetadataExtensions, - models::dependency::SharedPackageConfig, + extensions::package_metadata::PackageMetadataExtensions, models::shared_package::SharedPackageConfig, }; use crate::repository::Repository; @@ -25,7 +24,7 @@ macro_rules! concatln { } pub fn write_cmake(shared_package: &SharedPackageConfig, repo: &impl Repository) -> Result<()> { - let cmake_opt = shared_package.config.info.additional_data.cmake; + let cmake_opt = shared_package.config.cmake; if cmake_opt.is_none() && Path::new("./CMakeLists.txt").exists() { eprintln!( @@ -62,9 +61,9 @@ pub fn write_extern_cmake(dep: &SharedPackageConfig, repo: &impl Repository) -> .get_package(&shared_dep.dependency.id, &shared_dep.version) .context("Unable to get shared package")? .unwrap(); - let package_id = shared_package.config.info.id; + let package_id = shared_package.config.id; - if let Some(compile_options) = shared_package.config.info.additional_data.compile_options { + if let Some(compile_options) = shared_package.config.additional_data.compile_options { any = true; // TODO: Must ${{COMPILE_ID}} be changed to {package_id}? @@ -264,19 +263,19 @@ pub fn make_defines_string(dep: &SharedPackageConfig) -> Result { ) .to_string(); - writeln!(result, "\nset(MOD_VERSION \"{}\")", dep.config.info.version)?; + writeln!(result, "\nset(MOD_VERSION \"{}\")", dep.config.version)?; result.push_str("# take the mod name and just remove spaces, that will be MOD_ID, if you don't like it change it after the include of this file\n"); writeln!( result, "set(MOD_ID \"{}\")\n", - dep.config.info.name.replace(' ', "") + dep.config.name.replace(' ', "") )?; result.push_str("# derived from override .so name or just id_version\n"); writeln!( result, "set(COMPILE_ID \"{}\")", - dep.config.info.get_module_id() + dep.config.get_module_id() )?; result.push_str( From 60f3dad1a69508ad69be8fb3782cfc3a8e783b71 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 29 May 2025 17:45:41 -0400 Subject: [PATCH 005/119] More progress on refactor --- src/commands/clear.rs | 4 +- src/commands/collapse.rs | 4 +- src/commands/dependency.rs | 5 +- src/commands/install.rs | 9 +- src/commands/list/packages.rs | 2 +- src/commands/list/versions.rs | 37 +- src/commands/package/create.rs | 51 +-- src/commands/package/edit.rs | 20 +- src/commands/package/edit_extra.rs | 105 +---- src/commands/package/format.rs | 2 +- src/commands/publish/mod.rs | 14 +- src/commands/qmod/manifest.rs | 11 +- src/commands/qmod/zip.rs | 5 +- src/commands/restore.rs | 4 +- src/models/package.rs | 41 +- src/models/toolchain.rs | 15 +- src/repository/local.rs | 149 ++++--- src/repository/memcached.rs | 22 +- src/repository/mod.rs | 12 +- src/repository/multi.rs | 23 +- src/repository/qpackages.rs | 20 +- src/resolver/dependency.rs | 9 +- src/tests/mocks/repo.rs | 20 +- src/tests/network/qpackages.rs | 12 +- src/tests/resolve.rs | 8 +- src/utils/cmake.rs | 362 ------------------ src/utils/git.rs | 189 --------- src/utils/mod.rs | 1 - .../includes/scotland2/shared/loader.hpp | 2 +- 29 files changed, 222 insertions(+), 936 deletions(-) delete mode 100644 src/utils/cmake.rs diff --git a/src/commands/clear.rs b/src/commands/clear.rs index 18d86b4..e17736e 100644 --- a/src/commands/clear.rs +++ b/src/commands/clear.rs @@ -35,7 +35,7 @@ fn remove(p: &str) -> Result<()> { fn remove_dependencies_dir() -> Result<()> { let package = PackageConfig::read(".")?; - let extern_path = Path::new(&package.dependencies_dir); + let extern_path = Path::new(&package.dependencies_directory); if !extern_path.exists() { return Ok(()); @@ -101,6 +101,6 @@ fn remove_dependencies_dir() -> Result<()> { } } - fs::remove_dir_all(&package.dependencies_dir)?; + fs::remove_dir_all(&package.dependencies_directory)?; Ok(()) } diff --git a/src/commands/collapse.rs b/src/commands/collapse.rs index d4fce1e..4d5ab68 100644 --- a/src/commands/collapse.rs +++ b/src/commands/collapse.rs @@ -24,8 +24,8 @@ impl Command for CollapseCommand { for shared_package in resolved { println!( "{} --> {} ({} restored dependencies)", - &shared_package.config.info.id.bright_red(), - &shared_package.config.info.version.bright_green(), + &shared_package.config.id.bright_red(), + &shared_package.config.version.bright_green(), shared_package .restored_dependencies .len() diff --git a/src/commands/dependency.rs b/src/commands/dependency.rs index a6ebe8f..049c2e3 100644 --- a/src/commands/dependency.rs +++ b/src/commands/dependency.rs @@ -5,10 +5,7 @@ use color_eyre::{ eyre::{Context, bail}, }; use owo_colors::OwoColorize; -use qpm_package::models::{ - extra::PackageDependencyModifier, - package::{PackageConfig, PackageDependency}, -}; +use qpm_package::models::package::PackageConfig; use semver::VersionReq; use crate::{ diff --git a/src/commands/install.rs b/src/commands/install.rs index c836ca5..ba1303f 100644 --- a/src/commands/install.rs +++ b/src/commands/install.rs @@ -3,8 +3,7 @@ use std::path::PathBuf; use clap::Args; use color_eyre::eyre::Context; use qpm_package::{ - extensions::package_metadata::PackageMetadataExtensions, - models::{dependency::SharedPackageConfig, package::PackageConfig}, + extensions::package_metadata::PackageMetadataExtensions, models::{package::PackageConfig, shared_package::SharedPackageConfig}, }; use crate::{ @@ -55,7 +54,7 @@ impl Command for InstallCommand { let header_only = shared_package .config - .info + .additional_data .headers_only .unwrap_or(false); @@ -68,7 +67,7 @@ impl Command for InstallCommand { binary_path = Some( PathBuf::from(format!( "./build/{}", - shared_package.config.info.get_so_name().file_name().unwrap().to_string_lossy() + shared_package.config.get_so_name().file_name().unwrap().to_string_lossy() )) .canonicalize().context("Failed to retrieve release binary for publishing since it is not header only")?, ); @@ -78,7 +77,7 @@ impl Command for InstallCommand { debug_binary_path = Some( PathBuf::from(format!( "./build/debug/{}", - shared_package.config.info.get_so_name().file_name().unwrap().to_string_lossy() + shared_package.config.get_so_name().file_name().unwrap().to_string_lossy() )) .canonicalize().context("Failed to retrieve debug binary for publishing since it is not header only")?, ); diff --git a/src/commands/list/packages.rs b/src/commands/list/packages.rs index f1425b7..39fbf03 100644 --- a/src/commands/list/packages.rs +++ b/src/commands/list/packages.rs @@ -19,7 +19,7 @@ impl Command for PackageListCommand { let ids = repository::useful_default_new(self.offline)? .get_package_names()? .into_iter() - .sorted() + .sorted_by(|a, b| a.0.cmp(&b.0)) .collect_vec(); if !ids.is_empty() { println!( diff --git a/src/commands/list/versions.rs b/src/commands/list/versions.rs index dc30334..6cf05be 100644 --- a/src/commands/list/versions.rs +++ b/src/commands/list/versions.rs @@ -1,5 +1,7 @@ use clap::Args; +use color_eyre::eyre::ContextCompat; use owo_colors::OwoColorize; +use qpm_package::models::package::DependencyId; use crate::{ commands::Command, @@ -18,33 +20,28 @@ pub struct PackageCommand { impl Command for PackageCommand { fn execute(self) -> color_eyre::Result<()> { - let versions = - repository::useful_default_new(self.offline)?.get_package_versions(&self.package)?; - if self.latest { - println!( - "The latest version for package {} is {}", - self.package.bright_red(), - versions - .unwrap() - .first() - .unwrap() - .version - .to_string() - .bright_green() - ); + let versions = repository::useful_default_new(self.offline)? + .get_package_versions(&DependencyId(self.package.clone()))?; - return Ok(()); - } - - match &versions { + match versions { Some(package_versions) => { + if self.latest { + println!( + "The latest version for package {} is {}", + self.package.bright_red(), + package_versions.first().unwrap().to_string().bright_green() + ); + + return Ok(()); + } + println!( "Package {} has {} versions on qpackages.com:", self.package.bright_red(), - versions.as_ref().unwrap().len().bright_yellow() + package_versions.len().bright_yellow() ); for package_version in package_versions.iter().rev() { - println!(" - {}", package_version.version.to_string().bright_green()); + println!(" - {}", package_version.to_string().bright_green()); } } _ => { diff --git a/src/commands/package/create.rs b/src/commands/package/create.rs index 5507393..656407d 100644 --- a/src/commands/package/create.rs +++ b/src/commands/package/create.rs @@ -2,10 +2,7 @@ use std::path::Path; use clap::Args; use owo_colors::OwoColorize; -use qpm_package::models::{ - extra::AdditionalPackageMetadata, - package::{self, PackageConfig, PackageMetadata}, -}; +use qpm_package::models::package::{self, DependencyId, PackageConfig}; use semver::Version; use crate::{commands::Command, models::package::PackageConfigExtensions}; @@ -20,24 +17,6 @@ pub struct PackageOperationCreateArgs { /// Specify an id, else lowercase will be used #[clap(long = "id")] pub id: Option, - /// Branch name of a Github repo. Only used when a valid github url is provided - #[clap(long = "branchName")] - pub branch_name: Option, - /// Specify that this package is headers only and does not contain a .so or .a file - #[clap(long = "headersOnly")] - pub headers_only: Option, - /// Specify that this package is static linking - #[clap(long = "staticLinking")] - pub static_linking: Option, - /// Specify the download link for a release .so or .a file - #[clap(long = "soLink")] - pub so_link: Option, - /// Specify the download link for a debug .so or .a files (usually from the obj folder) - #[clap(long = "debugSoLink")] - pub debug_so_link: Option, - /// Override the downloaded .so or .a filename with this name instead. - #[clap(long = "overrideSoName")] - pub override_so_name: Option, } impl Command for PackageOperationCreateArgs { @@ -53,16 +32,6 @@ impl Command for PackageOperationCreateArgs { return Ok(()); } - let additional_data = AdditionalPackageMetadata { - branch_name: self.branch_name, - headers_only: self.headers_only, - static_linking: self.static_linking, - so_link: self.so_link, - debug_so_link: self.debug_so_link, - override_so_name: self.override_so_name, - ..Default::default() - }; - // id is optional so we need to check if it's defined, else use the name to lowercase let id = match self.id { Option::Some(s) => s, @@ -70,20 +39,22 @@ impl Command for PackageOperationCreateArgs { }; let package_info = PackageMetadata { - id, name: self.name, url: None, - version: self.version, - additional_data, }; let package = PackageConfig { - shared_dir: Path::new("shared").to_owned(), - dependencies_dir: Path::new("extern").to_owned(), - info: package_info, - dependencies: Default::default(), + id: DependencyId(id), + version: self.version, + additional_data: Default::default(), + triplet: Default::default(), + cmake: Default::default(), + toolchain_out: Some(Path::new("toolchain.json").to_owned()), + + shared_directories: vec![Path::new("shared").to_owned()], + dependencies_directory: Path::new("extern").to_owned(), workspace: Default::default(), - version: package::package_target_version(), + config_version: package::package_target_version(), }; package.write(".")?; diff --git a/src/commands/package/edit.rs b/src/commands/package/edit.rs index aac81ad..d3d35d4 100644 --- a/src/commands/package/edit.rs +++ b/src/commands/package/edit.rs @@ -1,12 +1,11 @@ use clap::Args; -use qpm_package::models::{dependency::SharedPackageConfig, package::PackageConfig}; +use qpm_package::models::{package::{DependencyId, PackageConfig}, shared_package::SharedPackageConfig}; use semver::Version; use crate::{ commands::Command, models::package::PackageConfigExtensions, repository::{self}, - utils::cmake::{write_define_cmake, write_extern_cmake}, }; #[derive(Args, Debug, Clone)] @@ -55,13 +54,6 @@ impl Command for EditArgs { let mut shared_package = SharedPackageConfig::read(".")?; shared_package.config = package; shared_package.write(".")?; - - // HACK: Not sure if this is a proper way of doing this but it seems logical - write_define_cmake(&shared_package)?; - write_extern_cmake( - &shared_package, - &repository::useful_default_new(self.offline)?, - )?; } Ok(()) } @@ -69,20 +61,16 @@ impl Command for EditArgs { fn package_set_id(package: &mut PackageConfig, id: String) { println!("Setting package id: {id}"); - package.info.id = id; + package.id = DependencyId(id); } -fn package_set_name(package: &mut PackageConfig, name: String) { - println!("Setting package name: {name}"); - package.info.name = name; -} fn package_set_url(package: &mut PackageConfig, url: String) { println!("Setting package url: {url}"); - package.info.url = Option::Some(url); + package.url = Option::Some(url); } fn package_set_version(package: &mut PackageConfig, version: Version) { println!("Setting package version: {version}"); - package.info.version = version; + package.version = version; } diff --git a/src/commands/package/edit_extra.rs b/src/commands/package/edit_extra.rs index ca0daf2..61c1569 100644 --- a/src/commands/package/edit_extra.rs +++ b/src/commands/package/edit_extra.rs @@ -1,51 +1,21 @@ use clap::{Args, Subcommand}; -use qpm_package::models::{dependency::SharedPackageConfig, package::PackageConfig}; +use qpm_package::models::{package::PackageConfig, shared_package::SharedPackageConfig}; use crate::{ commands::Command, models::package::PackageConfigExtensions, repository::{self}, - utils::{ - cmake::{write_define_cmake, write_extern_cmake}, - toggle::Toggle, - }, + utils::toggle::Toggle, }; #[derive(Args, Debug, Clone)] pub struct EditExtraArgs { - /// Change the branch name in additional data - #[clap(long = "branchName")] - pub branch_name: Option, - - /// Change the headers only bool in additional data, pass enable or disable - #[clap(long = "headersOnly")] - pub headers_only: Option, - - /// Make the package be statically linked, 0 for false, 1 for true - #[clap(long = "staticLinking")] - pub static_linking: Option, - - /// Provide a so link for downloading the regular .so file - #[clap(long = "soLink")] - pub so_link: Option, - - /// Provide a debug so link for downloading the debug .so file - #[clap(long = "debugSoLink")] - pub debug_so_link: Option, - - /// Provide an overridden name for the .so file - #[clap(long = "overrideSoName")] - pub override_so_name: Option, /// Provide a link to the mod #[clap(long = "modLink")] pub mod_link: Option, - /// If this package is defined in a repo with more packages in subfolders, this is where you specify the subfolder to be used - #[clap(long = "subFolder")] - pub sub_folder: Option, - /// Additional options for compilation and edits to compilation related files. #[clap(subcommand)] pub compile_options: Option, @@ -85,92 +55,27 @@ impl Command for EditExtraArgs { fn execute(self) -> color_eyre::Result<()> { let mut package = PackageConfig::read(".")?; let mut any_changed = false; - if let Some(branch_name) = self.branch_name { - package_edit_extra_branch_name(&mut package, branch_name); - any_changed = true; - } - if let Some(headers_only) = self.headers_only { - package_edit_extra_headers_only(&mut package, headers_only.into()); - any_changed = true; - } - if let Some(static_linking) = self.static_linking { - package_edit_extra_static_linking(&mut package, static_linking.into()); - any_changed = true; - } - if let Some(so_link) = self.so_link { - package_edit_extra_so_link(&mut package, so_link); - any_changed = true; - } - if let Some(debug_so_link) = self.debug_so_link { - package_edit_extra_debug_so_link(&mut package, debug_so_link); - any_changed = true; - } + if let Some(mod_link) = self.mod_link { package_edit_extra_mod_link(&mut package, mod_link); any_changed = true; } - if let Some(override_so_name) = self.override_so_name { - package_edit_extra_override_so_name(&mut package, override_so_name); - any_changed = true; - } - if let Some(sub_folder) = self.sub_folder { - package_edit_extra_sub_folder(&mut package, sub_folder); - any_changed = true; - } + if any_changed { package.write(".")?; let mut shared_package = SharedPackageConfig::read(".")?; shared_package.config = package; shared_package.write(".")?; - - // HACK: Not sure if this is a proper way of doing this but it seems logical - write_define_cmake(&shared_package)?; - write_extern_cmake( - &shared_package, - &repository::useful_default_new(self.offline)?, - )?; } Ok(()) } } -pub fn package_edit_extra_branch_name(package: &mut PackageConfig, branch_name: String) { - println!("Setting branch name: {branch_name:#?}"); - package.info.additional_data.branch_name = Some(branch_name); -} - -pub fn package_edit_extra_headers_only(package: &mut PackageConfig, headers_only: bool) { - println!("Setting headers_only: {headers_only:#?}"); - package.info.additional_data.headers_only = Some(headers_only); -} - -pub fn package_edit_extra_static_linking(package: &mut PackageConfig, static_linking: bool) { - println!("Setting static_linking: {static_linking:#?}"); - package.info.additional_data.static_linking = Some(static_linking); -} -pub fn package_edit_extra_so_link(package: &mut PackageConfig, so_link: String) { - println!("Setting so_link: {so_link:#?}"); - package.info.additional_data.so_link = Some(so_link); -} pub fn package_edit_extra_mod_link(package: &mut PackageConfig, mod_link: String) { println!("Setting mod_link: {mod_link:#?}"); - package.info.additional_data.mod_link = Some(mod_link); -} - -pub fn package_edit_extra_debug_so_link(package: &mut PackageConfig, debug_so_link: String) { - println!("Setting debug_so_link: {debug_so_link:#?}"); - package.info.additional_data.debug_so_link = Some(debug_so_link); -} - -pub fn package_edit_extra_override_so_name(package: &mut PackageConfig, override_so_name: String) { - println!("Setting override_so_name: {override_so_name:#?}"); - package.info.additional_data.override_so_name = Some(override_so_name); + package.additional_data.mod_link = Some(mod_link); } -pub fn package_edit_extra_sub_folder(package: &mut PackageConfig, sub_folder: String) { - println!("Setting sub_folder: {sub_folder:#?}"); - package.info.additional_data.sub_folder = Some(sub_folder); -} diff --git a/src/commands/package/format.rs b/src/commands/package/format.rs index 40611ca..7d4f4c7 100644 --- a/src/commands/package/format.rs +++ b/src/commands/package/format.rs @@ -2,7 +2,7 @@ use std::fs; use clap::Args; use color_eyre::Result; -use qpm_package::models::{dependency::SharedPackageConfig, package::PackageConfig}; +use qpm_package::models::package::PackageConfig; use crate::{commands::Command, models::package::PackageConfigExtensions}; diff --git a/src/commands/publish/mod.rs b/src/commands/publish/mod.rs index 6a1cd29..be92b60 100644 --- a/src/commands/publish/mod.rs +++ b/src/commands/publish/mod.rs @@ -1,7 +1,7 @@ use clap::Args; use color_eyre::eyre::{Context, anyhow, bail}; use owo_colors::OwoColorize; -use qpm_package::models::{dependency::SharedPackageConfig, package::PackageConfig}; +use qpm_package::models::{package::PackageConfig, shared_package::SharedPackageConfig}; use crate::{ models::{config::get_publish_keyring, package::PackageConfigExtensions}, @@ -21,7 +21,7 @@ pub struct PublishCommand { impl Command for PublishCommand { fn execute(self) -> color_eyre::Result<()> { let package = PackageConfig::read(".")?; - if package.info.url.is_none() { + if package.url.is_none() { bail!("Package without url can not be published!"); } @@ -68,7 +68,7 @@ impl Command for PublishCommand { } // check if url is set to download headers - if shared_package.config.info.url.is_none() { + if shared_package.config.url.is_none() { bail!( "info.url is null, please make sure to init this with the base link to your repo, e.g. '{}'", "https://github.com/RedBrumbler/QuestPackageManager-Rust".bright_yellow() @@ -77,11 +77,11 @@ impl Command for PublishCommand { // check if this is header only, if it's not header only check if the so_link is set, if not, panic if !shared_package .config - .info + .additional_data .headers_only .unwrap_or(false) - && shared_package.config.info.additional_data.so_link.is_none() + && shared_package.config.additional_data.so_link.is_none() { bail!( "soLink is not set in the package config, but this package is not header only, please make sure to either add the soLink or to make the package header only." @@ -105,8 +105,8 @@ impl Command for PublishCommand { println!( "Package {} v{} published!", - shared_package.config.info.id.dependency_id_color(), - shared_package.config.info.version.version_id_color() + shared_package.config.id.dependency_id_color(), + shared_package.config.version.version_id_color() ); Ok(()) diff --git a/src/commands/qmod/manifest.rs b/src/commands/qmod/manifest.rs index ce5e96a..9e294ea 100644 --- a/src/commands/qmod/manifest.rs +++ b/src/commands/qmod/manifest.rs @@ -2,6 +2,7 @@ use std::path::PathBuf; use clap::Args; use qpm_package::extensions::package_metadata::PackageMetadataExtensions; +use qpm_package::models::shared_package::SharedPackageConfig; use semver::VersionReq; use qpm_qmod::models::mod_json::ModJson; @@ -9,7 +10,7 @@ use qpm_qmod::models::mod_json::ModJson; use crate::models::mod_json::{ModJsonExtensions, PreProcessingData}; use crate::models::package::{PackageConfigExtensions, SharedPackageConfigExtensions}; -use qpm_package::models::dependency::SharedPackageConfig; + use qpm_package::models::package::PackageConfig; @@ -62,15 +63,15 @@ pub(crate) fn generate_qmod_manifest( let binary = shared_package .config - .info + .get_so_name() .file_name() .map(|s| s.to_string_lossy().to_string()); let preprocess_data = PreProcessingData { - version: shared_package.config.info.version.to_string(), - mod_id: shared_package.config.info.id.clone(), - mod_name: shared_package.config.info.name.clone(), + version: shared_package.config.version.to_string(), + mod_id: shared_package.config.id.clone(), + mod_name: shared_package.config.name.clone(), binary, }; let mut existing_json = ModJson::read_and_preprocess(preprocess_data)?; diff --git a/src/commands/qmod/zip.rs b/src/commands/qmod/zip.rs index e15e893..64f5532 100644 --- a/src/commands/qmod/zip.rs +++ b/src/commands/qmod/zip.rs @@ -8,6 +8,7 @@ use itertools::Itertools; use owo_colors::OwoColorize; use qpm_package::extensions::workspace::WorkspaceConfigExtensions; +use qpm_package::models::shared_package::SharedPackageConfig; use qpm_qmod::models::mod_json::ModJson; use crate::commands::qmod::manifest::{ManifestQmodOperationArgs, generate_qmod_manifest}; @@ -17,7 +18,7 @@ use crate::models::package::PackageConfigExtensions; use crate::models::schemas::{SchemaLinks, WithSchema}; use crate::terminal::colors::QPMColor; -use qpm_package::models::dependency::SharedPackageConfig; + use qpm_package::models::package::PackageConfig; @@ -118,7 +119,7 @@ pub(crate) fn execute_qmod_zip_operation(build_parameters: ZipQmodOperationArgs) let qmod_out = build_parameters .out_target .or(package.workspace.qmod_output) - .unwrap_or(format!("./{}", package.info.id).into()); + .unwrap_or(format!("./{}", package.id).into()); let look_for_files = |s: &str| { include_dirs diff --git a/src/commands/restore.rs b/src/commands/restore.rs index 1e402d0..80458cc 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -7,7 +7,7 @@ use color_eyre::{ eyre::{ContextCompat, Result, bail, eyre}, }; use itertools::Itertools; -use qpm_package::models::{dependency::SharedPackageConfig, package::PackageConfig}; +use qpm_package::models::{package::PackageConfig, shared_package::SharedPackageConfig}; use semver::Version; use crate::{ @@ -117,7 +117,7 @@ impl Command for RestoreCommand { d.version.version_id_color() ) })?; - d.dependency.additional_data = package.config.info.additional_data; + d.dependency.additional_data = package.config.additional_data; Ok(()) })?; dependency::locked_resolve(shared_package, &repo)?.collect_vec() diff --git a/src/models/package.rs b/src/models/package.rs index 642b739..d6492e8 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -43,7 +43,10 @@ pub trait SharedPackageConfigExtensions: Sized { fn resolve_from_package( config: PackageConfig, repository: &impl Repository, - ) -> Result<(Self, HashMap>)>; + ) -> Result<( + Self, + HashMap>, + )>; fn to_mod_json(self, triplet: &TripletId) -> ModJson; @@ -158,17 +161,21 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { fn resolve_from_package( config: PackageConfig, repository: &impl Repository, - ) -> Result<(Self, HashMap>)> { - let triplet_dependencies: HashMap> = config - .triplet - .specific_triplets - .iter() - .map(|(triplet_id, triplet)| -> color_eyre::Result<_> { - let resolved = resolve(&config, repository, triplet_id)?.collect_vec(); - - Ok((triplet_id.clone(), resolved)) - }) - .try_collect()?; + ) -> Result<( + Self, + HashMap>, + )> { + let triplet_dependencies: HashMap> = + config + .triplet + .specific_triplets + .iter() + .map(|(triplet_id, triplet)| -> color_eyre::Result<_> { + let resolved = resolve(&config, repository, triplet_id)?.collect_vec(); + + Ok((triplet_id.clone(), resolved)) + }) + .try_collect()?; Ok(( SharedPackageConfig { @@ -303,10 +310,10 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { .collect(); ModJson { - name: self.config.info.name.clone(), - id: self.config.info.id.clone(), + name: self.config.name.clone(), + id: self.config.id.clone(), porter: None, - version: self.config.info.version.to_string(), + version: self.config.version.to_string(), package_id: None, package_version: None, description: None, @@ -314,14 +321,14 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { is_library: None, dependencies: mods, // TODO: Change - late_mod_files: vec![self.config.info.get_so_name().to_str().unwrap().to_string()], + late_mod_files: vec![self.config.get_so_name().to_str().unwrap().to_string()], library_files: libs, ..Default::default() } } fn try_write_toolchain(&self, repo: &impl Repository) -> Result<()> { - let Some(toolchain_path) = self.config.info.additional_data.toolchain_out.as_ref() else { + let Some(toolchain_path) = self.config.additional_data.toolchain_out.as_ref() else { return Ok(()); }; diff --git a/src/models/toolchain.rs b/src/models/toolchain.rs index 53bddf6..518cd0a 100644 --- a/src/models/toolchain.rs +++ b/src/models/toolchain.rs @@ -1,7 +1,7 @@ use std::{fs::File, path::PathBuf}; use color_eyre::eyre::Result; -use qpm_package::models::{dependency::SharedPackageConfig, extra::CompileOptions}; +use qpm_package::models::{extra::CompileOptions, shared_package::SharedPackageConfig}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; @@ -16,12 +16,6 @@ pub struct ToolchainData { /// Path to the extern directory pub extern_dir: PathBuf, - - /// Output path for the binary - pub binary_out: Option, - - /// Output path for the debug binary - pub debug_binary_out: Option, } pub fn write_toolchain_file( @@ -36,11 +30,11 @@ pub fn write_toolchain_file( .filter_map(|s| { let shared_config = repo.get_package(&s.dependency.id, &s.version).ok()??; - let package_id = &shared_config.config.info.id; + let package_id = &shared_config.config.id; let prepend_path = |dir: &String| format!("{extern_dir}/includes/{package_id}/{dir}"); - let mut compile_options = shared_config.config.info.additional_data.compile_options?; + let mut compile_options = shared_config.config.additional_data.compile_options?; // prepend path compile_options.include_paths = compile_options @@ -97,9 +91,6 @@ pub fn write_toolchain_file( let toolchain = ToolchainData { compile_options, extern_dir: shared_config.config.dependencies_dir.clone(), - // TODO: - binary_out: None, - debug_binary_out: None, }; let file = File::create(toolchain_path)?; serde_json::to_writer_pretty( diff --git a/src/repository/local.rs b/src/repository/local.rs index 13b16d0..bf3ea94 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -4,6 +4,10 @@ use color_eyre::{ }; use itertools::Itertools; use owo_colors::OwoColorize; +use qpm_package::models::{ + package::{DependencyId, PackageConfig}, + shared_package::SharedPackageConfig, +}; use schemars::JsonSchema; use semver::Version; use serde::{Deserialize, Serialize}; @@ -15,11 +19,6 @@ use std::{ path::{Path, PathBuf}, }; -use qpm_package::{ - extensions::package_metadata::PackageMetadataExtensions, - models::{backend::PackageVersion, dependency::SharedPackageConfig, package::PackageConfig}, -}; - use crate::{ models::{ config::get_combine_config, @@ -44,18 +43,22 @@ pub struct PackageFiles { #[derive(Serialize, Deserialize, JsonSchema, Clone, Debug, Default)] pub struct FileRepository { #[serde(default)] - pub artifacts: HashMap>, + pub artifacts: HashMap>, } impl FileRepository { pub fn get_artifacts_from_id( &self, - id: &str, + id: &DependencyId, ) -> Option<&HashMap> { self.artifacts.get(id) } - pub fn get_artifact(&self, id: &str, version: &Version) -> Option<&SharedPackageConfig> { + pub fn get_artifact( + &self, + id: &DependencyId, + version: &Version, + ) -> Option<&SharedPackageConfig> { match self.artifacts.get(id) { Some(artifacts) => artifacts.get(version), None => None, @@ -68,14 +71,14 @@ impl FileRepository { package: SharedPackageConfig, overwrite_existing: bool, ) -> Result<()> { - if !self.artifacts.contains_key(&package.config.info.id) { + if !self.artifacts.contains_key(&package.config.id) { self.artifacts - .insert(package.config.info.id.clone(), HashMap::new()); + .insert(package.config.id.clone(), HashMap::new()); } - let id_artifacts = self.artifacts.get_mut(&package.config.info.id).unwrap(); + let id_artifacts = self.artifacts.get_mut(&package.config.id).unwrap(); - let entry = id_artifacts.entry(package.config.info.version.clone()); + let entry = id_artifacts.entry(package.config.version.clone()); match entry { Entry::Occupied(mut e) => { @@ -124,16 +127,16 @@ impl FileRepository { ) -> Result<()> { println!( "Adding cache for local dependency {} {}", - package.config.info.id.bright_red(), - package.config.info.version.bright_green() + package.config.id.bright_red(), + package.config.version.bright_green() ); let config = get_combine_config(); let cache_path = config .cache .as_ref() .unwrap() - .join(&package.config.info.id) - .join(package.config.info.version.to_string()); + .join(&package.config.id.0) + .join(package.config.version.to_string()); let tmp_path = cache_path.join("tmp"); let src_path = cache_path.join("src"); @@ -146,13 +149,9 @@ impl FileRepository { if binary_path.is_some() || debug_binary_path.is_some() { let lib_path = cache_path.join("lib"); - let so_path = lib_path.join(package.config.info.get_so_name2()); - let debug_bin_name = package - .config - .info - .get_so_name2() - .with_extension("debug.so"); - + let so_path = lib_path.join(package.config.get_so_name2()); + let debug_bin_name = package.config.get_so_name2().with_extension("debug.so"); + let debug_so_path = lib_path.join(debug_bin_name.file_name().unwrap()); if let Some(binary_path_unwrapped) = &binary_path { @@ -168,7 +167,7 @@ impl FileRepository { copy_things( &original_shared_path, - &src_path.join(&package.config.shared_dir), + &src_path.join(&package.config.shared_directories), )?; copy_things(&project_folder.join("qpm.json"), &src_path.join("qpm.json"))?; copy_things( @@ -186,17 +185,12 @@ impl FileRepository { let downloaded_package = SharedPackageConfig::read(package_path)?; // check if downloaded config is the same version as expected, if not, panic - if downloaded_package.config.info.version != package.config.info.version { + if downloaded_package.config.version != package.config.version { bail!( "Downloaded package ({}) version ({}) does not match expected version ({})!", - package.config.info.id.bright_red(), - downloaded_package - .config - .info - .version - .to_string() - .bright_green(), - package.config.info.version.to_string().bright_green(), + package.config.id.bright_red(), + downloaded_package.config.version.to_string().bright_green(), + package.config.version.to_string().bright_green(), ) } } @@ -321,28 +315,28 @@ impl FileRepository { } #[inline] - pub fn get_package_versions_cache_path(id: &str) -> PathBuf { + pub fn get_package_versions_cache_path(id: &DependencyId) -> PathBuf { let user_config = get_combine_config(); let base_path = user_config.cache.as_ref().unwrap(); // cache/{id} - base_path.join(id) + base_path.join(id.0) } #[inline] - pub fn get_package_cache_path(id: &str, version: &Version) -> PathBuf { + pub fn get_package_cache_path(id: &DependencyId, version: &Version) -> PathBuf { // cache/{id}/{version} Self::get_package_versions_cache_path(id).join(version.to_string()) } pub fn collect_files_of_package(package: &PackageConfig) -> Result { - let dep_cache_path = Self::get_package_cache_path(&package.info.id, &package.info.version); + let dep_cache_path = Self::get_package_cache_path(&package.id, &package.version); if !dep_cache_path.exists() { bail!( "Missing cache for dependency {}:{}", - package.info.id.dependency_id_color(), - package.info.version.dependency_version_color() + package.id.dependency_id_color(), + package.version.dependency_version_color() ); } @@ -352,14 +346,14 @@ impl FileRepository { if !src_path.exists() { bail!( "Missing src for dependency {}:{}", - package.info.id.dependency_id_color(), - package.info.version.dependency_version_color() + package.id.dependency_id_color(), + package.version.dependency_version_color() ); } let exposed_headers = src_path.join(&package.shared_dir); - if package.info.additional_data.headers_only.unwrap_or(false) { + if package.additional_data.headers_only.unwrap_or(false) { return Ok(PackageFiles { headers: exposed_headers, binary: None, @@ -368,13 +362,12 @@ impl FileRepository { // get so name or release so name - let use_release_name = package.info.additional_data.debug_so_link.is_none() - || package.info.additional_data.static_link.is_some(); + let use_release_name = package.additional_data.debug_so_link.is_none() + || package.additional_data.static_link.is_some(); // get so name or release so name let name = match use_release_name { true => package - .info .get_so_name2() .file_name() .unwrap() @@ -382,7 +375,7 @@ impl FileRepository { .to_string(), false => { // lib{name}.debug.so - let bin = package.info.get_so_name2().with_extension("debug.so"); + let bin = package.get_so_name2().with_extension("debug.so"); bin.file_name().unwrap().to_string_lossy().to_string() } @@ -393,8 +386,8 @@ impl FileRepository { if !binary.exists() { bail!( "Missing binary {name} for {}:{}", - package.info.id.dependency_id_color(), - package.info.version.dependency_version_color() + package.id.dependency_id_color(), + package.version.dependency_version_color() ); } @@ -410,18 +403,16 @@ impl FileRepository { workspace_dir: &Path, ) -> Result> { // let package = shared_package.config; - let restored_dependencies_map: HashMap<&String, &SharedPackageConfig> = restored_deps - .iter() - .map(|p| (&p.config.info.id, p)) - .collect(); + let restored_dependencies_map: HashMap<&DependencyId, &SharedPackageConfig> = + restored_deps.iter().map(|p| (&p.config.id, p)).collect(); // validate exists dependencies let missing_dependencies: Vec<_> = restored_dependencies_map .iter() .filter(|(_, r)| { - !Self::get_package_cache_path(&r.config.info.id, &r.config.info.version).exists() + !Self::get_package_cache_path(&r.config.id, &r.config.version).exists() }) - .map(|(_, r)| format!("{}:{}", r.config.info.id, r.config.info.version)) + .map(|(_, r)| format!("{}:{}", r.config.id, r.config.version)) .collect(); if !missing_dependencies.is_empty() { @@ -455,17 +446,15 @@ impl FileRepository { package .dependencies .iter() - .any(|d| d.id == dep.config.info.id) + .any(|d| d.id == dep.config.id) }); for (direct_dep, direct_dep_files) in direct_deps { - let project_deps_headers_target = - extern_headers.join(direct_dep.config.info.id.clone()); + let project_deps_headers_target = extern_headers.join(direct_dep.config.id.clone()); let exposed_headers = direct_dep_files.headers; let not_header_only = direct_dep .config - .info .additional_data .headers_only .unwrap_or(false) @@ -476,7 +465,7 @@ impl FileRepository { direct_dep_files.binary.wrap_err_with(|| { format!( "Binary not found for direct package {}:{}", - direct_dep.config.info.id.dependency_id_color(), + direct_dep.config.id.dependency_id_color(), direct_dep.config.version.dependency_version_color() ) }) @@ -489,14 +478,14 @@ impl FileRepository { bail!( "Missing binary {} for {}:{}", src_binary.file_name().unwrap_or_default().to_string_lossy(), - direct_dep.config.info.id.dependency_id_color(), + direct_dep.config.id.dependency_id_color(), direct_dep.config.version.dependency_version_color() ); } if !exposed_headers.exists() { bail!( "Missing header files for {}:{}", - direct_dep.config.info.id.dependency_id_color(), + direct_dep.config.id.dependency_id_color(), direct_dep.config.version.dependency_version_color() ); } @@ -515,14 +504,13 @@ impl FileRepository { // Get headers of all dependencies restored for (indirect_dep, indirect_dep_files) in indirect_deps { - let project_deps_headers_target = - extern_headers.join(indirect_dep.config.info.id.clone()); + let project_deps_headers_target = extern_headers.join(indirect_dep.config.id.clone()); let exposed_headers = indirect_dep_files.headers; if !exposed_headers.exists() { bail!( "Missing header files for {}:{}", - indirect_dep.config.info.id.dependency_id_color(), + indirect_dep.config.id.dependency_id_color(), indirect_dep.config.version.dependency_version_color() ); } @@ -541,10 +529,8 @@ impl FileRepository { .get(&referenced_dependency.id) .unwrap(); - let dep_cache_path = Self::get_package_cache_path( - &referenced_dependency.id, - &shared_dep.config.info.version, - ); + let dep_cache_path = + Self::get_package_cache_path(&referenced_dependency.id, &shared_dep.config.version); let src_path = dep_cache_path.join("src"); let extern_headers_dep = extern_headers.join(&referenced_dependency.id); @@ -557,7 +543,7 @@ impl FileRepository { bail!( "Missing extra {extra} for dependency {}:{}", referenced_dependency.id, - shared_dep.config.info.version.to_string() + shared_dep.config.version.to_string() ); } @@ -571,7 +557,7 @@ impl FileRepository { Ok(paths) } - pub fn remove_package_versions(&mut self, package: &String) -> Result<()> { + pub fn remove_package_versions(&mut self, package: &DependencyId) -> Result<()> { self.artifacts.remove(package); let packages_path = Self::get_package_versions_cache_path(package); if !packages_path.exists() { @@ -580,7 +566,7 @@ impl FileRepository { std::fs::remove_dir_all(packages_path)?; Ok(()) } - pub fn remove_package(&mut self, package: &String, version: &Version) -> Result<()> { + pub fn remove_package(&mut self, package: &DependencyId, version: &Version) -> Result<()> { self.artifacts .get_mut(package) .ok_or_eyre(format!("No package found {package}/{version}"))? @@ -596,25 +582,26 @@ impl FileRepository { } impl Repository for FileRepository { - fn get_package_versions(&self, id: &str) -> Result>> { + fn get_package_versions(&self, id: &DependencyId) -> Result>> { Ok(self.get_artifacts_from_id(id).map(|artifacts| { artifacts .keys() - .map(|version| PackageVersion { - id: id.to_string(), - version: version.clone(), - }) - .sorted_by(|a, b| a.version.cmp(&b.version)) + .sorted() .rev() // highest first + .cloned() .collect() })) } - fn get_package(&self, id: &str, version: &Version) -> Result> { + fn get_package( + &self, + id: &DependencyId, + version: &Version, + ) -> Result> { Ok(self.get_artifact(id, version).cloned()) } - fn get_package_names(&self) -> Result> { + fn get_package_names(&self) -> Result> { Ok(self.artifacts.keys().cloned().collect()) } @@ -630,9 +617,7 @@ impl Repository for FileRepository { } fn download_to_cache(&mut self, config: &PackageConfig) -> Result { - let exist_in_db = self - .get_artifact(&config.info.id, &config.info.version) - .is_some(); + let exist_in_db = self.get_artifact(&config.id, &config.version).is_some(); let file = FileRepository::collect_files_of_package(config); Ok(exist_in_db && file.is_ok()) diff --git a/src/repository/memcached.rs b/src/repository/memcached.rs index 06b46d8..b2822de 100644 --- a/src/repository/memcached.rs +++ b/src/repository/memcached.rs @@ -3,17 +3,15 @@ use color_eyre::Result; use semver::Version; use std::{cell::UnsafeCell, collections::HashMap}; -use qpm_package::models::{ - backend::PackageVersion, dependency::SharedPackageConfig, package::PackageConfig, -}; +use qpm_package::models::{package::{DependencyId, PackageConfig}, shared_package::SharedPackageConfig}; use super::Repository; pub struct MemcachedRepository { // interior mutability - packages_cache: UnsafeCell>>, - versions_cache: UnsafeCell>>, - package_list: UnsafeCell>>, + packages_cache: UnsafeCell>>, + versions_cache: UnsafeCell>>, + package_list: UnsafeCell>>, inner_repo: R, } @@ -31,7 +29,7 @@ impl MemcachedRepository { } impl Repository for MemcachedRepository { - fn get_package_names(&self) -> Result> { + fn get_package_names(&self) -> Result> { let package_list_opt = self.package_list.get_mut_safe(); if package_list_opt.is_none() { @@ -42,7 +40,7 @@ impl Repository for MemcachedRepository { Ok(package_list_opt.clone().unwrap()) } - fn get_package_versions(&self, id: &str) -> Result>> { + fn get_package_versions(&self, id: &DependencyId) -> Result>> { let cache = self.versions_cache.get_mut_safe().get(id); if let Some(c) = cache { @@ -54,14 +52,14 @@ impl Repository for MemcachedRepository { if let Some(versions) = &versions { self.versions_cache .get_mut_safe() - .entry(id.to_string()) + .entry(id.clone()) .insert_entry(versions.clone()); } Ok(versions) } - fn get_package(&self, id: &str, version: &Version) -> Result> { + fn get_package(&self, id: &DependencyId, version: &Version) -> Result> { let cache = self .packages_cache .get_safe() @@ -77,9 +75,9 @@ impl Repository for MemcachedRepository { if let Some(config) = &config { self.packages_cache .get_mut_safe() - .entry(config.config.info.id.clone()) + .entry(config.config.id.clone()) .or_default() - .entry(config.config.info.version.clone()) + .entry(config.config.version.clone()) .insert_entry(config.clone()); } diff --git a/src/repository/mod.rs b/src/repository/mod.rs index 50514e5..42f3498 100644 --- a/src/repository/mod.rs +++ b/src/repository/mod.rs @@ -2,9 +2,7 @@ use color_eyre::Result; use itertools::Itertools; use semver::Version; -use qpm_package::models::{ - backend::PackageVersion, dependency::SharedPackageConfig, package::{DependencyId, PackageConfig}, -}; +use qpm_package::models::{package::{DependencyId, PackageConfig}, shared_package::SharedPackageConfig}; use self::{ local::FileRepository, memcached::MemcachedRepository, multi::MultiDependencyRepository, @@ -22,9 +20,13 @@ pub trait Repository { /// Get the package versions for a given package id /// Returns None if the package is not found in any repository /// Ordered by version descending - fn get_package_versions(&self, id: &DependencyId) -> Result>>; + fn get_package_versions(&self, id: &DependencyId) -> Result>>; - fn get_package(&self, id: &DependencyId, version: &Version) -> Result>; + fn get_package( + &self, + id: &DependencyId, + version: &Version, + ) -> Result>; // add to the db cache // this just stores the shared config itself, not the package fn add_to_db_cache(&mut self, config: SharedPackageConfig, permanent: bool) -> Result<()>; diff --git a/src/repository/multi.rs b/src/repository/multi.rs index dad0432..5506379 100644 --- a/src/repository/multi.rs +++ b/src/repository/multi.rs @@ -1,9 +1,8 @@ use color_eyre::{Result, eyre::bail}; use itertools::Itertools; -use qpm_package::models::{ - backend::PackageVersion, dependency::SharedPackageConfig, package::PackageConfig, -}; +use qpm_package::models::{package::{DependencyId, PackageConfig}, shared_package::SharedPackageConfig}; +use semver::Version; use super::Repository; @@ -24,16 +23,16 @@ impl MultiDependencyRepository { /// impl Repository for MultiDependencyRepository { // get versions of all repositories - fn get_package_versions(&self, id: &str) -> Result>> { + fn get_package_versions(&self, id: &DependencyId) -> Result>> { // double flat map???? rust weird // TODO: Propagate error - let result: Vec = self + let result: Vec = self .repositories .iter() .filter_map(|r| r.get_package_versions(id).expect("Failed to get versions")) .flatten() .unique() - .sorted_by(|a, b| a.version.cmp(&b.version)) + .sorted_by(|a, b| a.cmp(&b)) .rev() // highest first .collect(); @@ -62,7 +61,7 @@ impl Repository for MultiDependencyRepository { // get package from the first repository that has it fn get_package( &self, - id: &str, + id: &DependencyId, version: &semver::Version, ) -> Result> { let opt = self @@ -77,13 +76,13 @@ impl Repository for MultiDependencyRepository { } } - fn get_package_names(&self) -> Result> { + fn get_package_names(&self) -> Result> { Ok(self .repositories .iter() .flat_map(|r| r.get_package_names().expect("Unable to get package names")) .unique() - .collect::>()) + .collect()) } fn download_to_cache(&mut self, config: &PackageConfig) -> Result { @@ -91,7 +90,7 @@ impl Repository for MultiDependencyRepository { .repositories .iter_mut() .filter(|r| { - r.get_package(&config.info.id, &config.info.version) + r.get_package(&config.id, &config.version) .expect("Unable to get package") .is_some() }) @@ -103,8 +102,8 @@ impl Repository for MultiDependencyRepository { Some(v) => Ok(v), None => bail!( "No repository found that has package {}:{}", - config.info.id, - config.info.version + config.id, + config.version ), } } diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 08a9896..1f5c3f1 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -17,7 +17,7 @@ use zip::ZipArchive; use serde::Deserialize; use qpm_package::{ - extensions::package_metadata::PackageMetadataExtensions, models::{package::PackageConfig, shared_package::SharedPackageConfig}, + extensions::package_metadata::PackageMetadataExtensions, models::{package::{DependencyId, PackageConfig}, shared_package::SharedPackageConfig}, }; use crate::{ @@ -60,12 +60,12 @@ impl QPMRepository { } /// Requests the appriopriate package info from qpackage.com - pub fn get_versions(id: &str) -> Result>> { + pub fn get_versions(id: &DependencyId) -> Result>> { Self::run_request(&format!("{id}?limit=0")) .with_context(|| format!("Getting list of versions for {}", id.dependency_id_color())) } - pub fn get_shared_package(id: &str, ver: &Version) -> Result> { + pub fn get_shared_package(id: &DependencyId, ver: &Version) -> Result> { Self::run_request(&format!("{id}/{ver}")).with_context(|| { format!( "Getting shared package config {}:{}", @@ -75,7 +75,7 @@ impl QPMRepository { }) } - pub fn get_packages() -> Result> { + pub fn get_packages() -> Result> { let vec = Self::run_request("") .context("qpackages.com packages list failed")? .ok_or_eyre("No packages found?")?; @@ -127,7 +127,7 @@ impl QPMRepository { .cache .as_ref() .unwrap() - .join(&config.id) + .join(&config.id.0) .join(config.version.to_string()); let src_path = base_path.join("src"); @@ -262,7 +262,7 @@ impl QPMRepository { Err(e) => println!( "Unable to validate shared package of {}:{} due to: \"{}\", continuing", - config.name.dependency_id_color(), + config.id.dependency_id_color(), config.version.dependency_version_color(), e.red() ), @@ -349,16 +349,16 @@ impl QPMRepository { } impl Repository for QPMRepository { - fn get_package_names(&self) -> Result> { + fn get_package_names(&self) -> Result> { Self::get_packages() } /// Sorted descending order - fn get_package_versions(&self, id: &str) -> Result>> { + fn get_package_versions(&self, id: &DependencyId) -> Result>> { let versions = Self::get_versions(id)?.map(|versions| { versions .into_iter() - .sorted_by(|a, b| a.version.cmp(&b.version)) + .sorted_by(|a, b| a.cmp(&b)) .rev() .collect_vec() }); @@ -366,7 +366,7 @@ impl Repository for QPMRepository { Ok(versions) } - fn get_package(&self, id: &str, version: &Version) -> Result> { + fn get_package(&self, id: &DependencyId, version: &Version) -> Result> { let config = Self::get_shared_package(id, version)?; Ok(config) diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index 99b9bd5..df0c4b5 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -11,11 +11,9 @@ use crate::{ models::package::SharedPackageConfigExtensions, repository::{Repository, local::FileRepository}, terminal::colors::QPMColor, - utils::cmake::write_cmake, }; use color_eyre::{ - Result, - eyre::{Context, bail}, + eyre::{bail, Context, ContextCompat}, Result }; use itertools::Itertools; use pubgrub::{ @@ -125,7 +123,7 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> let chosen = dependencies .iter() - .map(|version| VersionWrapper::from(version.version.clone())) + .map(|version| VersionWrapper::from(version.clone())) .find(|version| range.contains(version)); Ok(chosen) @@ -149,7 +147,7 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> // Count versions that satisfy the range constraint let version_count = versions .iter() - .filter(|v| range.contains(&v.version.clone().into())) + .filter(|v| range.contains(&VersionWrapper(v.clone().clone()))) .count(); // If no versions satisfy the constraint, use maximum priority @@ -225,7 +223,6 @@ pub fn restore>( println!("Copying now"); FileRepository::copy_from_cache(&shared_package.config, resolved_deps, workspace.as_ref())?; - write_cmake(shared_package, repository)?; shared_package.try_write_toolchain(repository)?; Ok(()) diff --git a/src/tests/mocks/repo.rs b/src/tests/mocks/repo.rs index 48c7c75..615d489 100644 --- a/src/tests/mocks/repo.rs +++ b/src/tests/mocks/repo.rs @@ -36,12 +36,12 @@ pub fn build_artifact_and_depend( range: VersionReq, ) -> SharedPackageConfig { let dep = Dependency { - id: shared_dep.config.info.id.clone(), + id: shared_dep.config.id.clone(), version_range: range.clone(), - additional_data: shared_dep.config.info.additional_data.clone(), + additional_data: shared_dep.config.additional_data.clone(), }; let p_dep = PackageDependency { - id: shared_dep.config.info.id.clone(), + id: shared_dep.config.id.clone(), version_range: range, additional_data: Default::default(), }; @@ -64,7 +64,7 @@ pub fn build_artifact_and_depend( }, restored_dependencies: vec![SharedDependency { dependency: dep, - version: shared_dep.config.info.version.clone(), + version: shared_dep.config.version.clone(), }], } } @@ -90,7 +90,7 @@ pub fn build_artifact_and_depends( dependencies: deps .iter() .map(|(shared_config, range)| PackageDependency { - id: shared_config.config.info.id.clone(), + id: shared_config.config.id.clone(), version_range: range.clone(), additional_data: Default::default(), }) @@ -101,11 +101,11 @@ pub fn build_artifact_and_depends( .iter() .map(|(shared_config, range)| SharedDependency { dependency: Dependency { - id: shared_config.config.info.id.clone(), + id: shared_config.config.id.clone(), version_range: range.clone(), - additional_data: shared_config.config.info.additional_data.clone(), + additional_data: shared_config.config.additional_data.clone(), }, - version: shared_config.config.info.version.clone(), + version: shared_config.config.version.clone(), }) .collect(), } @@ -142,8 +142,8 @@ pub fn get_mock_repository() -> FileRepository { artifacts: [artifact1, artifact2, artifact3, artifact4, artifact5] .map(|a| { ( - a.config.info.id.clone(), - HashMap::from([(a.config.info.version.clone(), a)]), + a.config.id.clone(), + HashMap::from([(a.config.version.clone(), a)]), ) }) .into_iter() diff --git a/src/tests/network/qpackages.rs b/src/tests/network/qpackages.rs index f232a5c..74bb4d8 100644 --- a/src/tests/network/qpackages.rs +++ b/src/tests/network/qpackages.rs @@ -44,7 +44,7 @@ fn download_package_binary() -> Result<()> { let link = package .config - .info + .additional_data .so_link .ok_or_eyre("Binary SO not found")?; @@ -69,8 +69,8 @@ fn get_artifact() -> Result<()> { assert_ne!(p, None); let unwrapped_p = p.unwrap(); - assert_eq!(unwrapped_p.config.info.id, "beatsaber-hook"); - assert_eq!(unwrapped_p.config.info.version, version); + assert_eq!(unwrapped_p.config.id, "beatsaber-hook"); + assert_eq!(unwrapped_p.config.version, version); Ok(()) } @@ -96,7 +96,7 @@ fn resolve() -> Result<()> { let paper = resolved .iter() - .find(|b| b.config.info.id.contains("paper")); + .find(|b| b.config.id.contains("paper")); assert_ne!(paper, None); @@ -104,12 +104,12 @@ fn resolve() -> Result<()> { paper_dep .unwrap() .version_range - .matches(&paper.unwrap().config.info.version) + .matches(&paper.unwrap().config.version) ); println!( "Resolved deps: {:?}", - resolved.iter().map(|s| s.config.info.id.clone()) + resolved.iter().map(|s| s.config.id.clone()) ); Ok(()) diff --git a/src/tests/resolve.rs b/src/tests/resolve.rs index bca67b8..34962d8 100644 --- a/src/tests/resolve.rs +++ b/src/tests/resolve.rs @@ -26,8 +26,8 @@ fn get_artifact() -> Result<()> { assert!(p.is_some()); let unwrapped_p = p.unwrap(); - assert_eq!(unwrapped_p.config.info.id, "artifact1"); - assert_eq!(unwrapped_p.config.info.version, Version::new(0, 1, 0)); + assert_eq!(unwrapped_p.config.id, "artifact1"); + assert_eq!(unwrapped_p.config.version, Version::new(0, 1, 0)); Ok(()) } @@ -43,7 +43,7 @@ fn resolve() -> Result<()> { println!( "Resolved deps: {:?}", - resolved.iter().map(|s| s.config.info.id.clone()) + resolved.iter().map(|s| s.config.id.clone()) ); assert_eq!(resolved.len(), 3); @@ -62,7 +62,7 @@ fn resolve_locked() -> Result<()> { println!( "Resolved deps: {:?}", - resolved.iter().map(|s| s.config.info.id.clone()) + resolved.iter().map(|s| s.config.id.clone()) ); assert_eq!(resolved.len(), 3); diff --git a/src/utils/cmake.rs b/src/utils/cmake.rs deleted file mode 100644 index 2030fbf..0000000 --- a/src/utils/cmake.rs +++ /dev/null @@ -1,362 +0,0 @@ -use std::{ - fs::File, - io::Write, - path::{Path, PathBuf}, -}; - -use color_eyre::{Result, eyre::Context}; -use qpm_package::{ - extensions::package_metadata::PackageMetadataExtensions, models::shared_package::SharedPackageConfig, -}; - -use crate::repository::Repository; -use std::fmt::Write as OtherWrite; - -const EXTERN_CMAKE_FILE: &str = "extern.cmake"; -const QPM_CMAKE_FILE: &str = "qpm_defines.cmake"; - -/// Fern: Adds line ending after each element -/// thanks raft -macro_rules! concatln { - ($s:expr $(, $ss:expr)*) => { - concat!($s $(, "\n", $ss)*) - } -} - -pub fn write_cmake(shared_package: &SharedPackageConfig, repo: &impl Repository) -> Result<()> { - let cmake_opt = shared_package.config.cmake; - - if cmake_opt.is_none() && Path::new("./CMakeLists.txt").exists() { - eprintln!( - "qpm.json::info::additional_data::cmake is undefined in a CMake project, consider setting it to true" - ); - } - - // default to true - let cmake = cmake_opt.unwrap_or(true); - if !cmake { - return Ok(()); - } - write_extern_cmake(shared_package, repo)?; - write_define_cmake(shared_package)?; - - Ok(()) -} - -pub fn write_extern_cmake(dep: &SharedPackageConfig, repo: &impl Repository) -> Result<()> { - let path = Path::new("./").join(EXTERN_CMAKE_FILE); - let mut extern_cmake_file = - File::create(path).context(format!("Unable to create {EXTERN_CMAKE_FILE}"))?; - let mut result = concatln!( - "# YOU SHOULD NOT MANUALLY EDIT THIS FILE, QPM WILL VOID ALL CHANGES", - "# always added", - "target_include_directories(${COMPILE_ID} PRIVATE ${EXTERN_DIR}/includes)", - "target_include_directories(${COMPILE_ID} SYSTEM PRIVATE ${EXTERN_DIR}/includes/libil2cpp/il2cpp/libil2cpp)", - "\n# includes and compile options added by other libraries\n" - ).to_string(); - - let mut any = false; - for shared_dep in dep.restored_dependencies.iter() { - let shared_package = repo - .get_package(&shared_dep.dependency.id, &shared_dep.version) - .context("Unable to get shared package")? - .unwrap(); - let package_id = shared_package.config.id; - - if let Some(compile_options) = shared_package.config.additional_data.compile_options { - any = true; - // TODO: Must ${{COMPILE_ID}} be changed to {package_id}? - - if let Some(include_dirs) = compile_options.include_paths { - for dir in include_dirs.iter() { - writeln!( - result, - "target_include_directories(${{COMPILE_ID}} PRIVATE ${{EXTERN_DIR}}/includes/{package_id}/{dir})" - )?; - } - } - - if let Some(system_include_dirs) = compile_options.system_includes { - for dir in system_include_dirs.iter() { - writeln!( - result, - "target_include_directories(${{COMPILE_ID}} SYSTEM PRIVATE ${{EXTERN_DIR}}/includes/{package_id}/{dir})" - )?; - } - } - - let mut features: Vec = vec![]; - - if let Some(cpp_features) = compile_options.cpp_features { - features.append(&mut cpp_features.clone()); - } - - for feature in features.iter() { - writeln!( - result, - "target_compile_features(${{COMPILE_ID}} PRIVATE {feature})" - )?; - } - - let mut flags: Vec = vec![]; - - if let Some(cpp_flags) = compile_options.cpp_flags { - flags.append(&mut cpp_flags.clone()); - } - - if let Some(c_flags) = compile_options.c_flags { - flags.append(&mut c_flags.clone()); - } - - for flag in flags.iter() { - writeln!( - result, - "target_compile_options(${{COMPILE_ID}} PRIVATE {flag})" - )?; - } - } - - //TODO: Revisit - // if let Some(extra_files) = &shared_dep.dependency.additional_data.extra_files { - // for path_str in extra_files.iter() { - // let path = PathBuf::new().join(&format!( - // "extern/includes/{}/{}", - // &shared_dep.dependency.id, path_str - // )); - // let extern_path = PathBuf::new().join(&format!( - // "includes/{}/{}", - // &shared_dep.dependency.id, path_str - // )); - // if path.is_file() { - // writeln!( - // result, - // "add_library(${{COMPILE_ID}} SHARED ${{EXTERN_DIR}}/{})", - // extern_path.display() - // )?; - // } else { - // let listname = format!( - // "{}_{}_extra", - // path_str.replace(['/', '\\', '-'], "_"), - // shared_dep.dependency.id.replace('-', "_") - // ); - - // writeln!( - // result, - // "RECURSE_FILES({}_c ${{EXTERN_DIR}}/{}/*.c)", - // listname, - // extern_path.display() - // )?; - - // writeln!( - // result, - // "RECURSE_FILES({}_cpp ${{EXTERN_DIR}}/{}/*.cpp)", - // listname, - // extern_path.display() - // )?; - - // writeln!( - // result, - // "target_sources(${{COMPILE_ID}} PRIVATE ${{{listname}_c}})" - // )?; - - // writeln!( - // result, - // "target_sources(${{COMPILE_ID}} PRIVATE ${{{listname}_cpp}})" - // )?; - // } - // } - // } - - if let Some(dep) = dep - .config - .dependencies - .iter() - .find(|el| el.id == shared_dep.dependency.id) - { - if let Some(extra_files) = &dep.additional_data.extra_files { - for path_str in extra_files.iter() { - let path = - PathBuf::new().join(format!("extern/includes/{}/{}", &dep.id, path_str)); - let extern_path = std::path::PathBuf::new().join(format!( - "includes/{}/{}", - &shared_dep.dependency.id, path_str - )); - if path.is_file() { - write!( - result, - "add_library(${{COMPILE_ID}} SHARED ${{EXTERN_DIR}}/{})", - extern_path.display() - )?; - } else { - let listname = format!( - "{}_{}_local_extra", - path_str.replace(['/', '\\', '-'], "_"), - shared_dep.dependency.id.replace('-', "_") - ); - - writeln!( - result, - "RECURSE_FILES({}_c ${{EXTERN_DIR}}/{}/*.c)", - listname, - extern_path.display() - )?; - - writeln!( - result, - "RECURSE_FILES({}_cpp ${{EXTERN_DIR}}/{}/*.cpp)", - listname, - extern_path.display() - )?; - - writeln!( - result, - "target_sources(${{COMPILE_ID}} PRIVATE ${{{listname}_c}})" - )?; - - writeln!( - result, - "target_sources(${{COMPILE_ID}} PRIVATE ${{{listname}_cpp}})" - )?; - } - } - } - } - } - - if !any { - result.push_str("# Sadly, there were none with extra include dirs\n"); - } - - result.push_str(concatln!( - "\n# libs dir -> stores .so or .a files (or symlinked!)", - "target_link_directories(${COMPILE_ID} PRIVATE ${EXTERN_DIR}/libs)", - "RECURSE_FILES(so_list ${EXTERN_DIR}/libs/*.so)", - "RECURSE_FILES(a_list ${EXTERN_DIR}/libs/*.a)\n", - "# every .so or .a that needs to be linked, put here!", - "# I don't believe you need to specify if a lib is static or not, poggers!", - "target_link_libraries(${COMPILE_ID} PRIVATE\n\t${so_list}\n\t${a_list}\n)\n" - )); - - extern_cmake_file - .write_all(result.as_bytes()) - .context("Failed to write out extern cmake file")?; - Ok(()) -} - -pub fn write_define_cmake(dep: &SharedPackageConfig) -> Result<()> { - let path = Path::new("./").join(QPM_CMAKE_FILE); - - let mut defines_cmake_file = - File::create(path).context("Failed to create defines cmake file")?; - - defines_cmake_file - .write_all(make_defines_string(dep)?.as_bytes()) - .context("Failed to write out own define make string")?; - Ok(()) -} - -pub fn make_defines_string(dep: &SharedPackageConfig) -> Result { - // TODO: use additional_data.compile_options here or in the extern cmake file ? include dirs are set there at least - let mut result: String = concatln!( - "# YOU SHOULD NOT MANUALLY EDIT THIS FILE, QPM WILL VOID ALL CHANGES", - "# Version defines, pretty useful" - ) - .to_string(); - - writeln!(result, "\nset(MOD_VERSION \"{}\")", dep.config.version)?; - result.push_str("# take the mod name and just remove spaces, that will be MOD_ID, if you don't like it change it after the include of this file\n"); - writeln!( - result, - "set(MOD_ID \"{}\")\n", - dep.config.name.replace(' ', "") - )?; - result.push_str("# derived from override .so name or just id_version\n"); - - writeln!( - result, - "set(COMPILE_ID \"{}\")", - dep.config.get_module_id() - )?; - - result.push_str( - "# derived from whichever codegen package is installed, will default to just codegen\n", - ); - - writeln!( - result, - "set(CODEGEN_ID \"{}\")\n", - if let Some(codegen_dep) = dep - .restored_dependencies - .iter() - .find(|dep| dep.dependency.id.contains("codegen")) - { - // found a codegen - &codegen_dep.dependency.id - } else { - "codegen" - } - )?; - - result.push_str("# given from qpm, automatically updated from qpm.json\n"); - - writeln!( - result, - "set(EXTERN_DIR_NAME \"{}\")", - dep.config.dependencies_dir.display() - )?; - writeln!( - result, - "set(SHARED_DIR_NAME \"{}\")\n", - dep.config.shared_dir.display() - )?; - - result.push_str(concatln!( - "# if no target given, use Debug", - "if (NOT DEFINED CMAKE_BUILD_TYPE)", - "\tset(CMAKE_BUILD_TYPE \"Debug\")", - "endif()\n" - )); - result.push_str(concatln!( - "\n# defines used in ninja / cmake ndk builds", - "if (NOT DEFINED CMAKE_ANDROID_NDK)", - "\tif (EXISTS \"${CMAKE_CURRENT_LIST_DIR}/ndkpath.txt\")", - "\t\tfile (STRINGS \"ndkpath.txt\" CMAKE_ANDROID_NDK)", - "\telse()", - "\t\tif(EXISTS $ENV{ANDROID_NDK_HOME})", - "\t\t\tset(CMAKE_ANDROID_NDK $ENV{ANDROID_NDK_HOME})", - "\t\telseif(EXISTS $ENV{ANDROID_NDK_LATEST_HOME})", - "\t\t\tset(CMAKE_ANDROID_NDK $ENV{ANDROID_NDK_LATEST_HOME})", - "\t\tendif()", - "\tendif()", - "endif()", - "if (NOT DEFINED CMAKE_ANDROID_NDK)", - "\tmessage(Big time error buddy, no NDK)", - "endif()", - "message(Using NDK ${CMAKE_ANDROID_NDK})", - "string(REPLACE \"\\\\\" \"/\" CMAKE_ANDROID_NDK ${CMAKE_ANDROID_NDK})", - "\nset(ANDROID_PLATFORM 24)", - "set(ANDROID_ABI arm64-v8a)", - "set(ANDROID_STL c++_static)", - "set(ANDROID_USE_LEGACY_TOOLCHAIN_FILE OFF)", - "\nset(CMAKE_TOOLCHAIN_FILE ${CMAKE_ANDROID_NDK}/build/cmake/android.toolchain.cmake)" - )); - result.push_str(concatln!( - "\n# define used for external data, mostly just the qpm dependencies", - "set(EXTERN_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${EXTERN_DIR_NAME})", - "set(SHARED_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${SHARED_DIR_NAME})" - )); - result.push_str(concatln!( - "\n# get files by filter recursively", - "MACRO(RECURSE_FILES return_list filter)", - "\tFILE(GLOB_RECURSE new_list ${filter})", - "\tSET(file_list \"\")", - "\tFOREACH(file_path ${new_list})", - "\t\tSET(file_list ${file_list} ${file_path})", - "\tENDFOREACH()", - "\tLIST(REMOVE_DUPLICATES file_list)", - "\tSET(${return_list} ${file_list})", - "ENDMACRO()" - )); - - Ok(result) -} diff --git a/src/utils/git.rs b/src/utils/git.rs index 9beeec3..9390990 100644 --- a/src/utils/git.rs +++ b/src/utils/git.rs @@ -1,194 +1,5 @@ -use std::{ - fs::File, - io::{BufReader, BufWriter}, - path::Path, - process::{Command, Stdio}, -}; - -use color_eyre::{ - Result, Section, - eyre::{Context, bail}, -}; -use owo_colors::OwoColorize; -//use duct::cmd; use serde::{Deserialize, Serialize}; -use crate::{ - models::config::get_keyring, - network::agent::{download_file_report, get_agent}, - terminal::colors::QPMColor, -}; - -pub fn check_git() -> Result<()> { - let mut git = std::process::Command::new("git"); - git.arg("--version"); - - match git.output() { - Ok(_) => { - #[cfg(debug_assertions)] - println!("git detected on command line!"); - Ok(()) - } - Err(_e) => { - #[cfg(windows)] - bail!( - "Please make sure git ({}) is installed and on path, then try again!", - "https://git-scm.com/download/win".bright_yellow() - ); - #[cfg(target_os = "linux")] - bail!( - "Please make sure git ({}) is installed and on path, then try again!", - "https://git-scm.com/download/linux".bright_yellow() - ); - #[cfg(target_os = "macos")] - bail!( - "Please make sure git ({}) is installed and on path, then try again!", - "https://git-scm.com/download/mac".bright_yellow() - ); - } - } -} - -pub fn get_release(url: &str, out: &std::path::Path) -> Result { - check_git()?; - if let Ok(token_unwrapped) = get_keyring().get_password() { - get_release_with_token(url, out, &token_unwrapped) - } else { - get_release_without_token(url, out) - } -} - -pub fn get_release_without_token(url: &str, out: &std::path::Path) -> Result { - let file = File::create(out).context("create so file failed")?; - let mut buf = BufWriter::new(file); - - download_file_report(url, &mut buf, |_, _| {}).with_context(|| { - format!( - "Failed while downloading {} to {}", - url.blue(), - out.display().file_path_color() - ) - })?; - - Ok(out.exists()) -} - -pub fn get_release_with_token(url: &str, out: &std::path::Path, token: &str) -> Result { - // had token, use it! - // download url for a private thing: still need to get asset id! - // from this: "https://github.com/$USER/$REPO/releases/download/$TAG/$FILENAME" - // to this: "https://$TOKEN@api.github.com/repos/$USER/$REPO/releases/assets/$ASSET_ID" - let split: Vec = url.split('/').map(|el| el.to_string()).collect(); - - // Obviously this is a bad way of parsing the GH url but like I see no better way, people better not use direct lib uploads lol - // (I know mentioning it here will make people do that, so fuck y'all actually thinking of doing that) - // HACK: Not ideal way of getting these values - let user = split.get(3).unwrap(); - let repo = split.get(4).unwrap(); - let tag = split.get(7).unwrap(); - let filename = split.get(8).unwrap(); - - let asset_data_link = format!( - "https://{}@api.github.com/repos/{}/{}/releases/tags/{}", - &token, &user, &repo, &tag - ); - - let data = match get_agent().get(asset_data_link).send() { - Ok(o) => o.json::().unwrap(), - Err(e) => { - let error_string = e.to_string().replace(token, "***"); - bail!("{}", error_string); - } - }; - - for asset in data.assets.iter() { - if asset.name.eq(filename) { - // this is the correct asset! - let download = asset - .url - .replace("api.github.com", &format!("{token}@api.github.com")); - - let file = File::create(out).context("create so file failed")?; - let mut buf = BufWriter::new(file); - - download_file_report(&download, &mut buf, |_, _| {}).with_context(|| { - format!( - "Failed while downloading {} to {}", - download.replace(token, "{token}").blue(), - out.display().file_path_color() - ) - })?; - break; - } - } - - Ok(out.exists()) -} - -pub fn clone(mut url: String, branch: Option<&String>, out: &Path) -> Result { - check_git()?; - if let Ok(token_unwrapped) = get_keyring().get_password() { - if let Some(gitidx) = url.find("github.com") { - url.insert_str(gitidx, &format!("{token_unwrapped}@")); - } - } - - if url.ends_with('/') { - url = url[..url.len() - 1].to_string(); - } - - let mut git = Command::new("git"); - git.arg("clone") - .arg(format!("{url}.git")) - .arg(out) - .arg("--depth") - .arg("1") - .arg("--recurse-submodules") - .arg("--shallow-submodules") - .arg("--single-branch") - .stdin(Stdio::inherit()) - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()); - - if let Some(branch_unwrapped) = branch { - git.arg("-b").arg(branch_unwrapped); - } else { - println!("No branch name found, cloning default branch"); - } - - let mut child = git - .spawn() - .context("Git clone package") - .with_suggestion(|| format!("File a bug report. Used the following command: {:#?}", git))?; - - match child.wait() { - Ok(e) => { - if e.code().unwrap_or(-1) != 0 { - let stderr = BufReader::new(child.stderr.as_mut().unwrap()); - - let mut error_string = std::str::from_utf8(stderr.buffer())?.to_string(); - - if let Ok(token_unwrapped) = get_keyring().get_password() { - error_string = error_string.replace(&token_unwrapped, "***"); - } - - bail!("Exit code {}: {}", e, error_string); - } - } - Err(e) => { - let mut error_string = e.to_string(); - - if let Ok(token_unwrapped) = get_keyring().get_password() { - error_string = error_string.replace(&token_unwrapped, "***"); - } - - bail!("{}", error_string); - } - } - - Ok(out.try_exists()?) -} - #[derive(Serialize, Deserialize, Debug)] pub struct GithubReleaseAsset { pub url: String, diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 08070ea..bb51fc3 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -1,5 +1,4 @@ pub mod android; -pub mod cmake; pub mod fs; pub mod git; pub mod json; diff --git a/test_cmd/restore.out/extern/includes/scotland2/shared/loader.hpp b/test_cmd/restore.out/extern/includes/scotland2/shared/loader.hpp index 4fe64d5..004b2eb 100644 --- a/test_cmd/restore.out/extern/includes/scotland2/shared/loader.hpp +++ b/test_cmd/restore.out/extern/includes/scotland2/shared/loader.hpp @@ -332,7 +332,7 @@ struct MODLOADER_EXPORT ModData { copy_path[path_str.size()] = '/0'; return CModResult{ - .info = info.to_c(), + = info.to_c(), .path = copy_path, .handle = handle, }; From ae0c3e4b88ca8acaba3970d9b7365d78203e8746 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 19 Jul 2025 12:19:41 -0400 Subject: [PATCH 006/119] Update lockfile --- Cargo.lock | 1834 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 1518 insertions(+), 316 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dfb276a..31ae86c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,7 +15,7 @@ dependencies = [ name = "adler2" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" @@ -41,6 +41,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "anstream" version = "0.6.19" @@ -82,9 +88,9 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.8" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" dependencies = [ "anstyle", "once_cell_polyfill", @@ -107,8 +113,14 @@ dependencies = [ ] [[package]] -name = "async-compression" -version = "0.4.23" +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + +[[package]] +name = "assert_cmd" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bd389a4b2970a01282ee455294913c0a43724daedcd1a24c3eb0ec1c1320b66" dependencies = [ @@ -139,9 +151,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.25" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40f6024f3f856663b45fd0c9b6f2024034a702f453549449e0d84a305900dad4" +checksum = "ddb939d66e4ae03cee6091612804ba446b12878410cfa17f785f4dd67d4014e8" dependencies = [ "brotli", "flate2", @@ -151,6 +163,12 @@ dependencies = [ "tokio", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.5.0" @@ -169,7 +187,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -190,6 +208,15 @@ version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "brotli" version = "8.0.1" @@ -211,11 +238,28 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "bstr" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "bumpalo" -version = "3.18.1" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" @@ -225,28 +269,18 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "bzip2" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ecfb22d906f800d4fe833b6282cf4dc1c298f5057ca0b5445e5c209735ca47" -dependencies = [ - "bzip2-sys", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.13+1.0.8" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +checksum = "bea8dcd42434048e4f7a304411d9273a411f647446c1234a65ce0554923f4cff" dependencies = [ - "cc", - "pkg-config", + "libbz2-rs-sys", ] [[package]] name = "cc" -version = "1.2.24" +version = "1.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16595d3be041c03b09d08d0858631facccee9221e579704070e6e9e4915d3bc7" +checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" dependencies = [ "jobserver", "libc", @@ -267,9 +301,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "clap" -version = "4.5.39" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f" +checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" dependencies = [ "clap_builder", "clap_derive", @@ -277,9 +311,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.39" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51" +checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" dependencies = [ "anstream", "anstyle", @@ -289,18 +323,18 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.51" +version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d2267df7f3c8e74e38268887ea5235d4dfadd39bfff2d56ab82d61776be355e" +checksum = "a5abde44486daf70c5be8b8f8f1b66c49f86236edf6fa2abadb4d961c4c6229a" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" dependencies = [ "heck", "proc-macro2", @@ -314,6 +348,12 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +[[package]] +name = "clru" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbd0f76e066e64fdc5631e3bb46381254deab9ef1158292f27c8c57e3bf3fe59" + [[package]] name = "color-eyre" version = "0.6.5" @@ -345,22 +385,38 @@ dependencies = [ name = "colorchoice" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] -name = "content_inspector" -version = "0.2.4" +name = "core-foundation" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ - "memchr", + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", ] [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -399,6 +455,16 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "cursed-semver-parser" version = "0.1.0" @@ -436,6 +502,22 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "dirs" version = "6.0.0" @@ -492,6 +574,15 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -500,9 +591,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", "windows-sys 0.60.2", @@ -518,6 +609,16 @@ dependencies = [ "once_cell", ] +[[package]] +name = "faster-hex" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7223ae2d2f179b803433d9c830478527e92b8117eab39460edae7f1614d9fb73" +dependencies = [ + "heapless", + "serde", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -562,6 +663,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -642,6 +749,16 @@ dependencies = [ "slab", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.16" @@ -676,194 +793,1008 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] -name = "git2" -version = "0.20.2" +name = "gix" +version = "0.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514c29cc879bdc0286b0cbc205585a49b252809eb86c69df4ce4f855ee75f635" +dependencies = [ + "gix-actor", + "gix-attributes", + "gix-command", + "gix-commitgraph", + "gix-config", + "gix-credentials", + "gix-date", + "gix-diff", + "gix-discover", + "gix-features", + "gix-filter", + "gix-fs", + "gix-glob", + "gix-hash", + "gix-hashtable", + "gix-ignore", + "gix-index", + "gix-lock", + "gix-negotiate", + "gix-object", + "gix-odb", + "gix-pack", + "gix-path", + "gix-pathspec", + "gix-prompt", + "gix-protocol", + "gix-ref", + "gix-refspec", + "gix-revision", + "gix-revwalk", + "gix-sec", + "gix-shallow", + "gix-submodule", + "gix-tempfile", + "gix-trace", + "gix-transport", + "gix-traverse", + "gix-url", + "gix-utils", + "gix-validate", + "gix-worktree", + "gix-worktree-state", + "once_cell", + "prodash", + "smallvec", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-actor" +version = "0.35.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" +checksum = "58ebbb8f41071c7cf318a0b1db667c34e1df49db7bf387d282a4e61a3b97882c" dependencies = [ - "bitflags", - "libc", - "libgit2-sys", - "log", - "openssl-probe", - "openssl-sys", - "url", + "bstr", + "gix-date", + "gix-utils", + "itoa", + "thiserror 2.0.12", + "winnow", ] [[package]] -name = "glob" -version = "0.3.2" +name = "gix-attributes" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" +checksum = "45442188216d08a5959af195f659cb1f244a50d7d2d0c3873633b1cd7135f638" dependencies = [ - "aho-corasick", "bstr", - "log", - "regex-automata", - "regex-syntax 0.8.5", + "gix-glob", + "gix-path", + "gix-quote", + "gix-trace", + "kstring", + "smallvec", + "thiserror 2.0.12", + "unicode-bom", ] [[package]] -name = "globwalk" -version = "0.9.1" +name = "gix-bitmap" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" +checksum = "b1db9765c69502650da68f0804e3dc2b5f8ccc6a2d104ca6c85bc40700d37540" dependencies = [ - "bitflags", - "ignore", - "walkdir", + "thiserror 2.0.12", ] [[package]] -name = "hashbrown" -version = "0.15.4" +name = "gix-chunk" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "0b1f1d8764958699dc764e3f727cef280ff4d1bd92c107bbf8acd85b30c1bd6f" +dependencies = [ + "thiserror 2.0.12", +] [[package]] -name = "heck" -version = "0.5.0" +name = "gix-command" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "6b31b65ca48a352ae86312b27a514a0c661935f96b481ac8b4371f65815eb196" +dependencies = [ + "bstr", + "gix-path", + "gix-quote", + "gix-trace", + "shell-words", +] [[package]] -name = "http" -version = "1.3.1" +name = "gix-commitgraph" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "6bb23121e952f43a5b07e3e80890336cb847297467a410475036242732980d06" dependencies = [ - "bytes", - "fnv", - "itoa", + "bstr", + "gix-chunk", + "gix-hash", + "memmap2", + "thiserror 2.0.12", ] [[package]] -name = "http-body" -version = "1.0.1" +name = "gix-config" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "5dfb898c5b695fd4acfc3c0ab638525a65545d47706064dcf7b5ead6cdb136c0" dependencies = [ - "bytes", - "http", + "bstr", + "gix-config-value", + "gix-features", + "gix-glob", + "gix-path", + "gix-ref", + "gix-sec", + "memchr", + "once_cell", + "smallvec", + "thiserror 2.0.12", + "unicode-bom", + "winnow", ] [[package]] -name = "http-body-util" -version = "0.1.3" +name = "gix-config-value" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "9f012703eb67e263c6c1fc96649fec47694dd3e5d2a91abfc65e4a6a6dc85309" dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", + "bitflags", + "bstr", + "gix-path", + "libc", + "thiserror 2.0.12", ] [[package]] -name = "httparse" -version = "1.10.1" +name = "gix-credentials" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +checksum = "0039dd3ac606dd80b16353a41b61fc237ca5cb8b612f67a9f880adfad4be4e05" +dependencies = [ + "bstr", + "gix-command", + "gix-config-value", + "gix-date", + "gix-path", + "gix-prompt", + "gix-sec", + "gix-trace", + "gix-url", + "thiserror 2.0.12", +] [[package]] -name = "hyper" -version = "1.6.0" +name = "gix-date" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "d7235bdf4d9d54a6901928e3a37f91c16f419e6957f520ed929c3d292b84226e" dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", + "bstr", "itoa", - "pin-project-lite", + "jiff", "smallvec", - "tokio", - "want", + "thiserror 2.0.12", ] [[package]] -name = "hyper-rustls" -version = "0.27.6" +name = "gix-diff" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" +checksum = "de854852010d44a317f30c92d67a983e691c9478c8a3fb4117c1f48626bcdea8" dependencies = [ - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots", + "bstr", + "gix-hash", + "gix-object", + "thiserror 2.0.12", ] [[package]] -name = "hyper-util" -version = "0.1.13" +name = "gix-discover" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" +checksum = "ffb180c91ca1a2cf53e828bb63d8d8f8fa7526f49b83b33d7f46cbeb5d79d30a" +dependencies = [ + "bstr", + "dunce", + "gix-fs", + "gix-hash", + "gix-path", + "gix-ref", + "gix-sec", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-features" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a92748623c201568785ee69a561f4eec06f745b4fac67dab1d44ca9891a57ee" dependencies = [ - "base64", "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", + "crc32fast", + "flate2", + "gix-path", + "gix-trace", + "gix-utils", "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "system-configuration", - "tokio", - "tower-service", - "tracing", - "windows-registry", + "once_cell", + "prodash", + "thiserror 2.0.12", + "walkdir", ] [[package]] -name = "icu_collections" -version = "2.0.0" +name = "gix-filter" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "aa6571a3927e7ab10f64279a088e0dae08e8da05547771796d7389bbe28ad9ff" dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", + "bstr", + "encoding_rs", + "gix-attributes", + "gix-command", + "gix-hash", + "gix-object", + "gix-packetline-blocking", + "gix-path", + "gix-quote", + "gix-trace", + "gix-utils", + "smallvec", + "thiserror 2.0.12", ] [[package]] -name = "icu_locale_core" -version = "2.0.0" +name = "gix-fs" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "d793f71e955d18f228d20ec433dcce6d0e8577efcdfd11d72d09d7cc2758dfd1" dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", + "bstr", + "fastrand", + "gix-features", + "gix-path", + "gix-utils", + "thiserror 2.0.12", ] [[package]] -name = "icu_normalizer" -version = "2.0.0" +name = "gix-glob" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "b947db8366823e7a750c254f6bb29e27e17f27e457bf336ba79b32423db62cd5" dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", + "bitflags", + "bstr", + "gix-features", + "gix-path", +] + +[[package]] +name = "gix-hash" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "251fad79796a731a2a7664d9ea95ee29a9e99474de2769e152238d4fdb69d50e" +dependencies = [ + "faster-hex", + "gix-features", + "sha1-checked", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-hashtable" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c35300b54896153e55d53f4180460931ccd69b7e8d2f6b9d6401122cdedc4f07" +dependencies = [ + "gix-hash", + "hashbrown", + "parking_lot", +] + +[[package]] +name = "gix-ignore" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "564d6fddf46e2c981f571b23d6ad40cb08bddcaf6fc7458b1d49727ad23c2870" +dependencies = [ + "bstr", + "gix-glob", + "gix-path", + "gix-trace", + "unicode-bom", +] + +[[package]] +name = "gix-index" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af39fde3ce4ce11371d9ce826f2936ec347318f2d1972fe98c2e7134e267e25" +dependencies = [ + "bitflags", + "bstr", + "filetime", + "fnv", + "gix-bitmap", + "gix-features", + "gix-fs", + "gix-hash", + "gix-lock", + "gix-object", + "gix-traverse", + "gix-utils", + "gix-validate", + "hashbrown", + "itoa", + "libc", + "memmap2", + "rustix", + "smallvec", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-lock" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9fa71da90365668a621e184eb5b979904471af1b3b09b943a84bc50e8ad42ed" +dependencies = [ + "gix-tempfile", + "gix-utils", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-negotiate" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d58d4c9118885233be971e0d7a589f5cfb1a8bd6cb6e2ecfb0fc6b1b293c83b" +dependencies = [ + "bitflags", + "gix-commitgraph", + "gix-date", + "gix-hash", + "gix-object", + "gix-revwalk", + "smallvec", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-object" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49664e3e212bc34f7060f5738ce7022247e4afd959b68a4f666b1fd29c00b23c" +dependencies = [ + "bstr", + "gix-actor", + "gix-date", + "gix-features", + "gix-hash", + "gix-hashtable", + "gix-path", + "gix-utils", + "gix-validate", + "itoa", + "smallvec", + "thiserror 2.0.12", + "winnow", +] + +[[package]] +name = "gix-odb" +version = "0.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9d7af10fda9df0bb4f7f9bd507963560b3c66cb15a5b825caf752e0eb109ac" +dependencies = [ + "arc-swap", + "gix-date", + "gix-features", + "gix-fs", + "gix-hash", + "gix-hashtable", + "gix-object", + "gix-pack", + "gix-path", + "gix-quote", + "parking_lot", + "tempfile", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-pack" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8571df89bfca5abb49c3e3372393f7af7e6f8b8dbe2b96303593cef5b263019" +dependencies = [ + "clru", + "gix-chunk", + "gix-features", + "gix-hash", + "gix-hashtable", + "gix-object", + "gix-path", + "gix-tempfile", + "memmap2", + "parking_lot", + "smallvec", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-packetline" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2592fbd36249a2fea11056f7055cc376301ef38d903d157de41998335bbf1f93" +dependencies = [ + "bstr", + "faster-hex", + "gix-trace", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-packetline-blocking" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4e706f328cd494cc8f932172e123a72b9a4711b0db5e411681432a89bd4c94" +dependencies = [ + "bstr", + "faster-hex", + "gix-trace", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-path" +version = "0.10.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6279d323d925ad4790602105ae27df4b915e7a7d81e4cdba2603121c03ad111" +dependencies = [ + "bstr", + "gix-trace", + "gix-validate", + "home", + "once_cell", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-pathspec" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daedead611c9bd1f3640dc90a9012b45f790201788af4d659f28d94071da7fba" +dependencies = [ + "bitflags", + "bstr", + "gix-attributes", + "gix-config-value", + "gix-glob", + "gix-path", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-prompt" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ffa1a7a34c81710aaa666a428c142b6c5d640492fcd41267db0740d923c7906" +dependencies = [ + "gix-command", + "gix-config-value", + "parking_lot", + "rustix", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-protocol" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12b4b807c47ffcf7c1e5b8119585368a56449f3493da93b931e1d4239364e922" +dependencies = [ + "bstr", + "gix-credentials", + "gix-date", + "gix-features", + "gix-hash", + "gix-lock", + "gix-negotiate", + "gix-object", + "gix-ref", + "gix-refspec", + "gix-revwalk", + "gix-shallow", + "gix-trace", + "gix-transport", + "gix-utils", + "maybe-async", + "thiserror 2.0.12", + "winnow", +] + +[[package]] +name = "gix-quote" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a375a75b4d663e8bafe3bf4940a18a23755644c13582fa326e99f8f987d83fd" +dependencies = [ + "bstr", + "gix-utils", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-ref" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b7a23209d4e4cbdc2086d294f5f3f8707ac6286768847024d952d8cd3278c5b" +dependencies = [ + "gix-actor", + "gix-features", + "gix-fs", + "gix-hash", + "gix-lock", + "gix-object", + "gix-path", + "gix-tempfile", + "gix-utils", + "gix-validate", + "memmap2", + "thiserror 2.0.12", + "winnow", +] + +[[package]] +name = "gix-refspec" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d29cae1ae31108826e7156a5e60bffacab405f4413f5bc0375e19772cce0055" +dependencies = [ + "bstr", + "gix-hash", + "gix-revision", + "gix-validate", + "smallvec", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-revision" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f651f2b1742f760bb8161d6743229206e962b73d9c33c41f4e4aefa6586cbd3d" +dependencies = [ + "bstr", + "gix-commitgraph", + "gix-date", + "gix-hash", + "gix-object", + "gix-revwalk", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-revwalk" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e74f91709729e099af6721bd0fa7d62f243f2005085152301ca5cdd86ec02c" +dependencies = [ + "gix-commitgraph", + "gix-date", + "gix-hash", + "gix-hashtable", + "gix-object", + "smallvec", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-sec" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f7053ed7c66633b56c57bc6ed3377be3166eaf3dc2df9f1c5ec446df6fdf2c" +dependencies = [ + "bitflags", + "gix-path", + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "gix-shallow" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d936745103243ae4c510f19e0760ce73fb0f08096588fdbe0f0d7fb7ce8944b7" +dependencies = [ + "bstr", + "gix-hash", + "gix-lock", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-submodule" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "657cc5dd43cbc7a14d9c5aaf02cfbe9c2a15d077cded3f304adb30ef78852d3e" +dependencies = [ + "bstr", + "gix-config", + "gix-path", + "gix-pathspec", + "gix-refspec", + "gix-url", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-tempfile" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666c0041bcdedf5fa05e9bef663c897debab24b7dc1741605742412d1d47da57" +dependencies = [ + "gix-fs", + "libc", + "once_cell", + "parking_lot", + "tempfile", +] + +[[package]] +name = "gix-trace" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2ccaf54b0b1743a695b482ca0ab9d7603744d8d10b2e5d1a332fef337bee658" + +[[package]] +name = "gix-transport" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f7cc0179fc89d53c54e1f9ce51229494864ab4bf136132d69db1b011741ca3" +dependencies = [ + "base64", + "bstr", + "gix-command", + "gix-credentials", + "gix-features", + "gix-packetline", + "gix-quote", + "gix-sec", + "gix-url", + "reqwest", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-traverse" +version = "0.47.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7cdc82509d792ba0ad815f86f6b469c7afe10f94362e96c4494525a6601bdd5" +dependencies = [ + "bitflags", + "gix-commitgraph", + "gix-date", + "gix-hash", + "gix-hashtable", + "gix-object", + "gix-revwalk", + "smallvec", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-url" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b76a9d266254ad287ffd44467cd88e7868799b08f4d52e02d942b93e514d16f" +dependencies = [ + "bstr", + "gix-features", + "gix-path", + "percent-encoding", + "thiserror 2.0.12", + "url", +] + +[[package]] +name = "gix-utils" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5351af2b172caf41a3728eb4455326d84e0d70fe26fc4de74ab0bd37df4191c5" +dependencies = [ + "fastrand", + "unicode-normalization", +] + +[[package]] +name = "gix-validate" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77b9e00cacde5b51388d28ed746c493b18a6add1f19b5e01d686b3b9ece66d4d" +dependencies = [ + "bstr", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-worktree" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55f625ac9126c19bef06dbc6d2703cdd7987e21e35b497bb265ac37d383877b1" +dependencies = [ + "bstr", + "gix-attributes", + "gix-features", + "gix-fs", + "gix-glob", + "gix-hash", + "gix-ignore", + "gix-index", + "gix-object", + "gix-path", + "gix-validate", +] + +[[package]] +name = "gix-worktree-state" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ba9b17cbacc02b25801197b20100f7f9bd621db1e7fce9d3c8ab3175207bf8" +dependencies = [ + "bstr", + "gix-features", + "gix-filter", + "gix-fs", + "gix-glob", + "gix-hash", + "gix-index", + "gix-object", + "gix-path", + "gix-worktree", + "io-close", + "thiserror 2.0.12", +] + +[[package]] +name = "globset" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax 0.8.5", +] + +[[package]] +name = "globwalk" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" +dependencies = [ + "bitflags", + "ignore", + "walkdir", +] + +[[package]] +name = "h2" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", "icu_provider", "smallvec", "zerovec", @@ -959,14 +1890,35 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", "hashbrown", ] +[[package]] +name = "io-close" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cadcf447f06744f8ce713d2d6239bb5bde2c357a452397a9ed90c625da390bc" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "io-uring" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + [[package]] name = "ipnet" version = "2.11.0" @@ -987,23 +1939,64 @@ dependencies = [ name = "is_terminal_polyfill" version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jiff" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" +dependencies = [ + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde", + "windows-sys 0.59.0", +] + +[[package]] +name = "jiff-static" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1283705eb0a21404d2bfd6eef2a7593d240bc42a0bdb39db0ad6fa2ec026524" [[package]] -name = "itertools" -version = "0.14.0" +name = "jiff-tzdb-platform" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" dependencies = [ - "either", + "jiff-tzdb", ] -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - [[package]] name = "jobserver" version = "0.1.33" @@ -1033,6 +2026,15 @@ dependencies = [ "log", ] +[[package]] +name = "kstring" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558bf9508a558512042d3095138b1f7b8fe90c5467d94f9f1da28b3731c5dbd1" +dependencies = [ + "static_assertions", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -1040,39 +2042,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "libc" -version = "0.2.174" +name = "libbz2-rs-sys" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "775bf80d5878ab7c2b1080b5351a48b2f737d9f6f8b383574eebcc22be0dfccb" [[package]] -name = "libgit2-sys" -version = "0.18.2+1.9.1" +name = "libc" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222" -dependencies = [ - "cc", - "libc", - "libssh2-sys", - "libz-sys", - "openssl-sys", - "pkg-config", -] +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "liblzma" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66352d7a8ac12d4877b6e6ea5a9b7650ee094257dc40889955bea5bc5b08c1d0" +checksum = "0791ab7e08ccc8e0ce893f6906eb2703ed8739d8e89b57c0714e71bad09024c8" dependencies = [ "liblzma-sys", ] [[package]] name = "liblzma-sys" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5839bad90c3cc2e0b8c4ed8296b80e86040240f81d46b9c0e9bc8dd51ddd3af1" +checksum = "01b9596486f6d60c3bbe644c0e1be1aa6ccc472ad630fe8927b456973d7cb736" dependencies = [ "cc", "libc", @@ -1081,29 +2075,15 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "4488594b9328dee448adb906d8b126d9b7deb7cf5c22161ee591610bb1be83c0" dependencies = [ "bitflags", "libc", "redox_syscall", ] -[[package]] -name = "libssh2-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "220e4f05ad4a218192533b300327f5150e809b54c4ec83b5a1d91833601811b9" -dependencies = [ - "cc", - "libc", - "libz-sys", - "openssl-sys", - "pkg-config", - "vcpkg", -] - [[package]] name = "libz-rs-sys" version = "0.5.1" @@ -1113,18 +2093,6 @@ dependencies = [ "zlib-rs", ] -[[package]] -name = "libz-sys" -version = "1.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "linux-raw-sys" version = "0.9.4" @@ -1137,6 +2105,16 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.27" @@ -1172,12 +2150,32 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" +[[package]] +name = "maybe-async" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "memchr" version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +[[package]] +name = "memmap2" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" +dependencies = [ + "libc", +] + [[package]] name = "mime" version = "0.3.17" @@ -1200,7 +2198,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.59.0", ] @@ -1290,17 +2288,11 @@ dependencies = [ "syn 2.0.104", ] -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - [[package]] name = "openssl-src" -version = "300.5.0+3.5.0" +version = "300.5.1+3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8ce546f549326b0e6052b649198487d91320875da901e7bd11a06d1ee3f9c2f" +checksum = "735230c832b28c000e3bc117119e6466a663ec73506bc0a9907ea4187508e42a" dependencies = [ "cc", ] @@ -1325,20 +2317,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] -name = "os_pipe" -version = "1.2.2" +name = "owo-colors" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48dd4f4a2c8405440fd0462561f0e5806bd0f77e86f51c761481bdd4018b545e" + +[[package]] +name = "parking_lot" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db335f4760b14ead6290116f2427bf33a14d4f0617d49f78a246de10c1831224" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ - "libc", - "windows-sys 0.59.0", + "lock_api", + "parking_lot_core", ] [[package]] -name = "owo-colors" -version = "4.2.1" +name = "parking_lot_core" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26995317201fa17f3656c36716aed4a7c81743a9634ac4c99c0eeda495db0cec" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] [[package]] name = "pathdiff" @@ -1382,12 +2387,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] -name = "potential_utf" -version = "0.1.2" +name = "portable-atomic" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" dependencies = [ - "zerovec", + "portable-atomic", ] [[package]] @@ -1414,11 +2425,41 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "predicates" +version = "3.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" +dependencies = [ + "anstyle", + "difflib", + "float-cmp", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" + +[[package]] +name = "predicates-tree" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" +dependencies = [ + "predicates-core", + "termtree", +] + [[package]] name = "priority-queue" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b816314f0ba557376adec2392396a0b5c8195b25ef5394b7eea496ac26e353e4" +checksum = "5676d703dda103cbb035b653a9f11448c0a7216c7926bd35fcb5865475d0c970" dependencies = [ "autocfg", "equivalent", @@ -1434,6 +2475,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prodash" +version = "30.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6efc566849d3d9d737c5cb06cc50e48950ebe3d3f9d70631490fff3a07b139" +dependencies = [ + "parking_lot", +] + [[package]] name = "pubgrub" version = "0.3.0" @@ -1619,26 +2669,6 @@ dependencies = [ "getrandom 0.3.3", ] -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - [[package]] name = "redox_syscall" version = "0.5.13" @@ -1696,16 +2726,18 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.18" +version = "0.12.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" +checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" dependencies = [ "async-compression", "base64", "bytes", + "encoding_rs", "futures-channel", "futures-core", "futures-util", + "h2", "http", "http-body", "http-body-util", @@ -1765,22 +2797,22 @@ checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustix" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "rustls" -version = "0.23.28" +version = "0.23.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" dependencies = [ "once_cell", "ring", @@ -1802,9 +2834,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "ring", "rustls-pki-types", @@ -1857,6 +2889,12 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "semver" version = "1.0.26" @@ -1911,9 +2949,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.141" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" dependencies = [ "itoa", "memchr", @@ -1933,6 +2971,27 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha1-checked" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89f599ac0c323ebb1c6082821a54962b839832b03984598375bff3975b804423" +dependencies = [ + "digest", + "sha1", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -1942,6 +3001,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + [[package]] name = "shlex" version = "1.3.0" @@ -1982,6 +3047,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.11.1" @@ -2042,6 +3113,27 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tempfile" version = "3.20.0" @@ -2058,13 +3150,13 @@ dependencies = [ [[package]] name = "templatr" version = "0.1.0" -source = "git+https://github.com/QuestPackageManager/templatr.git#5eeebfcc189bdd825dcb820f1ee60e2978dd7ca5" +source = "git+https://github.com/QuestPackageManager/templatr.git#08a194109d4153a0cf56b7a46a449a418d7855bc" dependencies = [ "clap", "color-eyre", "dirs", "fs_extra", - "git2", + "gix", "regex", "serde", "serde_json", @@ -2187,15 +3279,17 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.1" +version = "1.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "pin-project-lite", + "slab", "socket2", "windows-sys 0.52.0", ] @@ -2240,9 +3334,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.4" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdb0c213ca27a9f57ab69ddb290fd80d970922355b83ae380b395d3986b8a2e" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ "bitflags", "bytes", @@ -2316,22 +3410,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] -name = "trycmd" -version = "0.15.9" +name = "typenum" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8b5cf29388862aac065d6597ac9c8e842d1cc827cb50f7c32f11d29442eaae4" -dependencies = [ - "anstream", - "automod", - "glob", - "humantime", - "humantime-serde", - "rayon", - "serde", - "shlex", - "snapbox", - "toml_edit", -] +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-bom" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eec5d1121208364f6793f7d2e222bf75a915c19557537745b195b253dd64217" [[package]] name = "unicode-ident" @@ -2339,6 +3427,15 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + [[package]] name = "untrusted" version = "0.9.0" @@ -2401,6 +3498,12 @@ dependencies = [ "smallvec", ] +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "wait-timeout" version = "0.2.1" @@ -2537,9 +3640,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] @@ -2575,13 +3678,48 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -2590,7 +3728,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -2608,14 +3746,30 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", ] [[package]] @@ -2624,53 +3778,101 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] @@ -2692,9 +3894,9 @@ checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "xml-rs" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" [[package]] name = "yoke" @@ -2722,22 +3924,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.104", ] [[package]] @@ -2802,9 +4004,9 @@ dependencies = [ [[package]] name = "zip" -version = "4.0.0" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "153a6fff49d264c4babdcfa6b4d534747f520e56e8f0f384f3b808c4b64cc1fd" +checksum = "9aed4ac33e8eb078c89e6cbb1d5c4c7703ec6d299fc3e7c3695af8f8b423468b" dependencies = [ "arbitrary", "bzip2", From b59dd84b61eff099cb90effb333d584ab4a954cc Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 19 Jul 2025 13:49:24 -0400 Subject: [PATCH 007/119] Implement restore command partially --- Cargo.lock | 2 +- src/commands/restore.rs | 96 +++++++++++++++++++++++++++++------------ 2 files changed, 69 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 31ae86c..814e4b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2550,7 +2550,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#aca1b31ca177a7170b3329486902fba5f9cfa7da" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#9466e5d674928cb60d6b306d64f7c5351b431098" dependencies = [ "cursed-semver-parser", "schemars", diff --git a/src/commands/restore.rs b/src/commands/restore.rs index 80458cc..738bc10 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -7,7 +7,10 @@ use color_eyre::{ eyre::{ContextCompat, Result, bail, eyre}, }; use itertools::Itertools; -use qpm_package::models::{package::PackageConfig, shared_package::SharedPackageConfig}; +use qpm_package::models::{ + package::{PackageConfig, TripletId}, + shared_package::SharedPackageConfig, +}; use semver::Version; use crate::{ @@ -26,6 +29,9 @@ use super::Command; #[derive(Args, Default)] pub struct RestoreCommand { + /// The triplet to restore + triplet: String, + #[clap(default_value = "false", long, short)] update: bool, @@ -64,17 +70,23 @@ impl Command for RestoreCommand { .then(|| SharedPackageConfig::read(".")) .transpose()?; + let triplet_id = TripletId(self.triplet); + let triplet = package + .triplet + .get_triplet_settings(&triplet_id) + .with_context(|| format!("Triplet {} not found", triplet_id.triplet_id_color()))?; + + let shared_triplet = shared_package_opt + .as_ref() + .and_then(|sp| sp.locked_triplet.get(&triplet_id)); + let mut repo = repository::useful_default_new(self.offline)?; // only update if: // manually // no shared.qpm.json // dependencies have been updated - let unlocked = self.update - || shared_package_opt.is_none() - || shared_package_opt.as_ref().is_some_and(|shared_package| { - shared_package.config.dependencies != package.dependencies - }); + let unlocked = self.update || is_modified(&shared_package_opt, &triplet_id, &triplet); if !unlocked && is_ignored() { eprintln!( @@ -95,43 +107,39 @@ impl Command for RestoreCommand { let resolved_deps = match &mut shared_package_opt { // locked resolve // only if shared_package is Some() and locked - Some(shared_package) if !unlocked => { + Some(shared_package) + if !unlocked && shared_package.locked_triplet.contains_key(&triplet_id) => + { // if the same, restore as usual println!("Using lock file for restoring"); // update config shared_package.config = package; - // make additional data use cached data - shared_package - .restored_dependencies - .iter_mut() - .try_for_each(|d| -> color_eyre::Result<()> { - let package = repo - .get_package(&d.dependency.id, &d.version) - .ok() - .flatten() - .with_context(|| { - format!( - "Unable to fetch {}:{}", - d.dependency.id.dependency_id_color(), - d.version.version_id_color() - ) - })?; - d.dependency.additional_data = package.config.additional_data; - Ok(()) - })?; - dependency::locked_resolve(shared_package, &repo)?.collect_vec() + let shared_triplet = shared_package + .locked_triplet + .get(&triplet_id) + .expect("Locked triplet should exist"); + + dependency::locked_resolve(shared_package, &repo, &shared_triplet)?.collect_vec() } // Unlocked resolve _ => { println!("Resolving packages"); - let (spc_result, restored_deps) = + let (spc_result, mut restored_deps) = SharedPackageConfig::resolve_from_package(package, &repo)?; + // update shared_package shared_package_opt = Some(spc_result); + // get triplet restored dependencies + // transform the iterator into a vector restored_deps + .remove(&triplet_id) + .expect("Triplet should exist in restored_deps") + .into_iter() + .map(|(dep, _triplet_id)| dep) + .collect() } }; @@ -150,6 +158,38 @@ impl Command for RestoreCommand { } } +fn is_modified( + shared_package_opt: &Option, + triplet_id: &TripletId, + triplet: &qpm_package::models::package::PackageTripletSettings, +) -> bool { + let Some(shared_package) = shared_package_opt else { + return true; + }; + + let Some(locked_triplet) = shared_package.locked_triplet.get(&triplet_id) else { + return true; + }; + + if locked_triplet.restored_dependencies.keys().len() != triplet.dependencies.len() { + return true; + } + + for (dep_id, dep) in triplet.dependencies.iter() { + let Some(locked_dep) = locked_triplet.restored_dependencies.get(dep_id) else { + return true; + }; + if dep.triplet != locked_dep.triplet { + return true; + } + if !dep.version_range.matches(&locked_dep.restored_version) { + return true; + } + } + + return false; +} + pub fn validate_ndk(package: &PackageConfig) -> Result<()> { let Some(ndk_req) = package.workspace.ndk.as_ref() else { return Ok(()); From 9fd4bb235595d0d2929b35bf25008ab679ec0362 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 24 Jul 2025 17:38:54 -0400 Subject: [PATCH 008/119] Fixup, more progress with QPM 2 --- Cargo.lock | 36 +++++++++++++-------- src/commands/restore.rs | 13 ++------ src/models/config.rs | 2 +- src/models/package.rs | 8 ++--- src/models/toolchain.rs | 6 ++-- src/repository/local.rs | 2 +- src/resolver/dependency.rs | 64 +++++++++++++++++++++++++------------- 7 files changed, 78 insertions(+), 53 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 814e4b3..16a191d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1735,9 +1735,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" dependencies = [ "base64", "bytes", @@ -1751,7 +1751,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.0", "system-configuration", "tokio", "tower-service", @@ -1910,9 +1910,9 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" dependencies = [ "bitflags", "cfg-if", @@ -2550,7 +2550,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#9466e5d674928cb60d6b306d64f7c5351b431098" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#bf42facb637a53d95674c663c6026a2afbeb49c4" dependencies = [ "cursed-semver-parser", "schemars", @@ -2583,7 +2583,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2", + "socket2 0.5.10", "thiserror 2.0.12", "tokio", "tracing", @@ -2620,7 +2620,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.5.10", "tracing", "windows-sys 0.59.0", ] @@ -2642,9 +2642,9 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha", "rand_core", @@ -2671,9 +2671,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "7e8af0dde094006011e6a740d4879319439489813bd0bcdc7d821beaeeff48ec" dependencies = [ "bitflags", ] @@ -3041,6 +3041,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -3290,7 +3300,7 @@ dependencies = [ "mio", "pin-project-lite", "slab", - "socket2", + "socket2 0.5.10", "windows-sys 0.52.0", ] diff --git a/src/commands/restore.rs b/src/commands/restore.rs index 738bc10..b422003 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -7,10 +7,7 @@ use color_eyre::{ eyre::{ContextCompat, Result, bail, eyre}, }; use itertools::Itertools; -use qpm_package::models::{ - package::{PackageConfig, TripletId}, - shared_package::SharedPackageConfig, -}; +use qpm_package::models::{package::PackageConfig, shared_package::SharedPackageConfig, triplet::{PackageTriplet, TripletId}}; use semver::Version; use crate::{ @@ -72,14 +69,10 @@ impl Command for RestoreCommand { let triplet_id = TripletId(self.triplet); let triplet = package - .triplet + .triplets .get_triplet_settings(&triplet_id) .with_context(|| format!("Triplet {} not found", triplet_id.triplet_id_color()))?; - let shared_triplet = shared_package_opt - .as_ref() - .and_then(|sp| sp.locked_triplet.get(&triplet_id)); - let mut repo = repository::useful_default_new(self.offline)?; // only update if: @@ -161,7 +154,7 @@ impl Command for RestoreCommand { fn is_modified( shared_package_opt: &Option, triplet_id: &TripletId, - triplet: &qpm_package::models::package::PackageTripletSettings, + triplet: &PackageTriplet, ) -> bool { let Some(shared_package) = shared_package_opt else { return true; diff --git a/src/models/config.rs b/src/models/config.rs index 0ffe3c6..beb04a4 100644 --- a/src/models/config.rs +++ b/src/models/config.rs @@ -52,7 +52,7 @@ impl UserConfig { } pub fn global_config_dir() -> PathBuf { - dirs::config_dir().unwrap().join("QPM-RS") + dirs::config_dir().unwrap().join("QPM-RS2") } pub fn read_global() -> Result { diff --git a/src/models/package.rs b/src/models/package.rs index d6492e8..d0c188f 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -8,8 +8,8 @@ use std::{ use color_eyre::{Result, Section, eyre::Context, owo_colors::OwoColorize}; use itertools::Itertools; use qpm_package::models::{ - package::{PackageConfig, PackageTripletSettings, TripletId}, - shared_package::{SharedPackageConfig, SharedTriplet, SharedTripletDependencyInfo}, + package::PackageConfig, + shared_package::{SharedPackageConfig, SharedTriplet, SharedTripletDependencyInfo}, triplet::TripletId, }; use qpm_qmod::models::mod_json::{ModDependency, ModJson}; use semver::VersionReq; @@ -167,7 +167,7 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { )> { let triplet_dependencies: HashMap> = config - .triplet + .triplets .specific_triplets .iter() .map(|(triplet_id, triplet)| -> color_eyre::Result<_> { @@ -214,7 +214,7 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { // mod_link: dep.additional_data.mod_link, // } - let local_deps = &self.config.triplet.specific_triplets[triplet]; + let local_deps = &self.config.triplets.specific_triplets[triplet]; // Only bundle mods that are not specifically excluded in qpm.json or if they're not header-only let restored_deps: Vec<_> = self diff --git a/src/models/toolchain.rs b/src/models/toolchain.rs index 518cd0a..a455046 100644 --- a/src/models/toolchain.rs +++ b/src/models/toolchain.rs @@ -1,7 +1,7 @@ use std::{fs::File, path::PathBuf}; use color_eyre::eyre::Result; -use qpm_package::models::{extra::CompileOptions, shared_package::SharedPackageConfig}; +use qpm_package::models::shared_package::SharedPackageConfig; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; @@ -23,7 +23,7 @@ pub fn write_toolchain_file( repo: &impl Repository, toolchain_path: &std::path::PathBuf, ) -> Result<()> { - let extern_dir = &shared_config.config.dependencies_dir.display(); + let extern_dir = &shared_config.config.dependencies_directory.display(); let compile_options = shared_config .restored_dependencies .iter() @@ -90,7 +90,7 @@ pub fn write_toolchain_file( let toolchain = ToolchainData { compile_options, - extern_dir: shared_config.config.dependencies_dir.clone(), + extern_dir: shared_config.config.dependencies_directory.clone(), }; let file = File::create(toolchain_path)?; serde_json::to_writer_pretty( diff --git a/src/repository/local.rs b/src/repository/local.rs index fa035ee..69121cf 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -357,7 +357,7 @@ impl FileRepository { ); } - let exposed_headers = src_path.join(&package.shared_dir); + let exposed_headers = src_path.join(&package.shared_directories); if package.additional_data.headers_only.unwrap_or(false) { return Ok(PackageFiles { diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index df0c4b5..7124dac 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -13,7 +13,8 @@ use crate::{ terminal::colors::QPMColor, }; use color_eyre::{ - eyre::{bail, Context, ContextCompat}, Result + Result, + eyre::{Context, ContextCompat, bail}, }; use itertools::Itertools; use pubgrub::{ @@ -21,16 +22,16 @@ use pubgrub::{ PubGrubError, Reporter, }; use qpm_package::models::{ - package::{ - DependencyId, PackageConfig, PackageTripletDependency, PackageTripletSettings, TripletDependencyMap, TripletId - }, + package::{DependencyId, PackageConfig}, shared_package::{SharedPackageConfig, SharedTriplet}, + triplet::TripletId, }; pub struct PackageDependencyResolver<'a, 'b, R> where R: Repository, { root: &'a PackageConfig, + root_triplet: &'a TripletId, repo: &'b R, } @@ -66,19 +67,27 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> fn get_dependencies( &self, - package: &PubgrubDependencyTarget, + package_triplet: &PubgrubDependencyTarget, version: &VersionWrapper, ) -> Result, PubgrubErrorWrapper> { // Root dependencies - if package.0 == self.root.id && version == &self.root.version { + if package_triplet.0 == self.root.id + && package_triplet.1 == *self.root_triplet + && version == &self.root.version + { // resolve dependencies of root - let triplet = self.root.triplet.specific_triplets[&package.1]; + let triplet = self + .root + .triplets + .specific_triplets + .get(&package_triplet.1) + .expect("Root triplet should always exist in the root package's triplets"); let deps = triplet .dependencies .iter() .map(|(dep_id, dep)| { - let pubgrub_dep = PubgrubDependencyTarget(dep_id.clone(), dep.triplet); + let pubgrub_dep = PubgrubDependencyTarget(dep_id.clone(), dep.triplet.clone()); let range = req_to_range(dep.version_range.clone()); (pubgrub_dep, range) @@ -88,20 +97,32 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> } // Find dependencies of dependencies - let pkg = self + let target_pkg = self .repo - .get_package(&package.0, &version.clone().into())? - .with_context(|| format!("Could not find package {package} with version {version}"))?; - - let deps = pkg - .config - .dependencies - .into_iter() - // remove any private dependencies - .filter(|dep| !dep.additional_data.is_private.unwrap_or(false)) - .map(|dep| { - let id = dep.id; - let range = req_to_range(dep.version_range); + .get_package(&package_triplet.0, &version.clone().into())? + .with_context(|| { + format!("Could not find package {package_triplet} with version {version}") + })?; + + let target_triplet = target_pkg + .locked_triplet + .get(&package_triplet.1) + .with_context(|| { + format!( + "Could not find triplet {} for package {}", + package_triplet.1.triplet_id_color(), + package_triplet.0.dependency_id_color() + ) + })?; + + let deps = target_triplet + .restored_dependencies + .iter() + // remove any private dependencies from the list + .filter(|(_, dep)| !dep.triplet.export) + .map(|(dep_id, dep)| { + let id = PubgrubDependencyTarget(dep_id.clone(), dep.triplet.triplet.clone()); + let range = req_to_range(dep.triplet.version_range.clone()); (id, range) }) .collect(); @@ -168,6 +189,7 @@ pub fn resolve<'a>( ) -> Result + 'a> { let resolver = PackageDependencyResolver { root, + root_triplet: triplet, repo: repository, }; let time = Instant::now(); From ad4e84bc6ef85a2819153fd9406faacef98ba160 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 25 Jul 2025 00:54:23 -0400 Subject: [PATCH 009/119] More progress with QPM 2 implementation --- Cargo.lock | 2 +- src/commands/restore.rs | 22 +-- src/models/mod.rs | 2 + src/models/package.rs | 34 ++-- src/models/qpackages.rs | 49 ++++++ src/models/qpkg.rs | 45 +++++ src/repository/local.rs | 49 +++--- src/repository/memcached.rs | 10 +- src/repository/mod.rs | 4 +- src/repository/multi.rs | 4 +- src/repository/qpackages.rs | 325 ++++++++++++++---------------------- src/resolver/dependency.rs | 65 +++++--- src/utils/git.rs | 10 +- 13 files changed, 340 insertions(+), 281 deletions(-) create mode 100644 src/models/qpackages.rs create mode 100644 src/models/qpkg.rs diff --git a/Cargo.lock b/Cargo.lock index 16a191d..e5dc890 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2550,7 +2550,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#bf42facb637a53d95674c663c6026a2afbeb49c4" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#aa1e4c39f455fa2e77feb2b7d0f04c8e5b689a2f" dependencies = [ "cursed-semver-parser", "schemars", diff --git a/src/commands/restore.rs b/src/commands/restore.rs index b422003..3361d43 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -7,15 +7,17 @@ use color_eyre::{ eyre::{ContextCompat, Result, bail, eyre}, }; use itertools::Itertools; -use qpm_package::models::{package::PackageConfig, shared_package::SharedPackageConfig, triplet::{PackageTriplet, TripletId}}; +use qpm_package::models::{ + package::PackageConfig, + shared_package::{SharedPackageConfig, QPM_SHARED_JSON}, + triplet::{PackageTriplet, TripletId}, +}; use semver::Version; use crate::{ models::{ config::get_combine_config, - package::{ - PackageConfigExtensions, SHARED_PACKAGE_FILE_NAME, SharedPackageConfigExtensions, - }, + package::{PackageConfigExtensions, SharedPackageConfigExtensions}, }, repository::{self, Repository}, resolver::dependency, @@ -83,17 +85,17 @@ impl Command for RestoreCommand { if !unlocked && is_ignored() { eprintln!( - "It seems that the current repository has {SHARED_PACKAGE_FILE_NAME} ignored. " + "It seems that the current repository has {QPM_SHARED_JSON} ignored. " ); eprintln!( - "Please commit it to avoid inconsistent dependency resolving. git add {SHARED_PACKAGE_FILE_NAME} --force" + "Please commit it to avoid inconsistent dependency resolving. git add {QPM_SHARED_JSON} --force" ); } if unlocked && env::var("CI") == Ok("true".to_string()) { eprintln!("Running in CI and using unlocked resolve, this seems like a bug!"); eprintln!( - "Make sure {SHARED_PACKAGE_FILE_NAME} is not gitignore'd and is comitted in the repository" + "Make sure {QPM_SHARED_JSON} is not gitignore'd and is comitted in the repository" ); } @@ -130,9 +132,6 @@ impl Command for RestoreCommand { restored_deps .remove(&triplet_id) .expect("Triplet should exist in restored_deps") - .into_iter() - .map(|(dep, _triplet_id)| dep) - .collect() } }; @@ -169,10 +168,11 @@ fn is_modified( } for (dep_id, dep) in triplet.dependencies.iter() { + // if the dependency is not in the locked triplet, it is modified let Some(locked_dep) = locked_triplet.restored_dependencies.get(dep_id) else { return true; }; - if dep.triplet != locked_dep.triplet { + if dep.triplet != locked_dep.restored_triplet { return true; } if !dep.version_range.matches(&locked_dep.restored_version) { diff --git a/src/models/mod.rs b/src/models/mod.rs index 2f7a397..673b106 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -4,3 +4,5 @@ pub mod mod_json; pub mod package; pub(crate) mod schemas; pub mod toolchain; +pub mod qpkg; +pub mod qpackages; \ No newline at end of file diff --git a/src/models/package.rs b/src/models/package.rs index d0c188f..3ab865c 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -8,8 +8,11 @@ use std::{ use color_eyre::{Result, Section, eyre::Context, owo_colors::OwoColorize}; use itertools::Itertools; use qpm_package::models::{ - package::PackageConfig, - shared_package::{SharedPackageConfig, SharedTriplet, SharedTripletDependencyInfo}, triplet::TripletId, + package::{PackageConfig, QPM_JSON}, + shared_package::{ + SharedPackageConfig, SharedTriplet, SharedTripletDependencyInfo, QPM_SHARED_JSON + }, + triplet::{PackageTriplet, TripletId}, }; use qpm_qmod::models::mod_json::{ModDependency, ModJson}; use semver::VersionReq; @@ -21,9 +24,6 @@ use super::{ toolchain, }; -pub const PACKAGE_FILE_NAME: &str = "qpm.json"; -pub const SHARED_PACKAGE_FILE_NAME: &str = "qpm.shared.json"; - pub trait PackageConfigExtensions { fn exists>(dir: P) -> bool; fn read>(dir: P) -> Result @@ -55,7 +55,7 @@ pub trait SharedPackageConfigExtensions: Sized { impl PackageConfigExtensions for PackageConfig { fn read>(dir: P) -> Result { - let path = dir.as_ref().join(PACKAGE_FILE_NAME); + let path = dir.as_ref().join(QPM_JSON); let file = File::open(&path).with_context(|| format!("{path:?} does not exist"))?; let res = json::json_from_reader_fast::<_, Self>(BufReader::new(file)) .with_context(|| format!("Unable to read PackageConfig at {path:?}"))?; @@ -65,7 +65,7 @@ impl PackageConfigExtensions for PackageConfig { } fn write>(&self, dir: P) -> Result<()> { - let path = dir.as_ref().join(PACKAGE_FILE_NAME); + let path = dir.as_ref().join(QPM_JSON); let file = File::create(&path).with_context(|| format!("{path:?} cannot be written"))?; serde_json::to_writer_pretty( @@ -80,7 +80,7 @@ impl PackageConfigExtensions for PackageConfig { } fn exists>(dir: P) -> bool { - dir.as_ref().with_file_name(PACKAGE_FILE_NAME).exists() + dir.as_ref().with_file_name(QPM_JSON).exists() } fn run_if_version( @@ -113,7 +113,7 @@ impl PackageConfigExtensions for PackageConfig { } impl PackageConfigExtensions for SharedPackageConfig { fn read>(dir: P) -> Result { - let path = dir.as_ref().join(SHARED_PACKAGE_FILE_NAME); + let path = dir.as_ref().join(QPM_SHARED_JSON); let file = File::open(&path) .with_context(|| format!("{path:?} not found")) .suggestion(format!("Try running {}", "qpm restore".blue()))?; @@ -123,7 +123,7 @@ impl PackageConfigExtensions for SharedPackageConfig { } fn write>(&self, dir: P) -> Result<()> { - let path = dir.as_ref().join(SHARED_PACKAGE_FILE_NAME); + let path = dir.as_ref().join(QPM_SHARED_JSON); let file = File::create(&path).with_context(|| format!("{path:?} cannot be written"))?; serde_json::to_writer_pretty( @@ -137,7 +137,7 @@ impl PackageConfigExtensions for SharedPackageConfig { Ok(()) } fn exists>(dir: P) -> bool { - dir.as_ref().join(SHARED_PACKAGE_FILE_NAME).exists() + dir.as_ref().join(QPM_SHARED_JSON).exists() } fn run_if_version( @@ -157,6 +157,11 @@ impl PackageConfigExtensions for SharedPackageConfig { } } +pub struct ResolvedDependency { + pub dependencies: SharedPackageConfig, + pub restored_triplet: TripletId, +} + impl SharedPackageConfigExtensions for SharedPackageConfig { fn resolve_from_package( config: PackageConfig, @@ -180,11 +185,12 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { Ok(( SharedPackageConfig { config, + restored_triplet: Default::default(), locked_triplet: triplet_dependencies .iter() - .map(|(triplet_id, dependencies)| { + .map(|(package_triplet, dependencies)| { ( - triplet_id.clone(), + package_triplet.clone(), SharedTriplet { restored_dependencies: dependencies .iter() @@ -193,7 +199,7 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { dep.config.id.clone(), SharedTripletDependencyInfo { restored_version: dep.config.version.clone(), - triplet: dep_triplet.clone(), + restored_triplet: dep_triplet.clone(), }, ) }) diff --git a/src/models/qpackages.rs b/src/models/qpackages.rs new file mode 100644 index 0000000..72cf506 --- /dev/null +++ b/src/models/qpackages.rs @@ -0,0 +1,49 @@ +use std::{fs::File, io::BufReader, path::Path}; + +use color_eyre::eyre::{Context, Result}; +use qpm_package::models::qpackages::QPackagesPackage; + +use crate::utils::json; + +pub const QPACKAGES_JSON: &str = "qpackages.json"; + +pub trait QPackageExtensions: Sized { + /// Checks if the QPackage exists in the given directory. + fn exists>(dir: P) -> bool; + + /// Reads the QPackage from the given directory. + fn read>(dir: P) -> Result + where + Self: std::marker::Sized; + + /// Writes the QPackage to the given directory. + fn write>(&self, dir: P) -> Result<()>; +} + +impl QPackageExtensions for QPackagesPackage { + fn exists>(dir: P) -> bool { + let path: std::path::PathBuf = dir.as_ref().join(QPACKAGES_JSON); + path.exists() + } + + fn read>(dir: P) -> Result + where + Self: std::marker::Sized { + let path = dir.as_ref().join(QPACKAGES_JSON); + let file = File::open(&path).with_context(|| format!("{path:?} does not exist"))?; + let res = json::json_from_reader_fast::<_, Self>(BufReader::new(file)) + .with_context(|| format!("Unable to read QPackage at {path:?}"))?; + + Ok(res) + } + + fn write>(&self, dir: P) -> Result<()> { + let path = dir.as_ref().join(QPACKAGES_JSON); + + let serialized = serde_json::to_string_pretty(self) + .context("Failed to serialize QPackage")?; + std::fs::write(path, serialized) + .context("Failed to write QPackage to file")?; + Ok(()) + } +} \ No newline at end of file diff --git a/src/models/qpkg.rs b/src/models/qpkg.rs new file mode 100644 index 0000000..99ad400 --- /dev/null +++ b/src/models/qpkg.rs @@ -0,0 +1,45 @@ +use std::{fs::File, io::BufReader, path::Path}; + +use color_eyre::eyre::{Context, Result}; +use qpm_package::models::qpkg::{QPkg, QPKG_JSON}; + +use crate::utils::json; + +pub trait QPkgExtensions: Sized { + fn exists>(dir: P) -> bool; + + fn read>(dir: P) -> Result + where + Self: std::marker::Sized; + fn write>(&self, dir: P) -> Result<()>; + +} + +impl QPkgExtensions for QPkg { + fn exists>(dir: P) -> bool { + let path = dir.as_ref().join(QPKG_JSON); + path.exists() + } + + fn read>(dir: P) -> Result + where + Self: std::marker::Sized { + let path = dir.as_ref().join(QPKG_JSON); + let file = File::open(&path).with_context(|| format!("{path:?} does not exist"))?; + let res = json::json_from_reader_fast::<_, Self>(BufReader::new(file)) + .with_context(|| format!("Unable to read PackageConfig at {path:?}"))?; + + + Ok(res) + } + + fn write>(&self, dir: P) -> Result<()> { + let path = dir.as_ref().join(QPKG_JSON); + + let serialized = serde_json::to_string_pretty(self) + .context("Failed to serialize QPkg")?; + std::fs::write(path, serialized) + .context("Failed to write QPkg to file")?; + Ok(()) + } +} \ No newline at end of file diff --git a/src/repository/local.rs b/src/repository/local.rs index 69121cf..9673652 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -7,6 +7,7 @@ use owo_colors::OwoColorize; use qpm_package::models::{ package::{DependencyId, PackageConfig}, shared_package::SharedPackageConfig, + triplet::TripletId, }; use schemars::JsonSchema; use semver::Version; @@ -33,7 +34,7 @@ use super::Repository; // All files must exist pub struct PackageFiles { - pub headers: PathBuf, + pub headers: Vec, pub release_binary: Option, pub debug_binary: Option, // pub extras: Vec, @@ -233,21 +234,46 @@ impl FileRepository { Ok(()) } + /// Returns the path to the global file repository pub fn global_file_repository_path() -> PathBuf { Self::global_repository_dir().join("qpm.repository.json") } + /// Returns the global repository directory, which is usually in the user's config directory pub fn global_repository_dir() -> PathBuf { - dirs::config_dir().unwrap().join("QPM-RS") + dirs::config_dir().unwrap().join("QPM-RS2") } pub fn clear() -> Result<(), std::io::Error> { fs::remove_file(Self::global_file_repository_path()) } + /// Returns the path to the package versions cache for a specific package ID. + #[inline] + pub fn get_package_versions_cache_path(id: &DependencyId) -> PathBuf { + let user_config = get_combine_config(); + let base_path = user_config.cache.as_ref().unwrap(); + + // cache/{id} + base_path.join(&id.0) + } + + /// Returns the path to the package cache for a specific version and triplet. + #[inline] + pub fn get_package_cache_path( + id: &DependencyId, + version: &Version, + triplet: &TripletId, + ) -> PathBuf { + // cache/{id}/{version}/{triplet} + Self::get_package_versions_cache_path(id) + .join(version.to_string()) + .join(triplet.to_string()) + } + pub fn copy_from_cache( package: &PackageConfig, - restored_deps: &[SharedPackageConfig], + restored_deps: &[(SharedPackageConfig, TripletId)], workspace_dir: &Path, ) -> Result<()> { let files = Self::collect_deps(package, restored_deps, workspace_dir)?; @@ -318,21 +344,6 @@ impl FileRepository { Ok(()) } - #[inline] - pub fn get_package_versions_cache_path(id: &DependencyId) -> PathBuf { - let user_config = get_combine_config(); - let base_path = user_config.cache.as_ref().unwrap(); - - // cache/{id} - base_path.join(id.0) - } - - #[inline] - pub fn get_package_cache_path(id: &DependencyId, version: &Version) -> PathBuf { - // cache/{id}/{version} - Self::get_package_versions_cache_path(id).join(version.to_string()) - } - /// Collects all files of a package from the cache. /// Returns a `PackageFiles` struct containing the paths to the headers, release binary, and debug binary. pub fn collect_files_of_package(package: &PackageConfig) -> Result { @@ -412,7 +423,7 @@ impl FileRepository { /// Returns a map of source paths to target paths for the dependencies. pub fn collect_deps( package: &PackageConfig, - restored_deps: &[SharedPackageConfig], + restored_deps: &[(SharedPackageConfig, TripletId)], workspace_dir: &Path, ) -> Result> { // let package = shared_package.config; diff --git a/src/repository/memcached.rs b/src/repository/memcached.rs index b2822de..84ac694 100644 --- a/src/repository/memcached.rs +++ b/src/repository/memcached.rs @@ -9,7 +9,7 @@ use super::Repository; pub struct MemcachedRepository { // interior mutability - packages_cache: UnsafeCell>>, + packages_cache: UnsafeCell>>, versions_cache: UnsafeCell>>, package_list: UnsafeCell>>, @@ -59,7 +59,7 @@ impl Repository for MemcachedRepository { Ok(versions) } - fn get_package(&self, id: &DependencyId, version: &Version) -> Result> { + fn get_package(&self, id: &DependencyId, version: &Version) -> Result> { let cache = self .packages_cache .get_safe() @@ -75,16 +75,16 @@ impl Repository for MemcachedRepository { if let Some(config) = &config { self.packages_cache .get_mut_safe() - .entry(config.config.id.clone()) + .entry(config.id.clone()) .or_default() - .entry(config.config.version.clone()) + .entry(config.version.clone()) .insert_entry(config.clone()); } Ok(config) } - fn add_to_db_cache(&mut self, config: SharedPackageConfig, permanent: bool) -> Result<()> { + fn add_to_db_cache(&mut self, config: PackageConfig, permanent: bool) -> Result<()> { self.inner_repo.add_to_db_cache(config, permanent) } diff --git a/src/repository/mod.rs b/src/repository/mod.rs index 42f3498..955a910 100644 --- a/src/repository/mod.rs +++ b/src/repository/mod.rs @@ -26,10 +26,10 @@ pub trait Repository { &self, id: &DependencyId, version: &Version, - ) -> Result>; + ) -> Result>; // add to the db cache // this just stores the shared config itself, not the package - fn add_to_db_cache(&mut self, config: SharedPackageConfig, permanent: bool) -> Result<()>; + fn add_to_db_cache(&mut self, config: PackageConfig, permanent: bool) -> Result<()>; /// Returns true if the repository uses a network connection to retrieve data fn is_online(&self) -> bool; diff --git a/src/repository/multi.rs b/src/repository/multi.rs index 5506379..ddc1ac5 100644 --- a/src/repository/multi.rs +++ b/src/repository/multi.rs @@ -63,7 +63,7 @@ impl Repository for MultiDependencyRepository { &self, id: &DependencyId, version: &semver::Version, - ) -> Result> { + ) -> Result> { let opt = self .repositories .iter() @@ -108,7 +108,7 @@ impl Repository for MultiDependencyRepository { } } - fn add_to_db_cache(&mut self, config: SharedPackageConfig, permanent: bool) -> Result<()> { + fn add_to_db_cache(&mut self, config: PackageConfig, permanent: bool) -> Result<()> { if permanent { #[cfg(debug_assertions)] println!("Warning, adding to cache permanently to multiple repos!",); diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 1f5c3f1..14ef511 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -1,7 +1,7 @@ use bytes::{BufMut, BytesMut}; use color_eyre::{ Result, Section, - eyre::{Context, OptionExt, bail}, + eyre::{Context, ContextCompat, OptionExt, bail}, }; use itertools::Itertools; use owo_colors::OwoColorize; @@ -10,18 +10,28 @@ use semver::Version; use std::{ fs::{self, File}, io::{BufWriter, Cursor}, - path::Path, + path::{Path, PathBuf}, }; use zip::ZipArchive; use serde::Deserialize; use qpm_package::{ - extensions::package_metadata::PackageMetadataExtensions, models::{package::{DependencyId, PackageConfig}, shared_package::SharedPackageConfig}, + extensions::package_metadata::PackageMetadataExtensions, + models::{ + package::{DependencyId, PackageConfig}, + qpackages::QPackagesPackage, + qpkg::{QPKG_JSON, QPkg}, + shared_package::{QPM_SHARED_JSON, SharedPackageConfig}, + triplet::TripletId, + }, }; use crate::{ - models::{config::get_combine_config, package::PackageConfigExtensions}, + models::{ + config::get_combine_config, package::PackageConfigExtensions, + qpackages::QPackageExtensions, qpkg::QPkgExtensions, + }, network::agent::{download_file_report, get_agent}, terminal::colors::QPMColor, utils::git, @@ -65,7 +75,7 @@ impl QPMRepository { .with_context(|| format!("Getting list of versions for {}", id.dependency_id_color())) } - pub fn get_shared_package(id: &DependencyId, ver: &Version) -> Result> { + pub fn get_qpackage(id: &DependencyId, ver: &Version) -> Result> { Self::run_request(&format!("{id}/{ver}")).with_context(|| { format!( "Getting shared package config {}:{}", @@ -105,7 +115,9 @@ impl QPMRepository { Ok(()) } - fn download_package(&self, config: &PackageConfig) -> Result<()> { + /// Downloads the package and caches it in the user config cache path + /// Note this does not depend necessarily on it being on qpackages.com, it can be any valid QPkg + fn download_package(&self, qpackage_config: &QPackagesPackage) -> Result<()> { // Check if already cached // if true, don't download repo / header files // else cache to tmp folder in package id folder @ cache path @@ -117,6 +129,8 @@ impl QPMRepository { // Download release .so and possibly debug .so to libs folder, if from github use token if available // Now it should be cached! + let config = &qpackage_config.config; + println!( "Checking cache for dependency {} {}", config.id.dependency_id_color(), @@ -134,216 +148,118 @@ impl QPMRepository { let lib_path = base_path.join("lib"); let tmp_path = base_path.join("tmp"); - let so_path = lib_path.join(config.get_so_name2()); - let debug_bin_name = config.get_so_name2().with_extension("debug.so"); - let debug_so_path = lib_path.join(debug_bin_name.file_name().unwrap()); + let qpkg_file_dst = src_path.join("qpm2.qpkg.json"); + let headers_dst = src_path.join("shared"); + let get_bin_dir_dst = |triplet_id: &TripletId| -> PathBuf { lib_path.join(&triplet_id.0) }; - let src_exists = src_path.join("qpm.shared.json").exists(); - if src_exists { - // ensure is valid - SharedPackageConfig::read(&src_path).with_context(|| { - format!( - "Failed to get config {}:{} in cache", - config.id.dependency_id_color(), - config.version.version_id_color() - ) - })?; + if QPackagesPackage::read(&src_path).is_ok() { + // already cached, no need to download again + return Ok(()); + } + + fs::create_dir_all(&base_path) + .with_context(|| format!("Failed to create lib path {base_path:?}"))?; + + if !lib_path.exists() { + fs::create_dir_all(&lib_path).context("Failed to create lib path")?; } // Downloads the repo / zip file into src folder w/ subfolder taken into account if !src_path.exists() { - // if the tmp path exists, but src doesn't, that's a failed cache, delete it and try again! - if tmp_path.exists() { - fs::remove_dir_all(&tmp_path).with_context(|| { - format!("Failed to remove existing tmp folder {tmp_path:?}") - })?; - } - // src did not exist, this means that we need to download the repo/zip file from packageconfig.url - fs::create_dir_all(&base_path) + fs::create_dir_all(&src_path) .with_context(|| format!("Failed to create lib path {base_path:?}"))?; - let url = config.url.as_ref().unwrap(); - if url.contains("github.com") { - // github url! - git::clone( - url.clone(), - config.additional_data.branch_name.as_ref(), - &tmp_path, - ) - .context("Clone")?; - } else { - // not a github url, assume it's a zip - let mut bytes = BytesMut::new().writer(); + } - download_file_report(url, &mut bytes, |_, _| {}) - .with_context(|| format!("Failed while downloading {}", url.blue()))?; + // if the tmp path exists, but src doesn't, that's a failed cache, delete it and try again! + if tmp_path.exists() { + fs::remove_dir_all(&tmp_path) + .with_context(|| format!("Failed to remove existing tmp folder {tmp_path:?}"))?; + } - let buffer = Cursor::new(bytes.get_ref()); + let qpkg_url = &qpackage_config.qpkg_url; + let mut bytes = BytesMut::new().writer(); - // Extract to tmp folder - ZipArchive::new(buffer) - .context("Reading zip")? - .extract(&tmp_path) - .context("Zip extraction")?; - } - // the only way the above if else would break is if someone put a link to a zip file on github in the url slot - // if you are reading this and think of doing that so I have to fix this, fuck you - - let sub_package_path = match &config.additional_data.sub_folder { - Some(sub_folder) => { - // the package exists in a subfolder of the downloaded thing, just move the subfolder to src - tmp_path.join(sub_folder) - } - _ => { - // the downloaded thing IS the package, just rename the folder to src - tmp_path.clone() - } - }; - - if sub_package_path.exists() { - // only log this on debug builds - #[cfg(debug_assertions)] - println!( - "Moving from: {}\nto: {}", - sub_package_path.display().bright_yellow(), - src_path.display().bright_yellow() - ); - - if src_path.exists() { - let mut line = String::new(); - println!( - "Confirm deletion of folder {}: (y/N)", - src_path.display().bright_yellow() - ); - std::io::stdin().read_line(&mut line)?; - if line.starts_with('y') || line.starts_with('Y') { - fs::remove_dir_all(&src_path) - .context("Failed to remove existing src folder")?; - } - } - // HACK: renaming seems to work, idk if it works for actual subfolders? - fs::rename(&sub_package_path, &src_path) - .context("Failed to move folder") - .with_suggestion(|| { - format!( - "Check if a process is locking the folder: \n{}", - sub_package_path.display().file_path_color() - ) - })?; - } else { - bail!( - "Failed to restore folder for this dependency\nif you have a token configured check if it's still valid\nIf it is, check if you can manually reach the repo" - ); - } + println!("Downloading {}", qpkg_url.file_path_color()); + download_file_report(&qpkg_url, &mut bytes, |_, _| {}) + .with_context(|| format!("Failed while downloading {}", qpkg_url.blue()))?; - // clear up tmp folder if it still exists - if tmp_path.exists() { - std::fs::remove_dir_all(tmp_path).context("Failed to remove tmp folder")?; - } - let downloaded_package = SharedPackageConfig::read(src_path); - - match downloaded_package { - Ok(downloaded_package) => - // check if downloaded config is the same version as expected, if not, panic - { - if downloaded_package.config.version != config.version { - bail!( - "Downloaded package ({}) version ({}) does not match expected version ({})!", - config.id.dependency_id_color(), - downloaded_package - .config - .version - .to_string() - .version_id_color(), - config.version.to_string().version_id_color(), - ) - } - } - - Err(e) => println!( - "Unable to validate shared package of {}:{} due to: \"{}\", continuing", - config.id.dependency_id_color(), - config.version.dependency_version_color(), - e.red() - ), - } - } + let buffer = Cursor::new(bytes.get_ref()); - if !lib_path.exists() { - fs::create_dir_all(&lib_path).context("Failed to create lib path")?; - } + // Extract to tmp folder + ZipArchive::new(buffer) + .context("Reading zip")? + .extract(&tmp_path) + .context("Zip extraction")?; - // libs didn't exist or the release object didn't exist, we need to download from packageconfig.additional_data.so_link and packageconfig.additional_data.debug_so_link - let download_binary = |path: &Path, url_opt: Option<&String>| -> Result<_> { - // only download if file doesn't exist already - if path.exists() { - #[cfg(debug_assertions)] - println!( - "{} already exists, skipping download", - path.display().bright_yellow() - ); - return Ok(()); - } - let Some(url) = url_opt else { return Ok(()) }; + let qpkg_file = QPkg::read(&tmp_path).with_context(|| { + format!( + "Failed to read QPkg file from {}", + tmp_path.display().file_path_color() + ) + })?; - let temp_path = path.with_added_extension("temp"); + // copy QPKG.qpm.json to {cache}/{id}/{version}/src/qpm2.qpkg.json + fs::copy(tmp_path.join(QPKG_JSON), &qpkg_file_dst).with_context(|| { + format!( + "Failed to copy QPkg file from {} to {}", + tmp_path.display().file_path_color(), + qpkg_file_dst.display().file_path_color() + ) + })?; - if temp_path.exists() { - std::fs::remove_file(&temp_path) - .with_context(|| format!("Failed to remove tmp file {temp_path:?}"))?; - } + // copy headers to src folder + fs::copy(tmp_path.join(qpkg_file.shared_dir), &headers_dst).with_context(|| { + format!( + "Failed to copy headers from {} to {}", + tmp_path.display().file_path_color(), + headers_dst.display().file_path_color() + ) + })?; - if !temp_path.exists() || File::open(&temp_path).is_err() { - println!( - "Downloading {} from {} to {}", - path.file_name() - .unwrap() - .to_string_lossy() - .download_file_name_color(), - url_opt.unwrap().version_id_color(), - path.as_os_str() - .to_string_lossy() - .alternate_dependency_version_color() - ); - // so_link existed, download - if url.contains("github.com") { - // github url! - git::get_release(url, &temp_path)?; - } else { - let mut file = BufWriter::new(File::create(&temp_path)?); - download_file_report(url, &mut file, |_, _| {}) - .context("Failed to write out downloaded bytes")?; - } + // copy binaries to lib folder + for (triplet_id, triplet_info) in &qpkg_file.triplets { + let bin_dir = get_bin_dir_dst(&triplet_id); + fs::create_dir_all(&bin_dir).with_context(|| { + format!( + "Failed to create bin dir {}", + bin_dir.display().file_path_color() + ) + })?; + + for file in &triplet_info.files { + let src_file = tmp_path.join(file); + let dst_file = bin_dir.join(file.file_name().unwrap()); + fs::copy(&src_file, &dst_file).with_context(|| { + format!( + "Failed to copy file from {} to {}", + src_file.display().file_path_color(), + dst_file.display().file_path_color() + ) + })?; } + } - std::fs::rename(&temp_path, path) - .with_context(|| format!("Unable to rename {temp_path:?} to {path:?}"))?; + // now write the package config to the src path + qpackage_config.config.write(&src_path).with_context(|| { + format!( + "Failed to write package config to {}", + src_path.display().file_path_color() + ) + })?; - if path.exists() { - #[cfg(debug_assertions)] - println!("{} downloaded successfully", path.display().bright_green()); - } + qpackage_config.write(&src_path).with_context(|| { + format!( + "Failed to write QPkg to {}", + src_path.display().file_path_color() + ) + })?; - Ok(()) - }; - - download_binary(&so_path, config.additional_data.so_link.as_ref())?; - download_binary( - &debug_so_path, - config.additional_data.debug_so_link.as_ref(), - )?; - - if config.additional_data.so_link.is_none() - && config.additional_data.debug_so_link.is_none() - && config.additional_data.static_link.is_none() - && !config.additional_data.headers_only.unwrap_or(false) - { - eprintln!( - "No binaries are provided for {}:{} but is also not header only!", - config.id.dependency_id_color(), - config.version.version_id_color() - ); + // clear up tmp folder if it still exists + if tmp_path.exists() { + std::fs::remove_dir_all(tmp_path).context("Failed to remove tmp folder")?; } + Ok(()) } } @@ -366,18 +282,27 @@ impl Repository for QPMRepository { Ok(versions) } - fn get_package(&self, id: &DependencyId, version: &Version) -> Result> { - let config = Self::get_shared_package(id, version)?; + fn get_package(&self, id: &DependencyId, version: &Version) -> Result> { + let config = Self::get_qpackage(id, version)?; - Ok(config) + Ok(config.map(|qpackage| qpackage.config)) } - fn add_to_db_cache(&mut self, _config: SharedPackageConfig, _permanent: bool) -> Result<()> { + fn add_to_db_cache(&mut self, _config: PackageConfig, _permanent: bool) -> Result<()> { Ok(()) } fn download_to_cache(&mut self, config: &PackageConfig) -> Result { - self.download_package(config).with_context(|| { + let qpackage = + QPMRepository::get_qpackage(&config.id, &config.version)?.with_context(|| { + format!( + "Failed to get QPackage for {}:{}", + config.id.dependency_id_color(), + config.version.version_id_color() + ) + })?; + + self.download_package(&qpackage).with_context(|| { format!( "QPackages {}:{}", config.id.dependency_id_color(), diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index 7124dac..55842eb 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -24,7 +24,7 @@ use pubgrub::{ use qpm_package::models::{ package::{DependencyId, PackageConfig}, shared_package::{SharedPackageConfig, SharedTriplet}, - triplet::TripletId, + triplet::{PackageTriplet, TripletId}, }; pub struct PackageDependencyResolver<'a, 'b, R> where @@ -49,6 +49,16 @@ impl Display for PubgrubDependencyTarget { } } +impl PackageDependencyResolver<'_, '_, R> { + pub fn get_triplet_config(&self) -> &PackageTriplet { + self.root + .triplets + .specific_triplets + .get(self.root_triplet) + .expect("Root triplet should always exist in the root package's triplets") + } +} + impl DependencyProvider for PackageDependencyResolver<'_, '_, R> { type P = PubgrubDependencyTarget; type V = VersionWrapper; @@ -115,14 +125,21 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> ) })?; + let is_dep_exported = |dep_id: &DependencyId| { + self.get_triplet_config() + .dependencies + .get(dep_id) + .is_some_and(|dep| dep.export) + }; + let deps = target_triplet .restored_dependencies .iter() // remove any private dependencies from the list - .filter(|(_, dep)| !dep.triplet.export) + .filter(|(dep_id, _)| is_dep_exported(dep_id)) .map(|(dep_id, dep)| { - let id = PubgrubDependencyTarget(dep_id.clone(), dep.triplet.triplet.clone()); - let range = req_to_range(dep.triplet.version_range.clone()); + let id = PubgrubDependencyTarget(dep_id.clone(), dep.restored_triplet.clone()); + let range = req_to_range(dep.version_range.clone()); (id, range) }) .collect(); @@ -221,10 +238,10 @@ pub fn resolve<'a>( pub fn restore>( workspace: P, shared_package: &SharedPackageConfig, - resolved_deps: &[SharedPackageConfig], + resolved_deps: &[(SharedPackageConfig, TripletId)], repository: &mut impl Repository, ) -> Result<()> { - for dep in resolved_deps { + for (dep, dep_triplet) in resolved_deps { println!( "Pulling {}:{}", &dep.config.id.0.dependency_id_color(), @@ -254,25 +271,25 @@ pub fn locked_resolve<'a, R: Repository>( root: &'a SharedPackageConfig, repository: &'a R, triplet: &'a SharedTriplet, -) -> Result + 'a> { +) -> Result + 'a> { // TODO: ensure restored dependencies take precedence over - Ok(triplet - .restored_dependencies - .iter() - .map(|(dep_id, dep)| { - repository - .get_package(&dep_id, &dep.restored_version) - .unwrap_or_else(|e| { - panic!( - "Encountered an issue resolving for package {}:{}, {e}", - dep_id.0, dep.restored_version - ) - }) - .unwrap_or_else(|| { - panic!("No package found for {}:{}", dep_id.0, dep.restored_version) - }) - }) - .dedup_by(|x, y| x.config.id == y.config.id)) + let packages = triplet.restored_dependencies.iter().map(|(dep_id, dep)| { + let shared_package = repository + .get_package(&dep_id, &dep.restored_version) + .unwrap_or_else(|e| { + panic!( + "Encountered an issue resolving for package {}:{} {e:#?}", + dep_id.0, dep.restored_version + ) + }) + .unwrap_or_else(|| { + panic!("No package found for {}:{}", dep_id.0, dep.restored_version) + }); + + (shared_package, dep.restored_triplet.clone()) + }); + + Ok(packages) } pub struct PubgrubErrorWrapper(color_eyre::Report); diff --git a/src/utils/git.rs b/src/utils/git.rs index ad97ce0..1e99e25 100644 --- a/src/utils/git.rs +++ b/src/utils/git.rs @@ -1,3 +1,7 @@ +use std::{fs::File, io::{BufReader, BufWriter}, path::Path, process::{Command, Stdio}}; + +use color_eyre::{eyre::{bail, Context, Result}, Section}; +use owo_colors::OwoColorize; use serde::{Deserialize, Serialize}; use crate::{ @@ -6,7 +10,7 @@ use crate::{ terminal::colors::QPMColor, }; -pub fn check_git() -> Result<()> { +pub fn check_git() -> color_eyre::Result<()> { let mut git = std::process::Command::new("git"); git.arg("--version"); @@ -36,7 +40,7 @@ pub fn check_git() -> Result<()> { } } -pub fn get_release(url: &str, out: &std::path::Path) -> Result { +pub fn get_release(url: &str, out: &std::path::Path) -> color_eyre::Result { check_git()?; if let Ok(token_unwrapped) = get_keyring().get_password() { get_release_with_token(url, out, &token_unwrapped) @@ -45,7 +49,7 @@ pub fn get_release(url: &str, out: &std::path::Path) -> Result { } } -pub fn get_release_without_token(url: &str, out: &std::path::Path) -> Result { +pub fn get_release_without_token(url: &str, out: &std::path::Path) -> color_eyre::Result { let file = File::create(out).context("create so file failed")?; let mut buf = BufWriter::new(file); From 8de6b6061a8a730c015777bdb9ecdb26daec9641 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 25 Jul 2025 00:55:40 -0400 Subject: [PATCH 010/119] Update QPM.Package source reference to latest commit in qpm2 branch --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index e5dc890..dcc0e8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2550,7 +2550,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#aa1e4c39f455fa2e77feb2b7d0f04c8e5b689a2f" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#d998ceed4345864562e78fd6b18981f55fb695bc" dependencies = [ "cursed-semver-parser", "schemars", From 3df9c183e50ee37a2790007265d36caf9c08d574 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 25 Jul 2025 11:39:24 -0400 Subject: [PATCH 011/119] Add checksum check --- Cargo.lock | 21 ++++++++++++++++++++- Cargo.toml | 2 ++ src/repository/qpackages.rs | 16 ++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index dcc0e8b..5e0fb42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1647,6 +1647,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "home" version = "0.5.11" @@ -2521,6 +2527,7 @@ dependencies = [ "cursed-semver-parser", "dirs", "fs_extra", + "hex", "itertools", "keyring", "openssl", @@ -2539,6 +2546,7 @@ dependencies = [ "serde", "serde-xml-rs", "serde_json", + "sha2", "symlink", "tempfile", "templatr", @@ -2550,7 +2558,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#d998ceed4345864562e78fd6b18981f55fb695bc" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#14a28cb4ceb509dbaaba9f9b5543d4191d575aa7" dependencies = [ "cursed-semver-parser", "schemars", @@ -2992,6 +3000,17 @@ dependencies = [ "sha1", ] +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sharded-slab" version = "0.1.7" diff --git a/Cargo.toml b/Cargo.toml index ceb0963..3fbfb33 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -94,6 +94,8 @@ symlink = "0.1.0" fs_extra = "1.2" itertools = "0.14" schemars = { version = "0.8", features = ["semver"] } +sha2 = "0.10.9" +hex = "0.4.3" [target.aarch64-apple-darwin.dependencies] # Allow cross compiles diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 14ef511..9ca1d09 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -7,6 +7,7 @@ use itertools::Itertools; use owo_colors::OwoColorize; use reqwest::StatusCode; use semver::Version; +use sha2::{Digest, Sha256}; use std::{ fs::{self, File}, io::{BufWriter, Cursor}, @@ -186,6 +187,21 @@ impl QPMRepository { let buffer = Cursor::new(bytes.get_ref()); + // Ensure checksum matches + if let Some(checksum) = &qpackage_config.qpkg_checksum { + let result = Sha256::digest(buffer.get_ref()); + let hash_hex = hex::encode(result); + + if !hash_hex.eq_ignore_ascii_case(checksum) { + bail!( + "Checksum mismatch for {}: expected {}, got {}", + qpkg_url.blue(), + checksum, + hash_hex + ); + } + } + // Extract to tmp folder ZipArchive::new(buffer) .context("Reading zip")? From 76a4cc541aa46ddeac4a01a82ca5f3f610d3b388 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 25 Jul 2025 18:43:50 -0400 Subject: [PATCH 012/119] More progress towards implementing triplets and QMods --- Cargo.lock | 2 +- src/commands/install.rs | 77 +---------- src/models/package.rs | 261 +++++++++++++++++-------------------- src/models/toolchain.rs | 28 ++-- src/repository/local.rs | 20 +-- src/resolver/dependency.rs | 75 ++++++----- 6 files changed, 188 insertions(+), 275 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5e0fb42..821233d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2558,7 +2558,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#14a28cb4ceb509dbaaba9f9b5543d4191d575aa7" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#fcfaffbddf46a5cfb3c168c04bb14adf3743b22e" dependencies = [ "cursed-semver-parser", "schemars", diff --git a/src/commands/install.rs b/src/commands/install.rs index 9a99166..ae4eae5 100644 --- a/src/commands/install.rs +++ b/src/commands/install.rs @@ -3,7 +3,8 @@ use std::path::PathBuf; use clap::Args; use color_eyre::eyre::Context; use qpm_package::{ - extensions::package_metadata::PackageMetadataExtensions, models::{package::PackageConfig, shared_package::SharedPackageConfig}, + extensions::package_metadata::PackageMetadataExtensions, + models::{package::PackageConfig, shared_package::SharedPackageConfig}, }; use crate::{ @@ -15,20 +16,10 @@ use super::Command; #[derive(Args, Debug, Clone)] pub struct InstallCommand { - pub binary_path: Option, - pub debug_binary_path: Option, - - #[clap(long)] - pub cmake_build: Option, - - #[clap(default_value = "false", long, short)] - pub locked: bool, // pub additional_folders: Vec // todo - #[clap(long, default_value = "false")] offline: bool, - #[clap(long, default_value = "false")] - pub update: bool, // pub additional_folders: Vec // todo + pub binaries: Option>, } impl Command for InstallCommand { @@ -37,71 +28,13 @@ impl Command for InstallCommand { let package = PackageConfig::read(".")?; let repo = repository::useful_default_new(self.offline)?; - let shared_package = match !self.update { - true => SharedPackageConfig::read(".")?, - false => SharedPackageConfig::resolve_from_package(package, &repo)?.0, - }; - - if self.update { - println!("Not using lock file, updating dependencies and writing!"); - shared_package.write(".")?; - } else { - println!("Using lock file"); - } - - let mut binary_path = self.binary_path; - let mut debug_binary_path = self.debug_binary_path; - - let header_only = shared_package - .config - - .additional_data - .headers_only - .unwrap_or(false); - #[cfg(debug_assertions)] - println!("Header only: {header_only}"); - - // TODO: Handle static library - if !header_only { - if binary_path.is_none() && self.cmake_build.unwrap_or(true) { - binary_path = Some( - PathBuf::from(format!( - "./build/{}", - shared_package.config.get_so_name().file_name().unwrap().to_string_lossy() - )) - .canonicalize().context("Failed to retrieve release binary for publishing since it is not header only")?, - ); - } - - if debug_binary_path.is_none() && self.cmake_build.unwrap_or(true) { - debug_binary_path = Some( - PathBuf::from(format!( - "./build/debug/{}", - shared_package.config.get_so_name().file_name().unwrap().to_string_lossy() - )) - .canonicalize().context("Failed to retrieve debug binary for publishing since it is not header only")?, - ); - } - } - - if let Some(p) = &debug_binary_path - && !p.exists() - { - println!("Could not find debug binary {p:?}, skipping") - } - - if let Some(p) = &binary_path - && !p.exists() - { - println!("Could not find binary {p:?}, skipping") - } + let shared_package = SharedPackageConfig::read(".")?; let mut file_repo = FileRepository::read()?; file_repo.add_artifact_and_cache( shared_package, PathBuf::from(".").canonicalize()?, - binary_path, - debug_binary_path, + self.binaries.unwrap_or_default(), true, true, )?; diff --git a/src/models/package.rs b/src/models/package.rs index 3ab865c..cd40696 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -8,16 +8,21 @@ use std::{ use color_eyre::{Result, Section, eyre::Context, owo_colors::OwoColorize}; use itertools::Itertools; use qpm_package::models::{ - package::{PackageConfig, QPM_JSON}, + package::{DependencyId, PackageConfig, QPM_JSON}, shared_package::{ - SharedPackageConfig, SharedTriplet, SharedTripletDependencyInfo, QPM_SHARED_JSON + QPM_SHARED_JSON, SharedPackageConfig, SharedTriplet, SharedTripletDependencyInfo, }, - triplet::{PackageTriplet, TripletId}, + triplet::{PackageTriplet, PackageTripletDependency, TripletId}, }; use qpm_qmod::models::mod_json::{ModDependency, ModJson}; use semver::VersionReq; +use serde::de; -use crate::{repository::Repository, resolver::dependency::resolve, utils::json}; +use crate::{ + repository::Repository, + resolver::dependency::{ResolvedDependency, resolve}, + utils::json, +}; use super::{ schemas::{SchemaLinks, WithSchema}, @@ -43,14 +48,13 @@ pub trait SharedPackageConfigExtensions: Sized { fn resolve_from_package( config: PackageConfig, repository: &impl Repository, - ) -> Result<( - Self, - HashMap>, - )>; + ) -> Result<(Self, HashMap>)>; - fn to_mod_json(self, triplet: &TripletId) -> ModJson; + fn to_mod_json(self, repo: &impl Repository) -> ModJson; fn try_write_toolchain(&self, repo: &impl Repository) -> Result<()>; + + fn get_restored_triplet(&self) -> &SharedTriplet; } impl PackageConfigExtensions for PackageConfig { @@ -157,167 +161,133 @@ impl PackageConfigExtensions for SharedPackageConfig { } } -pub struct ResolvedDependency { - pub dependencies: SharedPackageConfig, - pub restored_triplet: TripletId, +struct DependencyBundle<'a> { + triplet: &'a TripletId, + + dep_config: PackageConfig, + dep_triplet: PackageTriplet, + + shared_restored_triplet: &'a SharedTripletDependencyInfo, + restored_triplet: &'a PackageTripletDependency, } impl SharedPackageConfigExtensions for SharedPackageConfig { + /// Resolve dependencies from the package config and repository + /// Returns a tuple of the SharedPackageConfig and a map of triplet IDs to resolved fn resolve_from_package( config: PackageConfig, repository: &impl Repository, - ) -> Result<( - Self, - HashMap>, - )> { - let triplet_dependencies: HashMap> = - config - .triplets - .specific_triplets - .iter() - .map(|(triplet_id, triplet)| -> color_eyre::Result<_> { - let resolved = resolve(&config, repository, triplet_id)?.collect_vec(); - - Ok((triplet_id.clone(), resolved)) - }) - .try_collect()?; - - Ok(( - SharedPackageConfig { - config, - restored_triplet: Default::default(), - locked_triplet: triplet_dependencies + ) -> Result<(Self, HashMap>)> { + // for each triplet, resolve the dependencies + let triplet_dependencies: HashMap = config + .triplets + .specific_triplets + .iter() + .map(|(triplet_id, _triplet)| -> color_eyre::Result<_> { + let resolved = resolve(&config, repository, triplet_id)?.collect_vec(); + + Ok((triplet_id.clone(), resolved)) + }) + .try_collect()?; + + let locked_triplet = triplet_dependencies + .iter() + .map(|(package_triplet, dependencies)| { + // For each dependency, get the package config and triplet settings + let restored_dependencies = dependencies .iter() - .map(|(package_triplet, dependencies)| { - ( - package_triplet.clone(), - SharedTriplet { - restored_dependencies: dependencies - .iter() - .map(|(dep, dep_triplet)| { - ( - dep.config.id.clone(), - SharedTripletDependencyInfo { - restored_version: dep.config.version.clone(), - restored_triplet: dep_triplet.clone(), - }, - ) - }) - .collect(), - }, - ) + .map(|resolved_dep| { + let shared_triplet_dependency_info = SharedTripletDependencyInfo { + restored_version: resolved_dep.0.version.clone(), + restored_triplet: resolved_dep.1.clone(), + }; + (resolved_dep.0.id.clone(), shared_triplet_dependency_info) }) - .collect(), - }, - triplet_dependencies, - )) + .collect(); + let shared_triplet = SharedTriplet { + restored_dependencies, + }; + + (package_triplet.clone(), shared_triplet) + }) + .collect(); + + let shared_package_config = SharedPackageConfig { + config, + restored_triplet: Default::default(), + locked_triplet, + }; + Ok((shared_package_config, triplet_dependencies)) } - fn to_mod_json(self, triplet: &TripletId) -> ModJson { + fn to_mod_json(self, repo: &impl Repository) -> ModJson { // Self { // id: dep.id, // version_range: dep.version_range, // mod_link: dep.additional_data.mod_link, // } - let local_deps = &self.config.triplets.specific_triplets[triplet]; - - // Only bundle mods that are not specifically excluded in qpm.json or if they're not header-only - let restored_deps: Vec<_> = self - .restored_dependencies - .iter() - .filter(|dep| { - let local_dep_opt = local_deps - .iter() - .find(|local_dep| local_dep.id == dep.dependency.id); - - if let Some(local_dep) = local_dep_opt { - // if force included/excluded, return early - if let Some(force_included) = local_dep.additional_data.include_qmod { - return force_included; - } - } - - // or if header only is false - dep.dependency.additional_data.mod_link.is_some() - || !dep.dependency.additional_data.headers_only.unwrap_or(false) - }) - .collect(); - // List of dependencies we are directly referencing in qpm.json - let direct_dependencies: HashSet = self + let package_triplet = self .config + .triplets + .get_triplet_settings(&self.restored_triplet) + .expect("Triplet should exist"); + + let direct_dependencies: HashMap = package_triplet .dependencies .iter() - .map(|f| f.id.clone()) + .filter_map(|(dep_id, dep_triplet)| { + // get the restored dependency info + let shared_dep_triplet = self + .get_restored_triplet() + .restored_dependencies + .get(dep_id)?; + + // get the package config for the dependency + let dep_package = repo + .get_package(&dep_id, &shared_dep_triplet.restored_version) + .expect("Failed to get package") + .expect("Package should exist in repository"); + + // get the triplet settings for the dependency + let dep_package_triplet = dep_package + .triplets + .get_triplet_settings(&shared_dep_triplet.restored_triplet) + .expect("Triplet should exist in package"); + + let result = DependencyBundle { + triplet: &shared_dep_triplet.restored_triplet, + + shared_restored_triplet: shared_dep_triplet, + restored_triplet: dep_triplet, + + // grabbed from repo + dep_config: dep_package, + dep_triplet: dep_package_triplet, + }; + Some((dep_id.clone(), result)) + }) .collect(); // downloadable mods links n stuff // mods that are header-only but provide qmods can be added as deps // Must be directly referenced in qpm.json - let mods: Vec = local_deps + let mods: Vec = direct_dependencies .iter() // Removes any dependency without a qmod link - .filter_map(|dep| { - let shared_dep = restored_deps.iter().find(|d| d.dependency.id == dep.id)?; - if shared_dep.dependency.additional_data.mod_link.is_some() { - return Some((shared_dep, dep)); - } - - None - }) - .map(|(shared_dep, dep)| ModDependency { - version_range: dep.version_range.clone(), - id: dep.id.clone(), - mod_link: shared_dep.dependency.additional_data.mod_link.clone(), - required: dep.additional_data.required, - }) - .collect(); - - // The rest of the mods to handle are not qmods, they are .so or .a mods - // actual direct lib deps - let libs: Vec = self - .restored_dependencies - .iter() - // We could just query the bmbf core mods list on GH? - // https://github.com/BMBF/resources/blob/master/com.beatgames.beatsaber/core-mods.json - // but really the only lib that never is copied over is the modloader, the rest is either a downloaded qmod or just a copied lib - // even core mods should technically be added via download - .filter(|lib| { - // find the actual dependency for the include qmod value - let local_dep_opt = local_deps - .iter() - .find(|local_dep| local_dep.id == lib.dependency.id); - - // if set, use it later - - let include_qmod = local_dep_opt - .and_then(|local_dep| local_dep.additional_data.include_qmod.as_ref()); - - // Must be directly referenced in qpm.json - direct_dependencies.contains(&lib.dependency.id) && - - // keep if header only is false, or if not defined - !lib.dependency.additional_data.headers_only.unwrap_or(false) && - - // Modloader should never be included - lib.dependency.id != "modloader" && - - // don't include static deps - !lib.dependency.additional_data.static_linking.unwrap_or(false) && - - // it's marked to be included, defaults to including ( same as dependencies with qmods ) - include_qmod.copied().unwrap_or(true) && - - // Only keep libs that aren't downloadable - !mods.iter().any(|dep| lib.dependency.id == dep.id) + .filter(|(dep_package, result)| result.dep_triplet.qmod_url.is_some()) + .map(|(dep_config, result)| ModDependency { + version_range: result.restored_triplet.version_range.clone(), + id: result.dep_config.id.0.clone(), + mod_link: result.dep_triplet.qmod_url.clone(), + required: result.restored_triplet.qmod_required, }) - .map(|dep| dep.get_so_name().to_str().unwrap().to_string()) .collect(); ModJson { - name: self.config.name.clone(), - id: self.config.id.clone(), + name: self.config.id.0.clone(), + id: self.config.id.0.clone(), porter: None, version: self.config.version.to_string(), package_id: None, @@ -326,15 +296,14 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { cover_image: None, is_library: None, dependencies: mods, - // TODO: Change - late_mod_files: vec![self.config.get_so_name().to_str().unwrap().to_string()], - library_files: libs, + late_mod_files: vec![], + library_files: vec![], ..Default::default() } } fn try_write_toolchain(&self, repo: &impl Repository) -> Result<()> { - let Some(toolchain_path) = self.config.additional_data.toolchain_out.as_ref() else { + let Some(toolchain_path) = self.config.toolchain_out.as_ref() else { return Ok(()); }; @@ -342,4 +311,10 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { Ok(()) } + + fn get_restored_triplet(&self) -> &SharedTriplet { + self.locked_triplet + .get(&self.restored_triplet) + .expect("Restored triplet should exist in locked triplet map") + } } diff --git a/src/models/toolchain.rs b/src/models/toolchain.rs index a455046..6b8c450 100644 --- a/src/models/toolchain.rs +++ b/src/models/toolchain.rs @@ -1,18 +1,18 @@ use std::{fs::File, path::PathBuf}; use color_eyre::eyre::Result; -use qpm_package::models::shared_package::SharedPackageConfig; +use qpm_package::models::{extra::PackageTripletCompileOptions, shared_package::SharedPackageConfig}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::repository::Repository; +use crate::{models::package::SharedPackageConfigExtensions, repository::Repository}; use super::schemas::{SchemaLinks, WithSchema}; #[derive(Serialize, JsonSchema, Deserialize, Debug, Default, Clone)] pub struct ToolchainData { /// Compile options - pub compile_options: CompileOptions, + pub compile_options: PackageTripletCompileOptions, /// Path to the extern directory pub extern_dir: PathBuf, @@ -25,16 +25,17 @@ pub fn write_toolchain_file( ) -> Result<()> { let extern_dir = &shared_config.config.dependencies_directory.display(); let compile_options = shared_config + .get_restored_triplet() .restored_dependencies .iter() - .filter_map(|s| { - let shared_config = repo.get_package(&s.dependency.id, &s.version).ok()??; - - let package_id = &shared_config.config.id; + .filter_map(|(dep_id, dep_triplet)| { + let dep_config = repo.get_package(&dep_id, &dep_triplet.restored_version).ok()??; + let dep_triplet_config = dep_config.triplets.get_triplet_settings(&dep_triplet.restored_triplet)?; + let package_id = &dep_config.id; let prepend_path = |dir: &String| format!("{extern_dir}/includes/{package_id}/{dir}"); - let mut compile_options = shared_config.config.additional_data.compile_options?; + let mut compile_options = dep_triplet_config.compile_options?; // prepend path compile_options.include_paths = compile_options @@ -46,7 +47,7 @@ pub fn write_toolchain_file( Some(compile_options) }) - .fold(CompileOptions::default(), |acc, x| { + .fold(PackageTripletCompileOptions::default(), |acc, x| { let c_flags: Vec = acc .c_flags .unwrap_or_default() @@ -72,19 +73,12 @@ pub fn write_toolchain_file( .into_iter() .chain(x.system_includes.unwrap_or_default()) .collect(); - let cpp_features: Vec = acc - .cpp_features - .unwrap_or_default() - .into_iter() - .chain(x.cpp_features.unwrap_or_default()) - .collect(); - CompileOptions { + PackageTripletCompileOptions { c_flags: Some(c_flags), cpp_flags: Some(cpp_flags), include_paths: Some(include_paths), system_includes: Some(system_includes), - cpp_features: Some(cpp_features), } }); diff --git a/src/repository/local.rs b/src/repository/local.rs index 9673652..bc0de53 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -26,6 +26,7 @@ use crate::{ package::PackageConfigExtensions, schemas::{SchemaLinks, WithSchema}, }, + resolver::dependency::ResolvedDependency, terminal::colors::QPMColor, utils::{fs::copy_things, json}, }; @@ -101,19 +102,12 @@ impl FileRepository { &mut self, package: SharedPackageConfig, project_folder: PathBuf, - binary_path: Option, - debug_binary_path: Option, + binaries: Vec, copy: bool, overwrite_existing: bool, ) -> Result<()> { if copy { - Self::copy_to_cache( - &package, - project_folder, - binary_path, - debug_binary_path, - false, - )?; + Self::copy_to_cache(&package, project_folder, binaries, false)?; } self.add_artifact_to_map(package, overwrite_existing)?; @@ -123,8 +117,8 @@ impl FileRepository { fn copy_to_cache( package: &SharedPackageConfig, project_folder: PathBuf, - binary_path: Option, - debug_binary_path: Option, + binaries: Vec, + validate: bool, ) -> Result<()> { println!( @@ -273,7 +267,7 @@ impl FileRepository { pub fn copy_from_cache( package: &PackageConfig, - restored_deps: &[(SharedPackageConfig, TripletId)], + restored_deps: &[ResolvedDependency], workspace_dir: &Path, ) -> Result<()> { let files = Self::collect_deps(package, restored_deps, workspace_dir)?; @@ -423,7 +417,7 @@ impl FileRepository { /// Returns a map of source paths to target paths for the dependencies. pub fn collect_deps( package: &PackageConfig, - restored_deps: &[(SharedPackageConfig, TripletId)], + restored_deps: &[ResolvedDependency], workspace_dir: &Path, ) -> Result> { // let package = shared_package.config; diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index 55842eb..7f52b3c 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -16,7 +16,6 @@ use color_eyre::{ Result, eyre::{Context, ContextCompat, bail}, }; -use itertools::Itertools; use pubgrub::{ DefaultStringReporter, Dependencies, DependencyProvider, PackageResolutionStatistics, PubGrubError, Reporter, @@ -24,8 +23,23 @@ use pubgrub::{ use qpm_package::models::{ package::{DependencyId, PackageConfig}, shared_package::{SharedPackageConfig, SharedTriplet}, - triplet::{PackageTriplet, TripletId}, + triplet::{PackageTriplet, PackageTripletDependency, PackageTripletsConfig, TripletId}, }; + +/// Represents a resolved dependency +/// A tuple of (PackageConfig, TripletId) +pub struct ResolvedDependency(pub PackageConfig, pub TripletId); + +impl ResolvedDependency { + fn get_triplet_settings(&self) -> &PackageTriplet { + self.0 + .triplets + .specific_triplets + .get(&self.1) + .expect("Triplet should always exist in the package's triplets") + } +} + pub struct PackageDependencyResolver<'a, 'b, R> where R: Repository, @@ -34,7 +48,6 @@ where root_triplet: &'a TripletId, repo: &'b R, } - #[derive(Clone, Debug, Eq, PartialEq, Hash)] struct PubgrubDependencyTarget(pub DependencyId, pub TripletId); @@ -96,6 +109,8 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> let deps = triplet .dependencies .iter() + // add dev dependencies as well + .chain(triplet.dev_dependencies.iter()) .map(|(dep_id, dep)| { let pubgrub_dep = PubgrubDependencyTarget(dep_id.clone(), dep.triplet.clone()); @@ -115,8 +130,8 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> })?; let target_triplet = target_pkg - .locked_triplet - .get(&package_triplet.1) + .triplets + .get_triplet_settings(&package_triplet.1) .with_context(|| { format!( "Could not find triplet {} for package {}", @@ -125,20 +140,11 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> ) })?; - let is_dep_exported = |dep_id: &DependencyId| { - self.get_triplet_config() - .dependencies - .get(dep_id) - .is_some_and(|dep| dep.export) - }; - let deps = target_triplet - .restored_dependencies + .dependencies .iter() - // remove any private dependencies from the list - .filter(|(dep_id, _)| is_dep_exported(dep_id)) .map(|(dep_id, dep)| { - let id = PubgrubDependencyTarget(dep_id.clone(), dep.restored_triplet.clone()); + let id = PubgrubDependencyTarget(dep_id.clone(), dep.triplet.clone()); let range = req_to_range(dep.version_range.clone()); (id, range) }) @@ -199,11 +205,14 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> } } +/// Resolve dependencies for a package using pubgrub +/// This will return an iterator of resolved dependencies +/// The iterator will return every dependency required by the package + triplet pub fn resolve<'a>( root: &'a PackageConfig, repository: &'a impl Repository, triplet: &TripletId, -) -> Result + 'a> { +) -> Result + 'a> { let resolver = PackageDependencyResolver { root, root_triplet: triplet, @@ -216,9 +225,12 @@ pub fn resolve<'a>( if id.0 == root.id && version == root.version { return None; } + - let package = repository.get_package(&id.0, &version.into()).unwrap()?; - Some((package, id.1)) + let package = repository + .get_package(&id.0, &version.into()) + .expect("Failed to get package")?; + Some(ResolvedDependency(package, id.1)) })), Err(PubGrubError::NoSolution(tree)) => { @@ -235,23 +247,28 @@ pub fn resolve<'a>( result } +/// Restore dependencies for a package +/// This will download the dependencies to the cache and copy them to the workspace +/// It will also generate the toolchain JSON file if specified +/// Returns an error if any dependency fails to download or copy pub fn restore>( workspace: P, shared_package: &SharedPackageConfig, - resolved_deps: &[(SharedPackageConfig, TripletId)], + resolved_deps: &[ResolvedDependency], repository: &mut impl Repository, ) -> Result<()> { - for (dep, dep_triplet) in resolved_deps { + for ResolvedDependency(dep, dep_triplet) in resolved_deps { println!( - "Pulling {}:{}", - &dep.config.id.0.dependency_id_color(), - &dep.config.version.to_string().dependency_version_color() + "Pulling {}:{} ({})", + &dep.id.0.dependency_id_color(), + &dep.version.to_string().dependency_version_color(), + dep_triplet.0.triplet_id_color() ); - repository.download_to_cache(&dep.config).with_context(|| { + repository.download_to_cache(&dep).with_context(|| { format!( "Requesting {}:{}", - dep.config.id.0.dependency_id_color(), - dep.config.version.version_id_color() + dep.id.0.dependency_id_color(), + dep.version.version_id_color() ) })?; repository.add_to_db_cache(dep.clone(), true)?; @@ -271,7 +288,7 @@ pub fn locked_resolve<'a, R: Repository>( root: &'a SharedPackageConfig, repository: &'a R, triplet: &'a SharedTriplet, -) -> Result + 'a> { +) -> Result + 'a> { // TODO: ensure restored dependencies take precedence over let packages = triplet.restored_dependencies.iter().map(|(dep_id, dep)| { let shared_package = repository @@ -286,7 +303,7 @@ pub fn locked_resolve<'a, R: Repository>( panic!("No package found for {}:{}", dep_id.0, dep.restored_version) }); - (shared_package, dep.restored_triplet.clone()) + ResolvedDependency(shared_package, dep.restored_triplet.clone()) }); Ok(packages) From cbff5ce198a315ef6efa4725924347645ecb8fa5 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 25 Jul 2025 19:57:11 -0400 Subject: [PATCH 013/119] Refactor package path handling in FileRepository --- Cargo.lock | 2 +- src/commands/install.rs | 18 ++- src/models/mod.rs | 4 +- src/models/package_files.rs | 102 +++++++++++++++ src/repository/local.rs | 222 ++++++++++++--------------------- src/repository/qpackages.rs | 48 +++---- src/tests/network/qpackages.rs | 4 +- 7 files changed, 214 insertions(+), 186 deletions(-) create mode 100644 src/models/package_files.rs diff --git a/Cargo.lock b/Cargo.lock index 821233d..6a9a74e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2558,7 +2558,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#fcfaffbddf46a5cfb3c168c04bb14adf3743b22e" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#b99e8044a313468956198527afef08b2295b14fd" dependencies = [ "cursed-semver-parser", "schemars", diff --git a/src/commands/install.rs b/src/commands/install.rs index ae4eae5..9a8dfc4 100644 --- a/src/commands/install.rs +++ b/src/commands/install.rs @@ -26,18 +26,26 @@ impl Command for InstallCommand { fn execute(self) -> color_eyre::Result<()> { println!("Publishing package to local file repository"); - let package = PackageConfig::read(".")?; + // let package = PackageConfig::read(".")?; let repo = repository::useful_default_new(self.offline)?; let shared_package = SharedPackageConfig::read(".")?; + let project_folder = PathBuf::from(".").canonicalize()?; + let mut file_repo = FileRepository::read()?; + FileRepository::copy_to_cache( + &shared_package.config, + &shared_package.restored_triplet, + project_folder, + self.binaries.clone().unwrap_or_default(), + false, + )?; + file_repo.add_artifact_and_cache( - shared_package, - PathBuf::from(".").canonicalize()?, - self.binaries.unwrap_or_default(), - true, + shared_package.config, true, )?; + file_repo.write()?; Ok(()) } diff --git a/src/models/mod.rs b/src/models/mod.rs index 673b106..09e89bc 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -5,4 +5,6 @@ pub mod package; pub(crate) mod schemas; pub mod toolchain; pub mod qpkg; -pub mod qpackages; \ No newline at end of file +pub mod qpackages; + +pub mod package_files; \ No newline at end of file diff --git a/src/models/package_files.rs b/src/models/package_files.rs new file mode 100644 index 0000000..183c18c --- /dev/null +++ b/src/models/package_files.rs @@ -0,0 +1,102 @@ +use std::{ops::Deref, path::PathBuf}; + +use qpm_package::models::{ + package::{DependencyId, QPM_JSON}, + qpkg::QPKG_JSON, + triplet::TripletId, +}; +use semver::Version; + +use crate::models::config::UserConfig; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct PackageIdPath(pub DependencyId); +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct PackageVersionPath(pub PackageIdPath, pub Version); +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct PackageTripletPath(pub PackageVersionPath, pub TripletId); + +impl PackageIdPath { + pub fn new(id: DependencyId) -> Self { + Self(id) + } + + pub fn version(self, version: Version) -> PackageVersionPath { + PackageVersionPath(self, version) + } + + pub fn versions_path(&self) -> PathBuf { + let combine = UserConfig::read_combine().unwrap(); + let cache = combine.cache.as_ref().unwrap(); + cache.join(&self.0.to_string()) + } +} + +impl PackageVersionPath { + pub fn new(id: DependencyId, version: Version) -> Self { + Self(PackageIdPath::new(id), version) + } + + pub fn triplet(self, triplet: TripletId) -> PackageTripletPath { + PackageTripletPath(self, triplet) + } + + /// Returns the base path for the package version, which includes the triplet. + /// cache/{id}/{version} + pub fn base_path(&self) -> PathBuf { + self.versions_path().join(self.1.to_string()) + } + + /// Returns the path to the source files for the package version. + /// cache/{id}/{version}/src + pub fn src_path(&self) -> PathBuf { + self.base_path().join("src") + } + + pub fn qpm_json_path(&self) -> PathBuf { + self.base_path().join(QPM_JSON) + } + pub fn qpkg_json_path(&self) -> PathBuf { + self.base_path().join(QPKG_JSON) + } + + /// Returns the path to the temporary files for the package version. + /// cache/{id}/{version}/tmp + pub fn tmp_path(&self) -> PathBuf { + self.base_path().join("tmp") + } +} + +impl PackageTripletPath { + pub fn new(id: DependencyId, version: Version, triplet: TripletId) -> Self { + Self(PackageVersionPath::new(id, version), triplet) + } + + /// Returns the base path for the package triplet, which includes the triplet. + /// cache/{id}/{version}/{triplet} + pub fn triplet_path(&self) -> PathBuf { + self.base_path().join(self.1.to_string()) + } + + /// Returns the base path for the package triplet, which includes the triplet. + /// cache/{id}/{version}/{triplet}/lib + pub fn binaries_path(&self) -> PathBuf { + self.triplet_path().join("lib") + } +} + +impl Deref for PackageVersionPath { + type Target = PackageIdPath; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl Deref for PackageTripletPath { + type Target = PackageVersionPath; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} diff --git a/src/repository/local.rs b/src/repository/local.rs index bc0de53..8337b03 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -24,6 +24,7 @@ use crate::{ models::{ config::get_combine_config, package::PackageConfigExtensions, + package_files::PackageIdPath, schemas::{SchemaLinks, WithSchema}, }, resolver::dependency::ResolvedDependency, @@ -36,8 +37,7 @@ use super::Repository; // All files must exist pub struct PackageFiles { pub headers: Vec, - pub release_binary: Option, - pub debug_binary: Option, + pub binaries: Vec, // pub extras: Vec, } @@ -46,22 +46,18 @@ pub struct PackageFiles { #[derive(Serialize, Deserialize, JsonSchema, Clone, Debug, Default)] pub struct FileRepository { #[serde(default)] - pub artifacts: HashMap>, + pub artifacts: HashMap>, } impl FileRepository { pub fn get_artifacts_from_id( &self, id: &DependencyId, - ) -> Option<&HashMap> { + ) -> Option<&HashMap> { self.artifacts.get(id) } - pub fn get_artifact( - &self, - id: &DependencyId, - version: &Version, - ) -> Option<&SharedPackageConfig> { + pub fn get_artifact(&self, id: &DependencyId, version: &Version) -> Option<&PackageConfig> { match self.artifacts.get(id) { Some(artifacts) => artifacts.get(version), None => None, @@ -71,17 +67,16 @@ impl FileRepository { /// for adding to cache from local or network pub fn add_artifact_to_map( &mut self, - package: SharedPackageConfig, + package: PackageConfig, overwrite_existing: bool, ) -> Result<()> { - if !self.artifacts.contains_key(&package.config.id) { - self.artifacts - .insert(package.config.id.clone(), HashMap::new()); + if !self.artifacts.contains_key(&package.id) { + self.artifacts.insert(package.id.clone(), HashMap::new()); } - let id_artifacts = self.artifacts.get_mut(&package.config.id).unwrap(); + let id_artifacts = self.artifacts.get_mut(&package.id).unwrap(); - let entry = id_artifacts.entry(package.config.version.clone()); + let entry = id_artifacts.entry(package.version.clone()); match entry { Entry::Occupied(mut e) => { @@ -100,78 +95,70 @@ impl FileRepository { /// for local qpm-rs installs pub fn add_artifact_and_cache( &mut self, - package: SharedPackageConfig, - project_folder: PathBuf, - binaries: Vec, - copy: bool, + package: PackageConfig, overwrite_existing: bool, ) -> Result<()> { - if copy { - Self::copy_to_cache(&package, project_folder, binaries, false)?; - } self.add_artifact_to_map(package, overwrite_existing)?; Ok(()) } - fn copy_to_cache( - package: &SharedPackageConfig, + pub fn copy_to_cache( + package: &PackageConfig, + triplet: &TripletId, project_folder: PathBuf, binaries: Vec, - validate: bool, ) -> Result<()> { println!( "Adding cache for local dependency {} {}", - package.config.id.bright_red(), - package.config.version.bright_green() + package.id.bright_red(), + package.version.bright_green() ); - let config = get_combine_config(); - let cache_path = config - .cache - .as_ref() - .unwrap() - .join(&package.config.id.0) - .join(package.config.version.to_string()); - - let tmp_path = cache_path.join("tmp"); - let src_path = cache_path.join("src"); - let lib_path = cache_path.join("lib"); - - if src_path.exists() { - fs::remove_dir_all(&src_path).context("Failed to remove existing src folder")?; - } + let cache_path = PackageIdPath(package.id.clone()) + .version(package.version.clone()) + .triplet(triplet.clone()); - fs::create_dir_all(&src_path).context("Failed to create lib path")?; - - if let Some(binary_path_unwrapped) = &binary_path { - let so_path = lib_path.join(package.config.info.get_so_name2()); + let tmp_path = cache_path.tmp_path(); + if tmp_path.exists() { + fs::remove_dir_all(&tmp_path).context("Failed to remove existing tmp folder")?; + } - copy_things(binary_path_unwrapped, &so_path)?; + if cache_path.src_path().exists() { + fs::remove_dir_all(&cache_path.src_path()) + .context("Failed to remove existing src folder")?; } - if let Some(debug_binary_path_unwrapped) = &debug_binary_path { - let debug_bin_name = package - .config - .info - .get_so_name2() - .with_extension("debug.so"); + fs::create_dir_all(&cache_path.src_path()).context("Failed to create lib path")?; - let debug_so_path = lib_path.join(debug_bin_name.file_name().unwrap()); + for binary_src in binaries { + if !binary_src.exists() { + bail!( + "Binary {} does not exist, cannot copy to cache!", + binary_src.display().bright_yellow() + ); + } - copy_things(debug_binary_path_unwrapped, &debug_so_path)?; + let binary_dst = cache_path + .binaries_path() + .join(binary_src.file_name().unwrap()); + + copy_things(&binary_src, &binary_dst)?; } - let original_shared_path = project_folder.join(&package.config.shared_dir); + let original_shared_path = project_folder.join(&package.shared_directory); copy_things( &original_shared_path, - &src_path.join(&package.config.shared_directories), + &cache_path.src_path().join(&package.shared_directory), + )?; + copy_things( + &project_folder.join("qpm.json"), + &cache_path.src_path().join("qpm.json"), )?; - copy_things(&project_folder.join("qpm.json"), &src_path.join("qpm.json"))?; copy_things( &project_folder.join("qpm.shared.json"), - &src_path.join("qpm.shared.json"), + &cache_path.src_path().join("qpm.shared.json"), )?; // if the tmp path exists, but src doesn't, that's a failed cache, delete it and try again! @@ -180,16 +167,16 @@ impl FileRepository { } if validate { - let package_path = src_path; - let downloaded_package = SharedPackageConfig::read(package_path)?; + let package_path = cache_path.src_path(); + let downloaded_package = PackageConfig::read(package_path)?; // check if downloaded config is the same version as expected, if not, panic - if downloaded_package.config.version != package.config.version { + if downloaded_package.version != package.version { bail!( "Downloaded package ({}) version ({}) does not match expected version ({})!", - package.config.id.bright_red(), - downloaded_package.config.version.to_string().bright_green(), - package.config.version.to_string().bright_green(), + package.id.dependency_id_color(), + downloaded_package.version.red(), + package.version.green(), ) } } @@ -242,29 +229,6 @@ impl FileRepository { fs::remove_file(Self::global_file_repository_path()) } - /// Returns the path to the package versions cache for a specific package ID. - #[inline] - pub fn get_package_versions_cache_path(id: &DependencyId) -> PathBuf { - let user_config = get_combine_config(); - let base_path = user_config.cache.as_ref().unwrap(); - - // cache/{id} - base_path.join(&id.0) - } - - /// Returns the path to the package cache for a specific version and triplet. - #[inline] - pub fn get_package_cache_path( - id: &DependencyId, - version: &Version, - triplet: &TripletId, - ) -> PathBuf { - // cache/{id}/{version}/{triplet} - Self::get_package_versions_cache_path(id) - .join(version.to_string()) - .join(triplet.to_string()) - } - pub fn copy_from_cache( package: &PackageConfig, restored_deps: &[ResolvedDependency], @@ -340,10 +304,15 @@ impl FileRepository { /// Collects all files of a package from the cache. /// Returns a `PackageFiles` struct containing the paths to the headers, release binary, and debug binary. - pub fn collect_files_of_package(package: &PackageConfig) -> Result { - let dep_cache_path = Self::get_package_cache_path(&package.id, &package.version); + pub fn collect_files_of_package( + package: &PackageConfig, + triplet: &TripletId, + ) -> Result { + let dep_cache_path = PackageIdPath::new(package.id.clone()) + .version(package.version.clone()) + .triplet(triplet.clone()); - if !dep_cache_path.exists() { + if !dep_cache_path.triplet_path().exists() { bail!( "Missing cache for dependency {}:{}", package.id.dependency_id_color(), @@ -351,8 +320,7 @@ impl FileRepository { ); } - let libs_path = dep_cache_path.join("lib"); - let src_path = dep_cache_path.join("src"); + let src_path = dep_cache_path.src_path(); if !src_path.exists() { bail!( @@ -362,54 +330,16 @@ impl FileRepository { ); } - let exposed_headers = src_path.join(&package.shared_directories); + let exposed_headers = src_path.join(&package.shared_directory); - if package.additional_data.headers_only.unwrap_or(false) { - return Ok(PackageFiles { - headers: exposed_headers, - debug_binary: None, - release_binary: None, - }); - } - // get so name or release so name - - // get so name or release so name - let release_bin_name = package - .info - .get_so_name2() - .file_name() - .unwrap() - .to_string_lossy() - .to_string(); - - let debug_bin_name = package - .info - .get_so_name2() - .with_extension("debug.so") - .file_name() - .unwrap() - .to_string_lossy() - .to_string(); - - let release_binary = libs_path.join(&release_bin_name); - let debug_binary = libs_path.join(&debug_bin_name); - - if !release_binary.exists() && !debug_binary.exists() { - bail!( - "Missing binary {release_bin_name}/{debug_bin_name:?} for {}:{}", - package.info.id.dependency_id_color(), - package.info.version.dependency_version_color() - ); - } let release_binary = release_binary.exists().then_some(release_binary); let debug_binary = debug_binary.exists().then_some(debug_binary); Ok(PackageFiles { - headers: exposed_headers, - debug_binary, - release_binary, + headers: vec![exposed_headers], + binaries: }) } @@ -428,7 +358,7 @@ impl FileRepository { let missing_dependencies: Vec<_> = restored_dependencies_map .iter() .filter(|(_, r)| { - !Self::get_package_cache_path(&r.config.id, &r.config.version).exists() + !Self::get_package_triplet_cache_path(&r.config.id, &r.config.version).exists() }) .map(|(_, r)| format!("{}:{}", r.config.id, r.config.version)) .collect(); @@ -550,8 +480,10 @@ impl FileRepository { .get(&referenced_dependency.id) .unwrap(); - let dep_cache_path = - Self::get_package_cache_path(&referenced_dependency.id, &shared_dep.config.version); + let dep_cache_path = Self::get_package_triplet_cache_path( + &referenced_dependency.id, + &shared_dep.config.version, + ); let src_path = dep_cache_path.join("src"); let extern_headers_dep = extern_headers.join(&referenced_dependency.id); @@ -580,7 +512,7 @@ impl FileRepository { pub fn remove_package_versions(&mut self, package: &DependencyId) -> Result<()> { self.artifacts.remove(package); - let packages_path = Self::get_package_versions_cache_path(package); + let packages_path = PackageIdPath::new(package.clone()).versions_path(); if !packages_path.exists() { return Ok(()); } @@ -593,10 +525,14 @@ impl FileRepository { .ok_or_eyre(format!("No package found {package}/{version}"))? .remove(version); - let packages_path = Self::get_package_cache_path(package, version); + let packages_path = PackageIdPath::new(package.clone()) + .version(version.clone()) + .base_path(); + if !packages_path.exists() { return Ok(()); } + std::fs::remove_dir_all(packages_path)?; Ok(()) } @@ -614,11 +550,7 @@ impl Repository for FileRepository { })) } - fn get_package( - &self, - id: &DependencyId, - version: &Version, - ) -> Result> { + fn get_package(&self, id: &DependencyId, version: &Version) -> Result> { Ok(self.get_artifact(id, version).cloned()) } @@ -626,7 +558,7 @@ impl Repository for FileRepository { Ok(self.artifacts.keys().cloned().collect()) } - fn add_to_db_cache(&mut self, config: SharedPackageConfig, permanent: bool) -> Result<()> { + fn add_to_db_cache(&mut self, config: PackageConfig, permanent: bool) -> Result<()> { if !permanent { return Ok(()); } diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 9ca1d09..6c2d3a9 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -30,10 +30,11 @@ use qpm_package::{ use crate::{ models::{ - config::get_combine_config, package::PackageConfigExtensions, + config::get_combine_config, package::PackageConfigExtensions, package_files::PackageIdPath, qpackages::QPackageExtensions, qpkg::QPkgExtensions, }, network::agent::{download_file_report, get_agent}, + repository::local::FileRepository, terminal::colors::QPMColor, utils::git, }; @@ -137,39 +138,24 @@ impl QPMRepository { config.id.dependency_id_color(), config.version.version_id_color() ); - let user_config = get_combine_config(); - let base_path = user_config - .cache - .as_ref() - .unwrap() - .join(&config.id.0) - .join(config.version.to_string()); - - let src_path = base_path.join("src"); - let lib_path = base_path.join("lib"); - let tmp_path = base_path.join("tmp"); - - let qpkg_file_dst = src_path.join("qpm2.qpkg.json"); - let headers_dst = src_path.join("shared"); - let get_bin_dir_dst = |triplet_id: &TripletId| -> PathBuf { lib_path.join(&triplet_id.0) }; + let package_path = PackageIdPath::new(config.id.clone()).version(config.version.clone()); + + let src_path = package_path.src_path(); + let tmp_path = package_path.tmp_path(); + + let qpkg_file_dst = package_path.qpkg_json_path(); + let headers_dst = package_path.src_path(); if QPackagesPackage::read(&src_path).is_ok() { // already cached, no need to download again return Ok(()); } - fs::create_dir_all(&base_path) - .with_context(|| format!("Failed to create lib path {base_path:?}"))?; - - if !lib_path.exists() { - fs::create_dir_all(&lib_path).context("Failed to create lib path")?; - } - // Downloads the repo / zip file into src folder w/ subfolder taken into account - if !src_path.exists() { + if !headers_dst.exists() { // src did not exist, this means that we need to download the repo/zip file from packageconfig.url fs::create_dir_all(&src_path) - .with_context(|| format!("Failed to create lib path {base_path:?}"))?; + .with_context(|| format!("Failed to create lib path {headers_dst:?}"))?; } // if the tmp path exists, but src doesn't, that's a failed cache, delete it and try again! @@ -235,13 +221,11 @@ impl QPMRepository { // copy binaries to lib folder for (triplet_id, triplet_info) in &qpkg_file.triplets { - let bin_dir = get_bin_dir_dst(&triplet_id); - fs::create_dir_all(&bin_dir).with_context(|| { - format!( - "Failed to create bin dir {}", - bin_dir.display().file_path_color() - ) - })?; + let bin_dir = package_path.clone().triplet(triplet_id.clone()).binaries_path(); + + if !bin_dir.exists() { + fs::create_dir_all(&bin_dir).context("Failed to create lib path")?; + } for file in &triplet_info.files { let src_file = tmp_path.join(file); diff --git a/src/tests/network/qpackages.rs b/src/tests/network/qpackages.rs index e1af153..a6c3fff 100644 --- a/src/tests/network/qpackages.rs +++ b/src/tests/network/qpackages.rs @@ -44,7 +44,6 @@ fn download_package_binary() -> Result<()> { let link = package .config - .additional_data .so_link .ok_or_eyre("Binary SO not found")?; @@ -198,7 +197,8 @@ fn resolve_redownload_cache() -> Result<()> { restored_dependencies: vec![], }; - let path = FileRepository::get_package_cache_path("beatsaber-hook", &Version::new(5, 1, 9)); + let path = + FileRepository::get_package_triplet_cache_path("beatsaber-hook", &Version::new(5, 1, 9)); let lib_path = path.join("lib").join("libbeatsaber-hook_5_1_9.so"); let resolved = { From b49d225a7d74a666efa81675ae83a14b251c4986 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 26 Jul 2025 12:12:44 -0400 Subject: [PATCH 014/119] QPM 2 dependency resolving completed --- Cargo.lock | 14 +-- src/commands/install.rs | 38 +++++-- src/commands/restore.rs | 14 ++- src/models/package.rs | 28 +++-- src/models/package_files.rs | 6 +- src/repository/local.rs | 212 +++++++++++++++++------------------- src/repository/qpackages.rs | 37 ++++++- src/resolver/dependency.rs | 5 +- 8 files changed, 204 insertions(+), 150 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6a9a74e..581b812 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2558,7 +2558,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#b99e8044a313468956198527afef08b2295b14fd" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#e38d016b671ea804579171107f4b5c7a7eb6e3c8" dependencies = [ "cursed-semver-parser", "schemars", @@ -2679,9 +2679,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.15" +version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8af0dde094006011e6a740d4879319439489813bd0bcdc7d821beaeeff48ec" +checksum = "7251471db004e509f4e75a62cca9435365b5ec7bcdff530d612ac7c87c44a792" dependencies = [ "bitflags", ] @@ -3308,9 +3308,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.46.1" +version = "1.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" +checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" dependencies = [ "backtrace", "bytes", @@ -3319,8 +3319,8 @@ dependencies = [ "mio", "pin-project-lite", "slab", - "socket2 0.5.10", - "windows-sys 0.52.0", + "socket2 0.6.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/src/commands/install.rs b/src/commands/install.rs index 9a8dfc4..4884521 100644 --- a/src/commands/install.rs +++ b/src/commands/install.rs @@ -1,7 +1,7 @@ -use std::path::PathBuf; +use std::{collections::HashSet, path::PathBuf}; use clap::Args; -use color_eyre::eyre::Context; +use color_eyre::eyre::{bail, Context, ContextCompat}; use qpm_package::{ extensions::package_metadata::PackageMetadataExtensions, models::{package::PackageConfig, shared_package::SharedPackageConfig}, @@ -19,7 +19,8 @@ pub struct InstallCommand { #[clap(long, default_value = "false")] offline: bool, - pub binaries: Option>, + #[clap(long, default_value = "false")] + pub no_validate: bool, } impl Command for InstallCommand { @@ -31,20 +32,39 @@ impl Command for InstallCommand { let shared_package = SharedPackageConfig::read(".")?; let project_folder = PathBuf::from(".").canonicalize()?; + let restored_triplet_id = shared_package.restored_triplet; + + let restored_triplet = shared_package + .config + .triplets + .get_triplet_settings(&restored_triplet_id) + .context("Failed to get triplet")?; + + let binaries = restored_triplet.out_binaries.unwrap_or_default(); + + if !self.no_validate { + println!("Skipping validation of binaries"); + } else { + for binary in &binaries { + if !binary.exists() { + bail!( + "Binary file {} does not exist", + binary.display() + ); + } + } + } let mut file_repo = FileRepository::read()?; FileRepository::copy_to_cache( &shared_package.config, - &shared_package.restored_triplet, + &restored_triplet_id, project_folder, - self.binaries.clone().unwrap_or_default(), + binaries, false, )?; - file_repo.add_artifact_and_cache( - shared_package.config, - true, - )?; + file_repo.add_artifact_and_cache(shared_package.config, true)?; file_repo.write()?; Ok(()) diff --git a/src/commands/restore.rs b/src/commands/restore.rs index 3361d43..c954538 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -9,7 +9,7 @@ use color_eyre::{ use itertools::Itertools; use qpm_package::models::{ package::PackageConfig, - shared_package::{SharedPackageConfig, QPM_SHARED_JSON}, + shared_package::{QPM_SHARED_JSON, SharedPackageConfig}, triplet::{PackageTriplet, TripletId}, }; use semver::Version; @@ -84,9 +84,7 @@ impl Command for RestoreCommand { let unlocked = self.update || is_modified(&shared_package_opt, &triplet_id, &triplet); if !unlocked && is_ignored() { - eprintln!( - "It seems that the current repository has {QPM_SHARED_JSON} ignored. " - ); + eprintln!("It seems that the current repository has {QPM_SHARED_JSON} ignored. "); eprintln!( "Please commit it to avoid inconsistent dependency resolving. git add {QPM_SHARED_JSON} --force" ); @@ -141,9 +139,15 @@ impl Command for RestoreCommand { let shared_package = shared_package_opt.expect("SharedPackage is None somehow!"); // always write to reflect config changes - dependency::restore(".", &shared_package, &resolved_deps, &mut repo)?; + dependency::restore(".", &shared_package, &triplet_id, &resolved_deps, &mut repo)?; shared_package.write(".")?; + println!( + "Restored triplet {} with {} dependencies", + triplet_id.triplet_id_color(), + resolved_deps.len() + ); + validate_ndk(&shared_package.config)?; Ok(()) diff --git a/src/models/package.rs b/src/models/package.rs index cd40696..c3b1054 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -190,20 +190,26 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { }) .try_collect()?; + // For each triplet's dependencies, create a SharedTriplet with the resolved dependencies + fn make_shared_triplet( + resolved_dep: &ResolvedDependency, + ) -> (DependencyId, SharedTripletDependencyInfo) { + let shared_triplet_dependency_info = SharedTripletDependencyInfo { + restored_version: resolved_dep.0.version.clone(), + restored_triplet: resolved_dep.1.clone(), + restored_binaries: resolved_dep + .get_triplet_settings() + .out_binaries + .clone() + .unwrap_or_default(), + }; + (resolved_dep.0.id.clone(), shared_triplet_dependency_info) + } + // For each dependency, get the package config and triplet settings let locked_triplet = triplet_dependencies .iter() .map(|(package_triplet, dependencies)| { - // For each dependency, get the package config and triplet settings - let restored_dependencies = dependencies - .iter() - .map(|resolved_dep| { - let shared_triplet_dependency_info = SharedTripletDependencyInfo { - restored_version: resolved_dep.0.version.clone(), - restored_triplet: resolved_dep.1.clone(), - }; - (resolved_dep.0.id.clone(), shared_triplet_dependency_info) - }) - .collect(); + let restored_dependencies = dependencies.iter().map(make_shared_triplet).collect(); let shared_triplet = SharedTriplet { restored_dependencies, }; diff --git a/src/models/package_files.rs b/src/models/package_files.rs index 183c18c..5dbf4f2 100644 --- a/src/models/package_files.rs +++ b/src/models/package_files.rs @@ -47,7 +47,7 @@ impl PackageVersionPath { self.versions_path().join(self.1.to_string()) } - /// Returns the path to the source files for the package version. + /// Returns the path to the source files e.g headers for the package version. /// cache/{id}/{version}/src pub fn src_path(&self) -> PathBuf { self.base_path().join("src") @@ -83,6 +83,10 @@ impl PackageTripletPath { pub fn binaries_path(&self) -> PathBuf { self.triplet_path().join("lib") } + + pub fn binary_path(&self, binary: &PathBuf) -> PathBuf { + self.binaries_path().join(binary.file_name().expect("Binary file name")) + } } impl Deref for PackageVersionPath { diff --git a/src/repository/local.rs b/src/repository/local.rs index 8337b03..aa2fd63 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -13,7 +13,7 @@ use schemars::JsonSchema; use semver::Version; use serde::{Deserialize, Serialize}; use std::{ - collections::{HashMap, hash_map::Entry}, + collections::{HashMap, HashSet, hash_map::Entry}, fs, io::{BufReader, Write}, ops::Not, @@ -36,7 +36,9 @@ use super::Repository; // All files must exist pub struct PackageFiles { - pub headers: Vec, + /// Paths to the header files of the package on the filesystem. + pub headers: PathBuf, + /// Paths to the binary files of the package on the filesystem. pub binaries: Vec, // pub extras: Vec, } @@ -231,10 +233,11 @@ impl FileRepository { pub fn copy_from_cache( package: &PackageConfig, + triplet: &TripletId, restored_deps: &[ResolvedDependency], workspace_dir: &Path, ) -> Result<()> { - let files = Self::collect_deps(package, restored_deps, workspace_dir)?; + let files = Self::collect_deps(package, triplet, restored_deps, workspace_dir)?; let config = get_combine_config(); let symlink = config.symlink.unwrap_or(true); @@ -308,6 +311,11 @@ impl FileRepository { package: &PackageConfig, triplet: &TripletId, ) -> Result { + let package_triplet = package + .triplets + .get_triplet_settings(triplet) + .expect("Triplet settings not found"); + let dep_cache_path = PackageIdPath::new(package.id.clone()) .version(package.version.clone()) .triplet(triplet.clone()); @@ -332,14 +340,37 @@ impl FileRepository { let exposed_headers = src_path.join(&package.shared_directory); + let expected_binaries = package_triplet.out_binaries.unwrap_or_default(); + let binaries: Vec = expected_binaries + .iter() + .map(|b| dep_cache_path.binary_path(b)) + .collect(); + // ensure no duplicates + let mut seen = HashSet::new(); + for bin in &binaries { + if !bin.exists() { + bail!( + "Missing binary {} for dependency {}:{}", + bin.display().bright_yellow(), + package.id.dependency_id_color(), + package.version.dependency_version_color() + ); + } - let release_binary = release_binary.exists().then_some(release_binary); - let debug_binary = debug_binary.exists().then_some(debug_binary); + if !seen.insert(bin.clone()) { + bail!( + "Duplicate binary {} for dependency {}:{}", + bin.display().bright_yellow(), + package.id.dependency_id_color(), + package.version.dependency_version_color() + ); + } + } Ok(PackageFiles { - headers: vec![exposed_headers], - binaries: + headers: exposed_headers, + binaries, }) } @@ -347,27 +378,36 @@ impl FileRepository { /// Returns a map of source paths to target paths for the dependencies. pub fn collect_deps( package: &PackageConfig, + triplet: &TripletId, restored_deps: &[ResolvedDependency], workspace_dir: &Path, ) -> Result> { - // let package = shared_package.config; - let restored_dependencies_map: HashMap<&DependencyId, &SharedPackageConfig> = - restored_deps.iter().map(|p| (&p.config.id, p)).collect(); + let triplet_config = package + .triplets + .get_triplet_settings(triplet) + .context("Failed to get triplet settings")?; // validate exists dependencies - let missing_dependencies: Vec<_> = restored_dependencies_map + let missing_dependencies: Vec<_> = restored_deps .iter() - .filter(|(_, r)| { - !Self::get_package_triplet_cache_path(&r.config.id, &r.config.version).exists() + .filter_map(|r| { + let package_path = PackageIdPath::new(r.0.id.clone()) + .version(r.0.version.clone()) + .triplet(r.1.clone()) + .triplet_path(); + // if the package path does not exist, return the id and version + package_path + .exists() + .not() + .then_some(format!("{}:{}/{}", r.0.id, r.0.version, r.1)) }) - .map(|(_, r)| format!("{}:{}", r.config.id, r.config.version)) .collect(); if !missing_dependencies.is_empty() { bail!("Missing dependencies in cache: {:?}", missing_dependencies); } - let extern_dir = workspace_dir.join(&package.dependencies_dir); + let extern_dir = workspace_dir.join(&package.dependencies_directory); ensure!(extern_dir != workspace_dir, "Extern dir is workspace dir!"); @@ -379,134 +419,78 @@ impl FileRepository { let extern_binaries = extern_dir.join("libs"); let extern_headers = extern_dir.join("includes"); + let mut paths = HashMap::::new(); // direct deps (binaries) - let deps: Vec<_> = restored_deps .iter() - .map(|p| Self::collect_files_of_package(&p.config).map(|f| (p, f))) + .map(|resolved_dep| -> color_eyre::Result<_> { + let collect_files_of_package = + Self::collect_files_of_package(&resolved_dep.0, &resolved_dep.1)?; + + Ok((resolved_dep, collect_files_of_package)) + }) .try_collect()?; let (direct_deps, indirect_deps): (Vec<_>, Vec<_>) = // partition by direct dependencies and indirect - deps.into_iter().partition(|(dep, _)| { - package + deps.into_iter().partition(|(unknown_dep, _)| { + triplet_config .dependencies .iter() - .any(|d| d.id == dep.config.id) + .any(|direct_dep| *direct_dep.0 == unknown_dep.0.id) }); - for (direct_dep, direct_dep_files) in direct_deps { - let project_deps_headers_target = extern_headers.join(direct_dep.config.id.clone()); - - let exposed_headers = direct_dep_files.headers; - let not_header_only = direct_dep - .config - .additional_data - .headers_only - .unwrap_or(false) - .not(); - let release_binary = not_header_only - // not header only - .then_some(direct_dep_files.release_binary) - .flatten(); - - let debug_binary = not_header_only - .then_some(direct_dep_files.debug_binary) - .flatten(); - - if not_header_only - && ((release_binary.is_none() || !release_binary.as_ref().unwrap().exists()) - && (debug_binary.is_none() || !debug_binary.as_ref().unwrap().exists())) - { - bail!( - "Missing binary for {}:{}", - direct_dep.config.info.id.dependency_id_color(), - direct_dep.config.version.dependency_version_color() - ); - } - - if !exposed_headers.exists() { - bail!( - "Missing header files for {}:{}", - direct_dep.config.id.dependency_id_color(), - direct_dep.config.version.dependency_version_color() - ); - } - - if let Some(src_binary) = release_binary { - let file_name = src_binary.file_name().expect("Failed to get file name"); - - paths.insert(src_binary.clone(), extern_binaries.join(file_name)); - } + // direct dependencies copy the binaries to the extern_binaries folder + for (direct_dep, direct_dep_files) in &direct_deps { + for binary in &direct_dep_files.binaries { + let file_name = binary.file_name().expect("Failed to get file name"); - if let Some(src_binary) = debug_binary { - let file_name = src_binary.file_name().expect("Failed to get file name"); + if !binary.exists() { + bail!( + "Missing binary {} for dependency {}:{}", + binary.display().bright_yellow(), + direct_dep.0.id.dependency_id_color(), + direct_dep.0.version.dependency_version_color() + ); + } - paths.insert(src_binary.clone(), extern_binaries.join(file_name)); + // copy to extern/libs/{file_name} + paths.insert(binary.clone(), extern_binaries.join(file_name)); } - - paths.insert( - exposed_headers, - project_deps_headers_target.join(&direct_dep.config.shared_dir), - ); } // Get headers of all dependencies restored - for (indirect_dep, indirect_dep_files) in indirect_deps { - let project_deps_headers_target = extern_headers.join(indirect_dep.config.id.clone()); + for (dep, dep_files) in direct_deps.into_iter().chain(indirect_deps.into_iter()) { + let project_deps_headers_target = extern_headers.join(dep.0.id.0.clone()); - let exposed_headers = indirect_dep_files.headers; + let exposed_headers = dep_files.headers; if !exposed_headers.exists() { bail!( "Missing header files for {}:{}", - indirect_dep.config.id.dependency_id_color(), - indirect_dep.config.version.dependency_version_color() + dep.0.id.dependency_id_color(), + dep.0.version.dependency_version_color() ); } - paths.insert( - exposed_headers, - project_deps_headers_target.join(&indirect_dep.config.shared_dir), - ); + paths.insert(exposed_headers, project_deps_headers_target); } - // extra files - // while this is looped twice, generally I'd assume the compiler to properly - // optimize this and it's better readability - for referenced_dependency in &package.dependencies { - let shared_dep = restored_dependencies_map - .get(&referenced_dependency.id) - .unwrap(); - - let dep_cache_path = Self::get_package_triplet_cache_path( - &referenced_dependency.id, - &shared_dep.config.version, - ); - let src_path = dep_cache_path.join("src"); - - let extern_headers_dep = extern_headers.join(&referenced_dependency.id); - - if let Some(extras) = &referenced_dependency.additional_data.extra_files { - for extra in extras { - let extra_src = src_path.join(extra); - - if !extra_src.exists() { - bail!( - "Missing extra {extra} for dependency {}:{}", - referenced_dependency.id, - shared_dep.config.version.to_string() - ); - } + paths.retain(|src, _| src.exists()); - paths.insert(extra_src, extern_headers_dep.join(extra)); - } + // ensure no collisions + let mut seen = HashSet::new(); + for (src, dest) in &paths { + if !seen.insert(dest) { + bail!( + "Collision detected for {} and {}", + src.display().bright_yellow(), + dest.display().bright_yellow() + ); } } - paths.retain(|src, _| src.exists()); - Ok(paths) } @@ -571,9 +555,11 @@ impl Repository for FileRepository { fn download_to_cache(&mut self, config: &PackageConfig) -> Result { let exist_in_db = self.get_artifact(&config.id, &config.version).is_some(); - let file = FileRepository::collect_files_of_package(config); + let package_path = PackageIdPath::new(config.id.clone()).version(config.version.clone()); + + let config = PackageConfig::read(&package_path.qpm_json_path()); - Ok(exist_in_db && file.is_ok()) + Ok(exist_in_db && package_path.src_path().exists() && config.is_ok()) } fn write_repo(&self) -> Result<()> { diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 6c2d3a9..521a309 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -24,7 +24,7 @@ use qpm_package::{ qpackages::QPackagesPackage, qpkg::{QPKG_JSON, QPkg}, shared_package::{QPM_SHARED_JSON, SharedPackageConfig}, - triplet::TripletId, + triplet::{self, TripletId}, }, }; @@ -221,7 +221,10 @@ impl QPMRepository { // copy binaries to lib folder for (triplet_id, triplet_info) in &qpkg_file.triplets { - let bin_dir = package_path.clone().triplet(triplet_id.clone()).binaries_path(); + let bin_dir = package_path + .clone() + .triplet(triplet_id.clone()) + .binaries_path(); if !bin_dir.exists() { fs::create_dir_all(&bin_dir).context("Failed to create lib path")?; @@ -230,6 +233,7 @@ impl QPMRepository { for file in &triplet_info.files { let src_file = tmp_path.join(file); let dst_file = bin_dir.join(file.file_name().unwrap()); + // copy as {cache}/{id}/{version}/{triplet}/lib/{file_name} fs::copy(&src_file, &dst_file).with_context(|| { format!( "Failed to copy file from {} to {}", @@ -240,6 +244,35 @@ impl QPMRepository { } } + // assert that the triplets binaries are present + for triplet in config.triplets.iter_triplets() { + let triplet_path = package_path + .clone() + .triplet(triplet.0.clone()); + let triplet_bin_path = triplet_path + .binaries_path(); + if !triplet_bin_path.exists() { + bail!( + "Triplet binaries for {} not found in {}", + triplet.0.triplet_id_color(), + triplet_bin_path.display().file_path_color() + ); + } + + for binary in triplet.1.out_binaries.iter().flatten() { + // {cache}/{id}/{version}/{triplet}/lib/{binary} + let binary_path = triplet_path.binary_path(binary); + if !binary_path.exists() { + bail!( + "Binary {} not found in triplet {} at {}", + binary.display().file_path_color(), + triplet.0.triplet_id_color(), + binary_path.display().file_path_color() + ); + } + } + } + // now write the package config to the src path qpackage_config.config.write(&src_path).with_context(|| { format!( diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index 7f52b3c..e67ce01 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -31,7 +31,7 @@ use qpm_package::models::{ pub struct ResolvedDependency(pub PackageConfig, pub TripletId); impl ResolvedDependency { - fn get_triplet_settings(&self) -> &PackageTriplet { + pub fn get_triplet_settings(&self) -> &PackageTriplet { self.0 .triplets .specific_triplets @@ -254,6 +254,7 @@ pub fn resolve<'a>( pub fn restore>( workspace: P, shared_package: &SharedPackageConfig, + triplet: &TripletId, resolved_deps: &[ResolvedDependency], repository: &mut impl Repository, ) -> Result<()> { @@ -277,7 +278,7 @@ pub fn restore>( repository.write_repo()?; println!("Copying now"); - FileRepository::copy_from_cache(&shared_package.config, resolved_deps, workspace.as_ref())?; + FileRepository::copy_from_cache(&shared_package.config, triplet, resolved_deps, workspace.as_ref())?; shared_package.try_write_toolchain(repository)?; From b76bae63f694606e4c33d539bc6988957d627e08 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 26 Jul 2025 18:49:40 -0400 Subject: [PATCH 015/119] Update QPM.Package source reference and enhance triplet dependency management --- Cargo.lock | 2 +- src/commands/collapse.rs | 90 +++++++++++++---- src/commands/dependency.rs | 198 ++++++++++++++++++++----------------- 3 files changed, 180 insertions(+), 110 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 581b812..e5ebe70 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2558,7 +2558,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#e38d016b671ea804579171107f4b5c7a7eb6e3c8" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#d69c2d30a0a25d0db342ae7dedea47ff4425a507" dependencies = [ "cursed-semver-parser", "schemars", diff --git a/src/commands/collapse.rs b/src/commands/collapse.rs index 4d5ab68..f092964 100644 --- a/src/commands/collapse.rs +++ b/src/commands/collapse.rs @@ -1,11 +1,17 @@ use clap::Args; +use color_eyre::eyre::Context; +use itertools::Itertools; use owo_colors::OwoColorize; -use qpm_package::models::package::PackageConfig; +use qpm_package::models::{ + package::PackageConfig, + triplet::{self, TripletId}, +}; use crate::{ models::package::PackageConfigExtensions, repository::{self}, resolver::dependency::resolve, + terminal::colors::QPMColor, }; use super::Command; @@ -14,34 +20,76 @@ use super::Command; pub struct CollapseCommand { #[clap(long, default_value = "false")] offline: bool, + + #[clap(long, short)] + pub triplet: Option, } impl Command for CollapseCommand { fn execute(self) -> color_eyre::Result<()> { let package = PackageConfig::read(".")?; - let binding = repository::useful_default_new(self.offline)?; - let resolved = resolve(&package, &binding)?; - for shared_package in resolved { - println!( - "{} --> {} ({} restored dependencies)", - &shared_package.config.id.bright_red(), - &shared_package.config.version.bright_green(), - shared_package - .restored_dependencies - .len() - .to_string() - .yellow() - ); + let repo = repository::useful_default_new(self.offline)?; + match self.triplet { + Some(triplet) => { + let triplet_id = TripletId(triplet); - for shared_dep in shared_package.restored_dependencies.iter() { - println!( - " - {}: ({}) --> {}", - &shared_dep.dependency.id, - &shared_dep.dependency.version_range, - &shared_dep.version - ); + list_triplet_dependencies(package, &repo, &triplet_id)? + } + None => { + println!("Listing dependencies for all triplets"); + for triplet in package + .triplets + .iter_triplets() + .sorted_by(|a, b| a.0.cmp(&b.0)) + { + println!( + "Listing dependencies for triplet {}", + triplet.0.triplet_id_color() + ); + list_triplet_dependencies(package.clone(), &repo, &triplet.0).with_context( + || { + format!( + "Failed to list dependencies for triplet {}", + triplet.0.triplet_id_color() + ) + }, + )?; + } } } Ok(()) } } + +fn list_triplet_dependencies( + package: PackageConfig, + repo: &impl repository::Repository, + triplet_id: &TripletId, +) -> Result<(), color_eyre::eyre::Error> { + let resolved = resolve(&package, repo, triplet_id)?; + for resolved_dep in resolved.sorted_by(|a, b| a.0.id.cmp(&b.0.id)) { + let package = &resolved_dep.0; + let triplet = &resolved_dep.1; + + let triplet_config = resolved_dep.get_triplet_settings(); + + let sum = triplet_config.dependencies.len(); + + println!( + "{} --> {}/{} ({} restored dependencies)", + package.id.dependency_id_color(), + package.version.version_id_color(), + triplet.triplet_id_color(), + sum.to_string().yellow() + ); + + for (dep_id, shared_dep) in triplet_config.dependencies.iter() { + println!( + " - {}: ({})", + &dep_id.dependency_id_color(), + &shared_dep.version_range.dependency_version_color(), + ); + } + } + Ok(()) +} diff --git a/src/commands/dependency.rs b/src/commands/dependency.rs index ee4bf26..d3fd20b 100644 --- a/src/commands/dependency.rs +++ b/src/commands/dependency.rs @@ -5,8 +5,12 @@ use color_eyre::{ eyre::{Context, ContextCompat, bail}, }; use owo_colors::OwoColorize; -use qpm_package::models::package::PackageConfig; -use semver::VersionReq; +use qpm_package::models::{ + package::{DependencyId, PackageConfig}, + shared_package::SharedPackageConfig, + triplet::{self, PackageTripletDependency, TripletId}, +}; +use semver::{Version, VersionReq}; use crate::{ models::package::{PackageConfigExtensions, SharedPackageConfigExtensions}, @@ -42,6 +46,10 @@ pub struct DependencyOperationAddArgs { /// Id of the dependency as listed on qpackages pub id: String, + /// Triplet to add the dependency to, if not specified, the default triplet is used + #[clap(long, short)] + pub triplet: Option, + /// optional version of the dependency that you want to add #[clap(short, long)] pub version: Option, @@ -74,6 +82,10 @@ pub struct DependencyOperationRemoveArgs { /// Id of the dependency as listed on qpackages pub id: String, + /// Triplet to remove the dependency from, if not specified, the default triplet is used + #[clap(long, short)] + pub triplet: Option, + /// If the dependencies should be sorted after removing #[clap(long, default_value = "false")] pub sort: bool, @@ -92,31 +104,28 @@ impl Command for DependencyCommand { impl Command for DependencyOperationAddArgs { fn execute(self) -> Result<()> { - if self.id == "yourmom" { - bail!("The dependency was too big to add, we can't add this one!"); - } + let id = DependencyId(self.id); let repo = repository::useful_default_new(self.offline)?; let versions = repo - .get_package_versions(&self.id) + .get_package_versions(&id) .context("No version found for dependency")?; if versions.is_none() || versions.as_ref().unwrap().is_empty() { bail!( "Package {} does not seem to exist qpackages, please make sure you spelled it right, and that it's an actual package!", - self.id.bright_green() + id.dependency_id_color() ); } let version = match self.version { Option::Some(v) => v, // if no version given, use ^latest instead, should've specified a version idiot - Option::None => semver::VersionReq::parse(&format!( - "^{}", - versions.unwrap().first().unwrap().version - )) - .unwrap(), + Option::None => { + semver::VersionReq::parse(&format!("^{}", versions.unwrap().first().unwrap())) + .unwrap() + } }; let additional_data = match &self.additional_data { @@ -124,14 +133,21 @@ impl Command for DependencyOperationAddArgs { Option::None => None, }; - put_dependency(&self.id, version, additional_data, self.sort) + put_dependency( + &id, + self.triplet.map(TripletId).as_ref(), + version, + additional_data, + self.sort, + ) } } fn put_dependency( - id: &str, + id: &DependencyId, + triplet: Option<&TripletId>, version: VersionReq, - additional_data: Option, + new_triplet_dep: Option, sort: bool, ) -> Result<()> { println!( @@ -141,103 +157,113 @@ fn put_dependency( ); let mut package = PackageConfig::read(".")?; - let existing_dep = package.dependencies.iter_mut().find(|d| d.id == id); - - let dep = PackageDependency { - id: id.to_string(), - version_range: version, - additional_data: existing_dep - .as_ref() - .map(|d| &d.additional_data) - .cloned() - .or(additional_data) - .unwrap_or_default(), + let triplet = match triplet { + Some(triplet) => package + .triplets + .specific_triplets + .get_mut(triplet) + .context("Triplet not found")?, + None => &mut package.triplets.default, }; - match existing_dep { - // overwrite existing dep - Some(existing_dep) => { - println!("Dependency already in qpm.json, updating!"); - *existing_dep = dep - } - // add dep - None => package.dependencies.push(dep), - } + let existing_dep = triplet.dependencies.get(id); - if sort { - package.dependencies.sort_by(|a, b| a.id.cmp(&b.id)); + if existing_dep.is_some() { + println!("Dependency already in qpm.json, updating!"); } + let dep = PackageTripletDependency { + version_range: version, + ..new_triplet_dep + .or(existing_dep.cloned()) + .unwrap_or_default() + }; + triplet.dependencies.insert(id.clone(), dep); + + // if sort { + // triplet.dependencies.sort_by(|a, b| a.id.cmp(&b.id)); + // } + package.write(".")?; Ok(()) } fn remove_dependency(dependency_args: DependencyOperationRemoveArgs) -> Result<()> { let mut package = PackageConfig::read(".")?; - package.dependencies.retain(|p| p.id != dependency_args.id); - if dependency_args.sort { - package.dependencies.sort_by(|a, b| a.id.cmp(&b.id)); - } + let triplet = match dependency_args.triplet { + Some(triplet) => package + .triplets + .specific_triplets + .get_mut(&TripletId(triplet)) + .context("Triplet not found")?, + None => &mut package.triplets.default, + }; + + triplet + .dependencies + .retain(|p, _| p.0 != dependency_args.id); + + // if dependency_args.sort { + // triplet.dependencies.sort_by(|a, b| a.id.cmp(&b.id)); + // } package.write(".")?; Ok(()) } fn download_dependency(dependency_args: DependencyOperationDownloadArgs) -> Result<()> { + let id = DependencyId(dependency_args.id); + let mut repository = repository::useful_default_new(false)?; let version = match dependency_args.version { Some(v) => v, _ => { - let versions = repository - .get_package_versions(&dependency_args.id)? - .with_context(|| { - format!( - "Package {} does not seem to exist, please make sure you spelled it right.", - dependency_args.id.dependency_id_color() - ) - })?; + let versions = repository.get_package_versions(&id)?.with_context(|| { + format!( + "Package {} does not seem to exist, please make sure you spelled it right.", + id.dependency_id_color() + ) + })?; // return the latest version - versions.first().expect("No versions?").version.clone() + versions.first().expect("No versions?").clone() } }; - let dep = repository - .get_package(&dependency_args.id, &version)? - .with_context(|| { - format!( - "Failed to resolve package {}:{}", - dependency_args.id.dependency_id_color(), - version.dependency_version_color() - ) - })?; + let package = repository.get_package(&id, &version)?.with_context(|| { + format!( + "Failed to resolve package {}:{}", + id.dependency_id_color(), + version.dependency_version_color() + ) + })?; + + let version = package.version.clone(); // if recursive is true, resolve the dependencies of the package if dependency_args.recursive && let Ok(resolved_deps) = - SharedPackageConfig::resolve_from_package(dep.config.clone(), &repository) + SharedPackageConfig::resolve_from_package(package.clone(), &repository) { let resolved_deps = resolved_deps.1; - for dep in resolved_deps { - println!( - "Pulling {}:{}", - dep.config.info.id.dependency_id_color(), - dep.config - .info - .version - .to_string() - .dependency_version_color() - ); - repository.download_to_cache(&dep.config).with_context(|| { - format!( - "Requesting {}:{}", - dep.config.info.id.dependency_id_color(), - dep.config.info.version.version_id_color() - ) - })?; - repository.add_to_db_cache(dep.clone(), true)?; + for (_triplet, triplet_deps) in resolved_deps { + for dep in triplet_deps { + println!( + "Pulling {}:{}", + id.dependency_id_color(), + version.to_string().dependency_version_color() + ); + repository.download_to_cache(&dep.0).with_context(|| { + format!( + "Requesting {}:{}", + id.dependency_id_color(), + version.version_id_color() + ) + })?; + repository.add_to_db_cache(dep.0, true)?; + } } repository.write_repo()?; @@ -245,21 +271,17 @@ fn download_dependency(dependency_args: DependencyOperationDownloadArgs) -> Resu println!( "Pulling {}:{}", - dep.config.info.id.dependency_id_color(), - dep.config - .info - .version - .to_string() - .dependency_version_color() + id.dependency_id_color(), + version.to_string().dependency_version_color() ); - repository.download_to_cache(&dep.config).with_context(|| { + repository.download_to_cache(&package).with_context(|| { format!( "Requesting {}:{}", - dep.config.info.id.dependency_id_color(), - dep.config.info.version.version_id_color() + id.dependency_id_color(), + version.version_id_color() ) })?; - repository.add_to_db_cache(dep.clone(), true)?; + repository.add_to_db_cache(package, true)?; repository.write_repo()?; From 0ad697e97a17e96291800bbec37e2b8a377e3121 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 26 Jul 2025 19:17:39 -0400 Subject: [PATCH 016/119] Add `env` variables from restored packages --- Cargo.lock | 2 +- src/commands/cache.rs | 7 ++-- src/commands/qmod/manifest.rs | 7 +--- src/commands/scripts.rs | 34 +++++++++++++---- src/models/mod_json.rs | 39 ++++++++++++++++---- src/models/package.rs | 69 +++++++++++++++++++++++++++++++++-- 6 files changed, 129 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e5ebe70..4b6e37c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2558,7 +2558,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#d69c2d30a0a25d0db342ae7dedea47ff4425a507" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#84ea1270f2d5bd6ad95093153dc2876362da6b7a" dependencies = [ "cursed-semver-parser", "schemars", diff --git a/src/commands/cache.rs b/src/commands/cache.rs index 6eb3f61..a5d320a 100644 --- a/src/commands/cache.rs +++ b/src/commands/cache.rs @@ -6,7 +6,7 @@ use std::{ use clap::Subcommand; use color_eyre::{Result, eyre::Context}; use owo_colors::OwoColorize; -use qpm_package::models::package::PackageConfig; +use qpm_package::models::package::{DependencyId, PackageConfig}; use semver::Version; use walkdir::WalkDir; @@ -58,7 +58,8 @@ impl Command for CacheCommand { } fn clear(clear_params: ClearCommand) -> Result<()> { - match (clear_params.package, clear_params.version) { + let dep_id = clear_params.package.map(DependencyId); + match (dep_id, clear_params.version) { (Some(package), None) => { let mut file_repo = FileRepository::read()?; file_repo.remove_package_versions(&package)?; @@ -131,7 +132,7 @@ fn legacy_fix() -> Result<()> { if !qpm_path.exists() { continue; } - let shared_path = path.join(PackageConfig::read(qpm_path)?.shared_dir); + let shared_path = path.join(PackageConfig::read(qpm_path)?.shared_directory); for entry in WalkDir::new(shared_path) { let entry_path = entry.unwrap().into_path(); diff --git a/src/commands/qmod/manifest.rs b/src/commands/qmod/manifest.rs index 9e294ea..36d0b2e 100644 --- a/src/commands/qmod/manifest.rs +++ b/src/commands/qmod/manifest.rs @@ -61,12 +61,7 @@ pub(crate) fn generate_qmod_manifest( ); println!("Generating mod.json file from template using qpm.shared.json..."); - let binary = shared_package - .config - - .get_so_name() - .file_name() - .map(|s| s.to_string_lossy().to_string()); + let preprocess_data = PreProcessingData { version: shared_package.config.version.to_string(), diff --git a/src/commands/scripts.rs b/src/commands/scripts.rs index afaf4e0..93924d2 100644 --- a/src/commands/scripts.rs +++ b/src/commands/scripts.rs @@ -2,10 +2,13 @@ use std::process::Stdio; use clap::Args; -use color_eyre::eyre::{anyhow, bail}; +use color_eyre::eyre::{ContextCompat, anyhow, bail}; use itertools::Itertools; use qpm_arg_tokenizer::arg::Expression; -use qpm_package::models::package::PackageConfig; +use qpm_package::models::{ + package::PackageConfig, + triplet::{TripletId, default_triplet_id}, +}; use crate::{models::package::PackageConfigExtensions, utils::ndk}; @@ -16,6 +19,9 @@ pub struct ScriptsCommand { script: String, args: Option>, + + #[clap(long, short)] + triplet: Option, } impl Command for ScriptsCommand { @@ -26,17 +32,15 @@ impl Command for ScriptsCommand { let script = scripts.get(&self.script); - if script.is_none() { + let Some(script) = script else { bail!("Could not find script {}", self.script); - } + }; let supplied_args = self.args.unwrap_or_default(); - let Some(script) = script else { - return Ok(()); - }; + let triplet_id = self.triplet.map(TripletId).unwrap_or(default_triplet_id()); - invoke_script(script, &supplied_args, &package)?; + invoke_script(script, &supplied_args, &package, &triplet_id)?; Ok(()) } @@ -46,7 +50,13 @@ pub fn invoke_script( script_commands: &[String], supplied_args: &[String], package: &PackageConfig, + triplet_id: &TripletId, ) -> Result<(), color_eyre::eyre::Error> { + let triplet = package + .triplets + .get_triplet_settings(triplet_id) + .context("Failed to get triplet settings")?; + let android_ndk_home = ndk::resolve_ndk_version(package); for command_str in script_commands { @@ -87,6 +97,14 @@ pub fn invoke_script( .stdout(Stdio::inherit()) .stderr(Stdio::inherit()); + // Set the environment variables for the script + c.envs( + triplet + .env + .iter() + .map(|(k, v)| (format!("QPM_{k}"), v.as_str())), + ); + // Set the environment variable for Android NDK home if provided if let Some(path) = &android_ndk_home { c.env("ANDROID_NDK_HOME", path); diff --git a/src/models/mod_json.rs b/src/models/mod_json.rs index 938bc1b..4ac7648 100644 --- a/src/models/mod_json.rs +++ b/src/models/mod_json.rs @@ -10,7 +10,7 @@ use color_eyre::{Result, eyre::Context}; use itertools::Itertools; use qpm_qmod::models::mod_json::{ModDependency, ModJson}; -use crate::utils::json; +use crate::{commands::Opt, utils::json}; use super::schemas::{SchemaLinks, WithSchema}; @@ -34,7 +34,13 @@ pub struct PreProcessingData { pub version: String, pub mod_id: String, pub mod_name: String, - pub binary: Option, + + pub binaries: Option>, + + pub game_id: Option, + pub game_version: Option, + + pub additional_env: HashMap, } impl ModJsonExtensions for ModJson { @@ -144,16 +150,33 @@ impl ModJsonExtensions for ModJson { } } fn preprocess(s: String, preprocess_data: PreProcessingData) -> String { - s.replace("${version}", &preprocess_data.version) + let mut env = s.replace("${version}", &preprocess_data.version) .replace("${mod_id}", &preprocess_data.mod_id) .replace("${mod_name}", &preprocess_data.mod_name) .replace( - "${binary}", - preprocess_data - .binary - .unwrap_or("${binary}".to_string()) - .as_str(), + "${game_id}", + &preprocess_data.game_id.unwrap_or("".to_string()), ) + .replace( + "${game_version}", + &preprocess_data.game_version.unwrap_or("".to_string()), + ); + + for env_var in preprocess_data.additional_env { + let key = env_var.0; + let value = env_var.1; + // Replace all occurrences of ${QPM_key} with value + env = env.replace(&format!("${{QPM_{key}}}"), &value); + } + + env + // .replace( + // "${binary}", + // preprocess_data + // .binary + // .unwrap_or("${binary}".to_string()) + // .as_str(), + // ) } fn insert_default_mod_binary(existing_json: &mut ModJson, template_mod_json: &mut ModJson) { diff --git a/src/models/package.rs b/src/models/package.rs index c3b1054..56f18c3 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -5,7 +5,11 @@ use std::{ path::Path, }; -use color_eyre::{Result, Section, eyre::Context, owo_colors::OwoColorize}; +use color_eyre::{ + Result, Section, + eyre::{Context, ContextCompat}, + owo_colors::OwoColorize, +}; use itertools::Itertools; use qpm_package::models::{ package::{DependencyId, PackageConfig, QPM_JSON}, @@ -57,6 +61,10 @@ pub trait SharedPackageConfigExtensions: Sized { fn get_restored_triplet(&self) -> &SharedTriplet; } +pub trait SharedTripletExtensions: Sized { + fn get_env(&self) -> HashMap; +} + impl PackageConfigExtensions for PackageConfig { fn read>(dir: P) -> Result { let path = dir.as_ref().join(QPM_JSON); @@ -202,19 +210,26 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { .out_binaries .clone() .unwrap_or_default(), + restored_env: resolved_dep.get_triplet_settings().env.clone(), }; (resolved_dep.0.id.clone(), shared_triplet_dependency_info) } // For each dependency, get the package config and triplet settings let locked_triplet = triplet_dependencies .iter() - .map(|(package_triplet, dependencies)| { + .map(|(package_triplet_id, dependencies)| { + let package_triplet = config + .triplets + .get_triplet_settings(package_triplet_id) + .expect("Failed to get triplet settings"); + let restored_dependencies = dependencies.iter().map(make_shared_triplet).collect(); let shared_triplet = SharedTriplet { restored_dependencies, + env: package_triplet.env.clone(), }; - (package_triplet.clone(), shared_triplet) + (package_triplet_id.clone(), shared_triplet) }) .collect(); @@ -324,3 +339,51 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { .expect("Restored triplet should exist in locked triplet map") } } + +impl SharedTripletExtensions for SharedTriplet { + fn get_env(&self) -> HashMap { + // let dep_env: Vec<_> = self + // .restored_dependencies + // .iter() + // .map(|(dep_id, dep)| -> color_eyre::Result<_> { + // let package = repo + // .get_package(dep_id, &dep.restored_version) + // .context("Failed to get package env")? + // .context("Package should exist in repository for environment variables")?; + + // let triplet = package + // .triplets + // .get_triplet_settings(&dep.restored_triplet) + // .context("Triplet should exist in package for environment variables")?; + + // Ok(triplet.env) + // }) + // .try_collect() + // .context("Failed to collect environment variables")?; + + let dep_env = self + .restored_dependencies + .iter() + .map(|(dep_id, dep)| &dep.restored_env) + .collect_vec(); + + // ensure no key collisions + let mut flattened_map: HashMap = HashMap::with_capacity(dep_env.len()); + for env in dep_env { + for (key, value) in env { + if flattened_map.contains_key(key) { + eprintln!( + "Warning: Environment variable {} is defined multiple times, using the last value.", + key + ); + } + flattened_map.insert(key.clone(), value.clone()); + } + } + + // we allow local environment variables to override the ones in the shared package + flattened_map.extend(self.env.clone()); + + flattened_map + } +} From 0918e941f836d1a7a5c46b00e009e9193afa49e1 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 26 Jul 2025 19:38:46 -0400 Subject: [PATCH 017/119] Refactor manifest and zip operations for triplet support and env support --- Cargo.lock | 2 +- src/commands/qmod/manifest.rs | 41 +++++++++++++++++++++++++---------- src/commands/qmod/zip.rs | 19 +++++++++++----- src/models/mod_json.rs | 5 ++--- 4 files changed, 46 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4b6e37c..9273ed1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2558,7 +2558,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#84ea1270f2d5bd6ad95093153dc2876362da6b7a" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#ad9cef9bf96dd913e42d3330ad486f86d694afbb" dependencies = [ "cursed-semver-parser", "schemars", diff --git a/src/commands/qmod/manifest.rs b/src/commands/qmod/manifest.rs index 36d0b2e..541835d 100644 --- a/src/commands/qmod/manifest.rs +++ b/src/commands/qmod/manifest.rs @@ -2,19 +2,19 @@ use std::path::PathBuf; use clap::Args; use qpm_package::extensions::package_metadata::PackageMetadataExtensions; -use qpm_package::models::shared_package::SharedPackageConfig; +use qpm_package::models::shared_package::{self, SharedPackageConfig}; +use qpm_package::models::triplet::{QPM_ENV_GAME_ID, QPM_ENV_GAME_VERSION, TripletId}; use semver::VersionReq; use qpm_qmod::models::mod_json::ModJson; use crate::models::mod_json::{ModJsonExtensions, PreProcessingData}; use crate::models::package::{PackageConfigExtensions, SharedPackageConfigExtensions}; - - +use crate::repository; use qpm_package::models::package::PackageConfig; -use color_eyre::eyre::ensure; +use color_eyre::eyre::{ContextCompat, ensure}; use color_eyre::Result; @@ -41,17 +41,15 @@ pub struct ManifestQmodOperationArgs { pub(crate) fn execute_qmod_manifest_operation( build_parameters: ManifestQmodOperationArgs, ) -> Result<()> { - let package = PackageConfig::read(".")?; let shared_package = SharedPackageConfig::read(".")?; - let new_json = generate_qmod_manifest(&package, shared_package, build_parameters)?; + let new_json = generate_qmod_manifest(shared_package, build_parameters)?; // Write mod.json new_json.write(&PathBuf::from(ModJson::get_result_name()))?; Ok(()) } pub(crate) fn generate_qmod_manifest( - package: &PackageConfig, shared_package: SharedPackageConfig, build_parameters: ManifestQmodOperationArgs, ) -> Result { @@ -61,16 +59,37 @@ pub(crate) fn generate_qmod_manifest( ); println!("Generating mod.json file from template using qpm.shared.json..."); + let package = &shared_package.config; + let shared_triplet = shared_package.get_restored_triplet(); + + let env = &shared_triplet.env; + let game_version = env.get(QPM_ENV_GAME_VERSION); + let game_id = env.get(QPM_ENV_GAME_ID); + + let binaries = shared_triplet + .out_binaries + .iter() + .map(|p| p.file_name().unwrap().to_string_lossy().to_string()) + .collect(); let preprocess_data = PreProcessingData { version: shared_package.config.version.to_string(), - mod_id: shared_package.config.id.clone(), - mod_name: shared_package.config.name.clone(), - binary, + mod_id: shared_package.config.id.0.clone(), + + game_id: game_id.cloned(), + game_version: game_version.cloned(), + + binaries, + + additional_env: env.clone(), }; + + let repo = repository::useful_default_new(build_parameters.offline)?; + let mut existing_json = ModJson::read_and_preprocess(preprocess_data)?; - let template_mod_json: ModJson = shared_package.to_mod_json(); + let template_mod_json: ModJson = shared_package.clone().to_mod_json(&repo); + let legacy_0_1_0 = package.matches_version(&VersionReq::parse("^0.1.0")?); existing_json = ModJson::merge_modjson(existing_json, template_mod_json, legacy_0_1_0); if let Some(excluded) = build_parameters.exclude_libs { diff --git a/src/commands/qmod/zip.rs b/src/commands/qmod/zip.rs index 481e1a9..1a6d810 100644 --- a/src/commands/qmod/zip.rs +++ b/src/commands/qmod/zip.rs @@ -9,6 +9,7 @@ use itertools::Itertools; use owo_colors::OwoColorize; use qpm_package::extensions::workspace::WorkspaceConfigExtensions; use qpm_package::models::shared_package::SharedPackageConfig; +use qpm_package::models::triplet::{TripletId, default_triplet_id}; use qpm_qmod::models::mod_json::ModJson; use crate::commands::qmod::manifest::{ManifestQmodOperationArgs, generate_qmod_manifest}; @@ -18,8 +19,6 @@ use crate::models::package::PackageConfigExtensions; use crate::models::schemas::{SchemaLinks, WithSchema}; use crate::terminal::colors::QPMColor; - - use qpm_package::models::package::PackageConfig; use color_eyre::eyre::ensure; @@ -57,6 +56,10 @@ pub struct ZipQmodOperationArgs { #[clap(long, default_value = "false")] pub(crate) offline: bool, + /// The triplet to build the mod for + #[clap(long, short)] + pub triplet: Option, + /// Run the clean script before building #[clap(long = "clean", default_value = "false")] pub(crate) clean: bool, @@ -91,11 +94,10 @@ pub(crate) fn execute_qmod_zip_operation(build_parameters: ZipQmodOperationArgs) std::path::Path::new("mod.template.json").exists(), "No mod.template.json found in the current directory, set it up please :) Hint: use \"qmod create\"" ); - let package = PackageConfig::read(".")?; let shared_package = SharedPackageConfig::read(".")?; + let package = PackageConfig::read(".")?; let new_manifest = generate_qmod_manifest( - &package, shared_package, ManifestQmodOperationArgs { exclude_libs: build_parameters.exclude_libs.clone(), @@ -104,12 +106,17 @@ pub(crate) fn execute_qmod_zip_operation(build_parameters: ZipQmodOperationArgs) }, )?; + let triplet = build_parameters + .triplet + .map(TripletId) + .unwrap_or_else(default_triplet_id); + if build_parameters.clean { // Run clean script let clean_script = &package.workspace.get_clean(); if let Some(clean_script) = clean_script { println!("Running clean script"); - scripts::invoke_script(clean_script, &[], &package)?; + scripts::invoke_script(clean_script, &[], &package, &triplet)?; } } @@ -119,7 +126,7 @@ pub(crate) fn execute_qmod_zip_operation(build_parameters: ZipQmodOperationArgs) && !build_parameters.skip_build { println!("Running build script"); - scripts::invoke_script(build_script, &[], &package)?; + scripts::invoke_script(build_script, &[], &package, &triplet)?; } let include_dirs = build_parameters diff --git a/src/models/mod_json.rs b/src/models/mod_json.rs index 4ac7648..fe73019 100644 --- a/src/models/mod_json.rs +++ b/src/models/mod_json.rs @@ -33,9 +33,8 @@ pub trait ModJsonExtensions: Sized { pub struct PreProcessingData { pub version: String, pub mod_id: String, - pub mod_name: String, - pub binaries: Option>, + pub binaries: Vec, pub game_id: Option, pub game_version: Option, @@ -152,7 +151,7 @@ impl ModJsonExtensions for ModJson { fn preprocess(s: String, preprocess_data: PreProcessingData) -> String { let mut env = s.replace("${version}", &preprocess_data.version) .replace("${mod_id}", &preprocess_data.mod_id) - .replace("${mod_name}", &preprocess_data.mod_name) + // .replace("${mod_name}", &preprocess_data.mod_name) .replace( "${game_id}", &preprocess_data.game_id.unwrap_or("".to_string()), From 6432dec052067af5685cf714216f34e180d4f802 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 26 Jul 2025 19:45:01 -0400 Subject: [PATCH 018/119] Enhance triplet handling and preprocessing in manifest generation --- src/commands/qmod/manifest.rs | 21 +++++++----- src/models/mod_json.rs | 61 ++++++++++++++++++----------------- src/models/package.rs | 1 + 3 files changed, 45 insertions(+), 38 deletions(-) diff --git a/src/commands/qmod/manifest.rs b/src/commands/qmod/manifest.rs index 541835d..7b58ae6 100644 --- a/src/commands/qmod/manifest.rs +++ b/src/commands/qmod/manifest.rs @@ -61,6 +61,10 @@ pub(crate) fn generate_qmod_manifest( let package = &shared_package.config; let shared_triplet = shared_package.get_restored_triplet(); + let triplet = package + .triplets + .get_triplet_settings(&shared_package.restored_triplet) + .context("Restored triplet not in package config")?; let env = &shared_triplet.env; @@ -68,14 +72,16 @@ pub(crate) fn generate_qmod_manifest( let game_id = env.get(QPM_ENV_GAME_ID); let binaries = shared_triplet - .out_binaries - .iter() - .map(|p| p.file_name().unwrap().to_string_lossy().to_string()) - .collect(); + .out_binaries + .iter() + .map(|p| p.file_name().unwrap().to_string_lossy().to_string()) + .collect(); + + let mod_id = triplet.qmod_id.unwrap_or(shared_package.config.id.0.clone()); let preprocess_data = PreProcessingData { version: shared_package.config.version.to_string(), - mod_id: shared_package.config.id.0.clone(), + mod_id: mod_id.clone(), game_id: game_id.cloned(), game_version: game_version.cloned(), @@ -84,10 +90,9 @@ pub(crate) fn generate_qmod_manifest( additional_env: env.clone(), }; - - let repo = repository::useful_default_new(build_parameters.offline)?; - let mut existing_json = ModJson::read_and_preprocess(preprocess_data)?; + + let repo = repository::useful_default_new(build_parameters.offline)?; let template_mod_json: ModJson = shared_package.clone().to_mod_json(&repo); let legacy_0_1_0 = package.matches_version(&VersionReq::parse("^0.1.0")?); diff --git a/src/models/mod_json.rs b/src/models/mod_json.rs index fe73019..e4f3420 100644 --- a/src/models/mod_json.rs +++ b/src/models/mod_json.rs @@ -42,6 +42,36 @@ pub struct PreProcessingData { pub additional_env: HashMap, } +impl PreProcessingData { + fn preprocess(self, s: String) -> String { + let mut env = s + .replace("${version}", &self.version) + .replace("${mod_id}", &self.mod_id) + // .replace("${mod_name}", &self.mod_name) + .replace("${game_id}", &self.game_id.unwrap_or("".to_string())) + .replace( + "${game_version}", + &self.game_version.unwrap_or("".to_string()), + ); + + for env_var in self.additional_env { + let key = env_var.0; + let value = env_var.1; + // Replace all occurrences of ${QPM_key} with value + env = env.replace(&format!("${{QPM_{key}}}"), &value); + } + + env + // .replace( + // "${binary}", + // preprocess_data + // .binary + // .unwrap_or("${binary}".to_string()) + // .as_str(), + // ) + } +} + impl ModJsonExtensions for ModJson { fn get_template_name() -> &'static str { "mod.template.json" @@ -63,7 +93,7 @@ impl ModJsonExtensions for ModJson { file.read_to_string(&mut json).expect("Reading data failed"); // Pre process - let processsed = preprocess(json, preprocess_data); + let processsed = preprocess_data.preprocess(json); serde_json::from_str(&processsed).context("Deserializing package failed") } @@ -148,35 +178,6 @@ impl ModJsonExtensions for ModJson { existing_json } } -fn preprocess(s: String, preprocess_data: PreProcessingData) -> String { - let mut env = s.replace("${version}", &preprocess_data.version) - .replace("${mod_id}", &preprocess_data.mod_id) - // .replace("${mod_name}", &preprocess_data.mod_name) - .replace( - "${game_id}", - &preprocess_data.game_id.unwrap_or("".to_string()), - ) - .replace( - "${game_version}", - &preprocess_data.game_version.unwrap_or("".to_string()), - ); - - for env_var in preprocess_data.additional_env { - let key = env_var.0; - let value = env_var.1; - // Replace all occurrences of ${QPM_key} with value - env = env.replace(&format!("${{QPM_{key}}}"), &value); - } - - env - // .replace( - // "${binary}", - // preprocess_data - // .binary - // .unwrap_or("${binary}".to_string()) - // .as_str(), - // ) -} fn insert_default_mod_binary(existing_json: &mut ModJson, template_mod_json: &mut ModJson) { // put it all under library diff --git a/src/models/package.rs b/src/models/package.rs index 56f18c3..e52af0f 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -227,6 +227,7 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { let shared_triplet = SharedTriplet { restored_dependencies, env: package_triplet.env.clone(), + out_binaries: package_triplet.out_binaries.clone().unwrap_or_default(), }; (package_triplet_id.clone(), shared_triplet) From cafd4580e9a4a3dd6788110bb8f1e317137d24ce Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sun, 27 Jul 2025 14:15:00 -0400 Subject: [PATCH 019/119] Add environment variables for triplet and package details in script execution --- src/commands/scripts.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/commands/scripts.rs b/src/commands/scripts.rs index 93924d2..5099024 100644 --- a/src/commands/scripts.rs +++ b/src/commands/scripts.rs @@ -105,6 +105,12 @@ pub fn invoke_script( .map(|(k, v)| (format!("QPM_{k}"), v.as_str())), ); + // QPM defined environment variables + c.env("QPM_ACTIVE_TRIPLET", triplet_id.to_string()) + .env("QPM_QMOD_ID", triplet.qmod_id.as_deref().unwrap_or(package.id.0.as_str())) + .env("QPM_PACKAGE_ID", package.id.to_string()) + .env("QPM_PACKAGE_VERSION", package.version.to_string()); + // Set the environment variable for Android NDK home if provided if let Some(path) = &android_ndk_home { c.env("ANDROID_NDK_HOME", path); From 15e4e5ab65d3f6da5cb98bee38436a9bfdfb933a Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sun, 27 Jul 2025 14:18:29 -0400 Subject: [PATCH 020/119] Add support for printing environment variables in triplet dependency listing --- src/commands/collapse.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/commands/collapse.rs b/src/commands/collapse.rs index f092964..a376dd7 100644 --- a/src/commands/collapse.rs +++ b/src/commands/collapse.rs @@ -23,6 +23,9 @@ pub struct CollapseCommand { #[clap(long, short)] pub triplet: Option, + + #[clap(long, short)] + pub env: bool, } impl Command for CollapseCommand { @@ -33,7 +36,7 @@ impl Command for CollapseCommand { Some(triplet) => { let triplet_id = TripletId(triplet); - list_triplet_dependencies(package, &repo, &triplet_id)? + list_triplet_dependencies(package, &repo, &triplet_id, self.env)? } None => { println!("Listing dependencies for all triplets"); @@ -46,7 +49,7 @@ impl Command for CollapseCommand { "Listing dependencies for triplet {}", triplet.0.triplet_id_color() ); - list_triplet_dependencies(package.clone(), &repo, &triplet.0).with_context( + list_triplet_dependencies(package.clone(), &repo, &triplet.0, self.env).with_context( || { format!( "Failed to list dependencies for triplet {}", @@ -65,6 +68,7 @@ fn list_triplet_dependencies( package: PackageConfig, repo: &impl repository::Repository, triplet_id: &TripletId, + print_env: bool, ) -> Result<(), color_eyre::eyre::Error> { let resolved = resolve(&package, repo, triplet_id)?; for resolved_dep in resolved.sorted_by(|a, b| a.0.id.cmp(&b.0.id)) { @@ -83,6 +87,13 @@ fn list_triplet_dependencies( sum.to_string().yellow() ); + if print_env { + println!("Environment variables:"); + for (key, value) in triplet_config.env.iter() { + println!(" - {}: {}", key.cyan(), value.green()); + } + } + for (dep_id, shared_dep) in triplet_config.dependencies.iter() { println!( " - {}: ({})", From 46dfb2e332cdafe972bd4725f3e63c87e6b926c3 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sun, 27 Jul 2025 15:00:07 -0400 Subject: [PATCH 021/119] Update dependencies and enhance triplet support across commands - Bump versions for keyring, rustc-demangle, and rustls packages. - Add triplet handling in package creation and editing commands. - Introduce QPkg command for managing QPKG operations. - Refactor manifest generation to utilize triplet data. - Clean up unused code and improve error handling in publish command. --- Cargo.lock | 15 ++-- src/commands/mod.rs | 6 ++ src/commands/package/create.rs | 9 +- src/commands/package/edit.rs | 28 +----- src/commands/package/edit_extra.rs | 68 ++++++--------- src/commands/package/format.rs | 24 ++++-- src/commands/publish/mod.rs | 131 +++++++++++++++-------------- src/commands/qmod/manifest.rs | 15 ++-- src/commands/qmod/zip.rs | 12 +-- src/commands/qpkg.rs | 17 ++++ src/commands/restore.rs | 2 - src/models/package.rs | 1 - src/resolver/dependency.rs | 2 +- 13 files changed, 157 insertions(+), 173 deletions(-) create mode 100644 src/commands/qpkg.rs diff --git a/Cargo.lock b/Cargo.lock index 9273ed1..1f41798 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2025,11 +2025,12 @@ dependencies = [ [[package]] name = "keyring" -version = "3.6.2" +version = "3.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1961983669d57bdfe6c0f3ef8e4c229b5ef751afcc7d87e4271d2f71f6ccfa8b" +checksum = "eebcc3aff044e5944a8fbaf69eb277d11986064cba30c468730e8b9909fb551c" dependencies = [ "log", + "zeroize", ] [[package]] @@ -2558,7 +2559,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#ad9cef9bf96dd913e42d3330ad486f86d694afbb" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#c6326babd6c260f674dd7e6975f6d71b867945b9" dependencies = [ "cursed-semver-parser", "schemars", @@ -2793,9 +2794,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -2818,9 +2819,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.29" +version = "0.23.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" +checksum = "069a8df149a16b1a12dcc31497c3396a173844be3cac4bd40c9e7671fef96671" dependencies = [ "once_cell", "ring", diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 5b9884d..b3aa119 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -19,6 +19,7 @@ pub mod qmod; pub mod restore; pub mod scripts; pub mod version; +pub mod qpkg; #[cfg(feature = "templatr")] pub mod templatr; @@ -81,6 +82,9 @@ pub enum MainCommand { #[command(hide = true)] GenSchema(genschema::GenSchemaCommand), + + /// QPKG control + QPkg(qpkg::QPkgCommand), } impl Command for MainCommand { @@ -104,6 +108,8 @@ impl Command for MainCommand { MainCommand::Scripts(s) => s.execute(), MainCommand::Version(v) => v.execute(), MainCommand::GenSchema(g) => g.execute(), + MainCommand::QPkg(q) => q.execute(), + #[cfg(feature = "templatr")] MainCommand::Templatr(c) => c.execute(), } diff --git a/src/commands/package/create.rs b/src/commands/package/create.rs index 656407d..ac52755 100644 --- a/src/commands/package/create.rs +++ b/src/commands/package/create.rs @@ -38,20 +38,15 @@ impl Command for PackageOperationCreateArgs { Option::None => self.name.to_lowercase(), }; - let package_info = PackageMetadata { - name: self.name, - url: None, - }; - let package = PackageConfig { id: DependencyId(id), version: self.version, additional_data: Default::default(), - triplet: Default::default(), + triplets: Default::default(), cmake: Default::default(), toolchain_out: Some(Path::new("toolchain.json").to_owned()), - shared_directories: vec![Path::new("shared").to_owned()], + shared_directory: Path::new("shared").to_owned(), dependencies_directory: Path::new("extern").to_owned(), workspace: Default::default(), config_version: package::package_target_version(), diff --git a/src/commands/package/edit.rs b/src/commands/package/edit.rs index d3d35d4..d980ea2 100644 --- a/src/commands/package/edit.rs +++ b/src/commands/package/edit.rs @@ -11,15 +11,7 @@ use crate::{ #[derive(Args, Debug, Clone)] pub struct EditArgs { - ///Edit the id property of the package - #[clap(long)] - pub id: Option, - ///Edit the name property of the package - #[clap(long)] - pub name: Option, - ///Edit the url property of the package - #[clap(long)] - pub url: Option, + ///Edit the version property of the package #[clap(long)] pub version: Option, @@ -32,18 +24,6 @@ impl Command for EditArgs { fn execute(self) -> color_eyre::Result<()> { let mut package = PackageConfig::read(".")?; let mut any_changed = false; - if let Some(id) = self.id { - package_set_id(&mut package, id); - any_changed = true; - } - if let Some(name) = self.name { - package_set_name(&mut package, name); - any_changed = true; - } - if let Some(url) = self.url { - package_set_url(&mut package, url); - any_changed = true; - } if let Some(version) = self.version { package_set_version(&mut package, version); any_changed = true; @@ -64,12 +44,6 @@ fn package_set_id(package: &mut PackageConfig, id: String) { package.id = DependencyId(id); } - -fn package_set_url(package: &mut PackageConfig, url: String) { - println!("Setting package url: {url}"); - package.url = Option::Some(url); -} - fn package_set_version(package: &mut PackageConfig, version: Version) { println!("Setting package version: {version}"); package.version = version; diff --git a/src/commands/package/edit_extra.rs b/src/commands/package/edit_extra.rs index 61c1569..0a2d121 100644 --- a/src/commands/package/edit_extra.rs +++ b/src/commands/package/edit_extra.rs @@ -1,5 +1,10 @@ use clap::{Args, Subcommand}; -use qpm_package::models::{package::PackageConfig, shared_package::SharedPackageConfig}; +use color_eyre::eyre::ContextCompat; +use qpm_package::models::{ + package::PackageConfig, + shared_package::SharedPackageConfig, + triplet::{PackageTriplet, TripletId}, +}; use crate::{ commands::Command, @@ -11,56 +16,43 @@ use crate::{ #[derive(Args, Debug, Clone)] pub struct EditExtraArgs { - /// Provide a link to the mod #[clap(long = "modLink")] pub mod_link: Option, - /// Additional options for compilation and edits to compilation related files. - #[clap(subcommand)] - pub compile_options: Option, + /// Provide a qmod id to set the extra for + #[clap(long = "qmodId")] + pub qmod_id: Option, + + /// The triplet to edit the extra for + #[clap(long, short)] + pub triplet: String, #[clap(long, default_value = "false")] offline: bool, } -#[derive(Subcommand, Debug, Clone)] - -pub enum EditExtraOptions { - /// Additional options for compilation and edits to compilation related files. - CompileOptions(CompileOptionsEditArgs), -} - -#[derive(Args, Debug, Clone)] - -pub struct CompileOptionsEditArgs { - /// Additional include paths to add, relative to the extern directory. Prefix with a '-' to remove that entry - #[clap(long = "includePaths")] - pub include_paths: Option, - /// Additional system include paths to add, relative to the extern directory. Prefix with a '-' to remove that entry - #[clap(long = "systemIncludes")] - pub system_includes: Option, - /// Additional C++ features to add. Prefix with a '-' to remove that entry - #[clap(long = "cppFeatures")] - pub cpp_features: Option, - /// Additional C++ flags to add. Prefix with a '-' to remove that entry - #[clap(long = "cppFlags")] - pub cpp_flags: Option, - /// Additional C flags to add. Prefix with a '-' to remove that entry - #[clap(long = "cFlags")] - pub c_flags: Option, -} - impl Command for EditExtraArgs { fn execute(self) -> color_eyre::Result<()> { let mut package = PackageConfig::read(".")?; + let triplet = package + .triplets + .get_triplet_mut(&TripletId(self.triplet)) + .context("Failed to get triplet settings")?; + let mut any_changed = false; - + if let Some(mod_link) = self.mod_link { - package_edit_extra_mod_link(&mut package, mod_link); + println!("Setting mod_link: {mod_link:#?}"); + triplet.qmod_url = Some(mod_link); any_changed = true; } + if let Some(qmod_id) = self.qmod_id { + println!("Setting qmod_id: {qmod_id:#?}"); + triplet.qmod_id = Some(qmod_id); + any_changed = true; + } if any_changed { package.write(".")?; @@ -71,11 +63,3 @@ impl Command for EditExtraArgs { Ok(()) } } - - - -pub fn package_edit_extra_mod_link(package: &mut PackageConfig, mod_link: String) { - println!("Setting mod_link: {mod_link:#?}"); - package.additional_data.mod_link = Some(mod_link); -} - diff --git a/src/commands/package/format.rs b/src/commands/package/format.rs index 7d4f4c7..00a85a8 100644 --- a/src/commands/package/format.rs +++ b/src/commands/package/format.rs @@ -1,14 +1,18 @@ use std::fs; use clap::Args; -use color_eyre::Result; -use qpm_package::models::package::PackageConfig; +use color_eyre::{eyre::ContextCompat, Result}; +use qpm_package::models::{package::PackageConfig, shared_package::SharedPackageConfig, triplet::default_triplet_id}; use crate::{commands::Command, models::package::PackageConfigExtensions}; #[derive(Args, Debug, Clone)] -pub struct FormatArgs {} +pub struct FormatArgs { + /// Triplet to format the package for + #[clap(long, short)] + pub triplet: Option, +} impl Command for FormatArgs { fn execute(self) -> color_eyre::Result<()> { @@ -19,10 +23,14 @@ impl Command for FormatArgs { pub fn reserialize_package(sort: bool) -> Result<()> { let mut package = PackageConfig::read(".")?; + let triplet = package + .triplets + .get_triplet_mut(&default_triplet_id()) + .context("Failed to get triplet settings")?; if sort { // Sort the dependencies by id - package.dependencies.sort_by(|a, b| a.id.cmp(&b.id)); + // triplet.dependencies.sort_by(|a, b| a.id.cmp(&b.id)); } // Write the package back to the file @@ -35,10 +43,10 @@ pub fn reserialize_package(sort: bool) -> Result<()> { if sort { // Sort the dependencies by id - shared_package - .config - .dependencies - .sort_by(|a, b| a.id.cmp(&b.id)); + // shared_package + // .config + // .dependencies + // .sort_by(|a, b| a.id.cmp(&b.id)); } // Write the shared package back to the file diff --git a/src/commands/publish/mod.rs b/src/commands/publish/mod.rs index be92b60..629a274 100644 --- a/src/commands/publish/mod.rs +++ b/src/commands/publish/mod.rs @@ -1,7 +1,11 @@ -use clap::Args; -use color_eyre::eyre::{Context, anyhow, bail}; +use clap::{Args, Parser, ValueEnum}; +use color_eyre::eyre::{Context, ContextCompat, anyhow, bail}; use owo_colors::OwoColorize; -use qpm_package::models::{package::PackageConfig, shared_package::SharedPackageConfig}; +use qpm_package::models::{ + package::PackageConfig, + shared_package::{SharedPackageConfig, SharedTriplet}, + triplet::TripletId, +}; use crate::{ models::{config::get_publish_keyring, package::PackageConfigExtensions}, @@ -11,84 +15,39 @@ use crate::{ use super::Command; +#[derive(ValueEnum, Debug, Clone)] +enum Backend { + QPackages, +} + #[derive(Args, Debug, Clone)] pub struct PublishCommand { + /// The url to the qpkg + pub qpkg_url: String, + + #[clap(long, default_value = "qpackages")] + pub backend: Backend, + /// the authorization header to use for publishing, if present + #[clap(long = "token")] pub publish_auth: Option, } impl Command for PublishCommand { fn execute(self) -> color_eyre::Result<()> { let package = PackageConfig::read(".")?; - if package.url.is_none() { - bail!("Package without url can not be published!"); - } let qpackages = QPMRepository::default(); let shared_package = SharedPackageConfig::read(".")?; - let resolved_deps = &shared_package.restored_dependencies; - - // check if all dependencies are available off of qpackages - for shared_dependency in resolved_deps { - match qpackages - .get_package(&shared_dependency.dependency.id, &shared_dependency.version)? - { - Option::Some(_s) => {} - Option::None => { - bail!( - "dependency {} was not available on qpackages in the given version range", - &shared_dependency.dependency.id - ); - } - }; - } - // check if all required dependencies are in the restored dependencies, and if they satisfy the version ranges - for dependency in &shared_package.config.dependencies { - // if we can not find any dependency that matches ID and version satisfies given range, then we are missing a dep - let el = shared_package - .restored_dependencies - .iter() - .find(|el| el.dependency.id == dependency.id) - .ok_or_else(|| { - anyhow!("Restored dependencies does not contain {}", dependency.id) - })?; - - // if version doesn't match range, panic - if !dependency.version_range.matches(&el.version) { - bail!( - "Restored dependency {} version ({}) does not satisfy stated range ({})", - dependency.id.bright_red(), - el.version.to_string().bright_green(), - dependency.version_range.to_string().bright_blue() - ); - } + for (triplet_id, shared_triplet) in &shared_package.locked_triplet { + check_triplet(&package, &qpackages, &triplet_id, &shared_triplet) + .with_context(|| format!("Triplet {triplet_id}"))?; } - // check if url is set to download headers - if shared_package.config.url.is_none() { - bail!( - "info.url is null, please make sure to init this with the base link to your repo, e.g. '{}'", - "https://github.com/RedBrumbler/QuestPackageManager-Rust".bright_yellow() - ); - } - // check if this is header only, if it's not header only check if the so_link is set, if not, panic - if !shared_package - .config - - .additional_data - .headers_only - .unwrap_or(false) - && shared_package.config.additional_data.so_link.is_none() - { - bail!( - "soLink is not set in the package config, but this package is not header only, please make sure to either add the soLink or to make the package header only." - ); - } - // TODO: Implement a check that gets the repo and checks if the shared folder and subfolder exists, if not it throws an error and won't let you publish if let Some(key) = &self.publish_auth { QPMRepository::publish_package(&shared_package, key)?; @@ -112,3 +71,49 @@ impl Command for PublishCommand { Ok(()) } } + +fn check_triplet( + package: &PackageConfig, + qpackages: &QPMRepository, + triplet_id: &TripletId, + shared_triplet: &SharedTriplet, +) -> Result<(), color_eyre::eyre::Error> { + let triplet = package + .triplets + .get_triplet(&triplet_id) + .context("Failed to get triplet settings")?; + let resolved_deps = &shared_triplet.restored_dependencies; + for (dep_id, dep) in resolved_deps { + if let Option::None = qpackages.get_package(&dep_id, &dep.restored_version)? { + bail!( + "dependency {} was not available on qpackages in the given version range", + &dep_id.dependency_id_color() + ); + }; + } + for (dep_id, dependency) in &triplet.dependencies { + // if we can not find any dependency that matches ID and version satisfies given range, then we are missing a dep + let el = shared_triplet + .restored_dependencies + .get(dep_id) + .context(format!( + "Dependency {} not found in restored dependencies", + dep_id.dependency_id_color() + ))?; + + // if version doesn't match range, panic + if !dependency.version_range.matches(&el.restored_version) { + bail!( + "Restored dependency {} version ({}) does not satisfy stated range ({})", + dep_id.dependency_id_color(), + el.restored_version.red(), + dependency.version_range.green() + ); + } + } + + // check if url is set to download headers + + + Ok(()) +} diff --git a/src/commands/qmod/manifest.rs b/src/commands/qmod/manifest.rs index 7b58ae6..f051406 100644 --- a/src/commands/qmod/manifest.rs +++ b/src/commands/qmod/manifest.rs @@ -1,7 +1,6 @@ use std::path::PathBuf; use clap::Args; -use qpm_package::extensions::package_metadata::PackageMetadataExtensions; use qpm_package::models::shared_package::{self, SharedPackageConfig}; use qpm_package::models::triplet::{QPM_ENV_GAME_ID, QPM_ENV_GAME_VERSION, TripletId}; use semver::VersionReq; @@ -41,15 +40,17 @@ pub struct ManifestQmodOperationArgs { pub(crate) fn execute_qmod_manifest_operation( build_parameters: ManifestQmodOperationArgs, ) -> Result<()> { + let package = PackageConfig::read(".")?; let shared_package = SharedPackageConfig::read(".")?; - let new_json = generate_qmod_manifest(shared_package, build_parameters)?; + let new_json = generate_qmod_manifest(&package, shared_package, build_parameters)?; // Write mod.json new_json.write(&PathBuf::from(ModJson::get_result_name()))?; Ok(()) } pub(crate) fn generate_qmod_manifest( + package: &PackageConfig, shared_package: SharedPackageConfig, build_parameters: ManifestQmodOperationArgs, ) -> Result { @@ -59,7 +60,6 @@ pub(crate) fn generate_qmod_manifest( ); println!("Generating mod.json file from template using qpm.shared.json..."); - let package = &shared_package.config; let shared_triplet = shared_package.get_restored_triplet(); let triplet = package .triplets @@ -71,13 +71,16 @@ pub(crate) fn generate_qmod_manifest( let game_version = env.get(QPM_ENV_GAME_VERSION); let game_id = env.get(QPM_ENV_GAME_ID); - let binaries = shared_triplet + let binaries = triplet .out_binaries .iter() + .flatten() .map(|p| p.file_name().unwrap().to_string_lossy().to_string()) .collect(); - let mod_id = triplet.qmod_id.unwrap_or(shared_package.config.id.0.clone()); + let mod_id = triplet + .qmod_id + .unwrap_or(shared_package.config.id.0.clone()); let preprocess_data = PreProcessingData { version: shared_package.config.version.to_string(), @@ -91,7 +94,7 @@ pub(crate) fn generate_qmod_manifest( additional_env: env.clone(), }; let mut existing_json = ModJson::read_and_preprocess(preprocess_data)?; - + let repo = repository::useful_default_new(build_parameters.offline)?; let template_mod_json: ModJson = shared_package.clone().to_mod_json(&repo); diff --git a/src/commands/qmod/zip.rs b/src/commands/qmod/zip.rs index 1a6d810..05af7aa 100644 --- a/src/commands/qmod/zip.rs +++ b/src/commands/qmod/zip.rs @@ -56,10 +56,6 @@ pub struct ZipQmodOperationArgs { #[clap(long, default_value = "false")] pub(crate) offline: bool, - /// The triplet to build the mod for - #[clap(long, short)] - pub triplet: Option, - /// Run the clean script before building #[clap(long = "clean", default_value = "false")] pub(crate) clean: bool, @@ -97,7 +93,10 @@ pub(crate) fn execute_qmod_zip_operation(build_parameters: ZipQmodOperationArgs) let shared_package = SharedPackageConfig::read(".")?; let package = PackageConfig::read(".")?; + let triplet = shared_package.restored_triplet.clone(); + let new_manifest = generate_qmod_manifest( + &package, shared_package, ManifestQmodOperationArgs { exclude_libs: build_parameters.exclude_libs.clone(), @@ -106,11 +105,6 @@ pub(crate) fn execute_qmod_zip_operation(build_parameters: ZipQmodOperationArgs) }, )?; - let triplet = build_parameters - .triplet - .map(TripletId) - .unwrap_or_else(default_triplet_id); - if build_parameters.clean { // Run clean script let clean_script = &package.workspace.get_clean(); diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs new file mode 100644 index 0000000..b2978ed --- /dev/null +++ b/src/commands/qpkg.rs @@ -0,0 +1,17 @@ +use clap::Args; + +use super::Command; + +/// Templatr rust rewrite (implementation not based on the old one) +#[derive(Args, Clone, Debug)] +pub struct QPkgCommand { + +} + +impl Command for QPkgCommand { + fn execute(self) -> color_eyre::Result<()> { + // Placeholder for QPKG command execution logic + println!("Executing QPKG command..."); + Ok(()) + } +} diff --git a/src/commands/restore.rs b/src/commands/restore.rs index c954538..2148d4c 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -134,8 +134,6 @@ impl Command for RestoreCommand { }; // write the ndk path to a file if available - let _config = get_combine_config(); - let shared_package = shared_package_opt.expect("SharedPackage is None somehow!"); // always write to reflect config changes diff --git a/src/models/package.rs b/src/models/package.rs index e52af0f..56f18c3 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -227,7 +227,6 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { let shared_triplet = SharedTriplet { restored_dependencies, env: package_triplet.env.clone(), - out_binaries: package_triplet.out_binaries.clone().unwrap_or_default(), }; (package_triplet_id.clone(), shared_triplet) diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index e67ce01..f9bca32 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -49,7 +49,7 @@ where repo: &'b R, } #[derive(Clone, Debug, Eq, PartialEq, Hash)] -struct PubgrubDependencyTarget(pub DependencyId, pub TripletId); +pub struct PubgrubDependencyTarget(pub DependencyId, pub TripletId); impl Display for PubgrubDependencyTarget { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { From 3a861f4964d6af42624611631453673e55dacded Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sun, 27 Jul 2025 15:55:31 -0400 Subject: [PATCH 022/119] It all compiles. QPkg bundling and triplet combined building --- Cargo.lock | 5 +- Cargo.toml | 12 +++- src/commands/build.rs | 110 +++++++++++++++++++++++++++++ src/commands/collapse.rs | 2 +- src/commands/dependency.rs | 5 +- src/commands/install.rs | 9 +-- src/commands/list/versions.rs | 1 - src/commands/mod.rs | 8 ++- src/commands/package/edit.rs | 1 - src/commands/package/edit_extra.rs | 6 +- src/commands/package/format.rs | 2 +- src/commands/publish/mod.rs | 18 ++--- src/commands/qmod/manifest.rs | 4 +- src/commands/qmod/zip.rs | 1 - src/commands/qpkg.rs | 72 ++++++++++++++++++- src/commands/restore.rs | 15 ++-- src/lib.rs | 1 - src/main.rs | 1 - src/models/mod_json.rs | 2 +- src/models/package.rs | 27 +++---- src/models/package_files.rs | 6 +- src/models/toolchain.rs | 2 +- src/repository/local.rs | 7 +- src/repository/memcached.rs | 2 +- src/repository/mod.rs | 2 +- src/repository/multi.rs | 4 +- src/repository/qpackages.rs | 25 +++---- src/resolver/dependency.rs | 10 +-- src/terminal/colors.rs | 14 ++-- src/utils/android.rs | 2 +- 30 files changed, 271 insertions(+), 105 deletions(-) create mode 100644 src/commands/build.rs diff --git a/Cargo.lock b/Cargo.lock index 1f41798..69ac293 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -564,9 +564,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clone" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "either" @@ -2528,6 +2528,7 @@ dependencies = [ "cursed-semver-parser", "dirs", "fs_extra", + "gix", "hex", "itertools", "keyring", diff --git a/Cargo.toml b/Cargo.toml index 3fbfb33..9bbf13d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,10 +17,11 @@ required-features = [] [features] -default = ["templatr", "network_test", "cli"] +default = ["templatr", "network_test", "cli", "gitoxide"] templatr = ["dep:templatr"] cli = ["dep:clap", "dep:clap_complete", "dep:vergen", "dep:pbr"] network_test = [] +gitoxide = ["dep:gix"] [build-dependencies] vergen = { version = "8", features = [ @@ -63,6 +64,15 @@ reqwest = { version = "0.12", features = [ "rustls-tls", ], default-features = false } +gix = { version = "*", features = [ + "command", + "attributes", + "progress-tree", + "worktree-mutation", + "blocking-network-client", + "blocking-http-transport-reqwest-rust-tls", +], optional = true, default-features = false } + clap = { version = "4", features = ["derive"], optional = true } clap_complete = { version = "4", optional = true } diff --git a/src/commands/build.rs b/src/commands/build.rs new file mode 100644 index 0000000..eb6b4d4 --- /dev/null +++ b/src/commands/build.rs @@ -0,0 +1,110 @@ +use std::path::{Path, PathBuf}; + +use clap::Args; +use color_eyre::eyre::{Context, ContextCompat}; +use itertools::Itertools; +use qpm_package::{ + extensions::workspace::WorkspaceConfigExtensions, + models::{package::PackageConfig, shared_package::SharedPackageConfig}, +}; + +use crate::{ + commands::scripts, models::package::PackageConfigExtensions, repository, resolver::dependency, + terminal::colors::QPMColor, +}; + +use super::Command; + +/// Templatr rust rewrite (implementation not based on the old one) +#[derive(Args, Clone, Debug)] +pub struct BuildCommand { + pub args: Option>, + #[clap(short, long, default_value = "false")] + pub offline: bool, + + #[clap(short, long, default_value = "false")] + pub out_dir: Option, +} + +impl Command for BuildCommand { + fn execute(self) -> color_eyre::Result<()> { + let package = PackageConfig::read(".")?; + let mut shared_package = SharedPackageConfig::read(".")?; + + let out_dir = self + .out_dir + .unwrap_or_else(|| package.dependencies_directory.join("build")); + + let script = package + .workspace + .get_build() + .context("Failed to get build script from workspace")?; + + let args = self.args.unwrap_or_default(); + + let mut repo = repository::useful_default_new(self.offline)?; + + for (triplet_id, shared_triplet) in &shared_package.locked_triplet { + let triplet = package + .triplets + .get_triplet_settings(triplet_id) + .context("Failed to get triplet settings")?; + + println!( + "Restoring dependencies for triplet {}", + triplet_id.triplet_id_color() + ); + // restore for triplet + let resolved_deps = + dependency::locked_resolve(&shared_package, &repo, shared_triplet)?.collect_vec(); + + // now restore + dependency::restore(".", &shared_package, triplet_id, &resolved_deps, &mut repo)?; + shared_package.restored_triplet = triplet_id.clone(); + shared_package.write(".")?; + + // run builld + println!( + "Building QPKG for triplet {}", + triplet_id.triplet_id_color() + ); + scripts::invoke_script(script, &args, &package, triplet_id)?; + + // now copy binaries + copy_bins( + &out_dir, + triplet_id, + &triplet.out_binaries.unwrap_or_default(), + )?; + } + + Ok(()) + } +} + +fn copy_bins( + out_dir: &Path, + triplet_id: &qpm_package::models::triplet::TripletId, + out_binaries: &[PathBuf], +) -> color_eyre::Result<()> { + for binary in out_binaries { + // create the output directory if it doesn't exist + let out_path = out_dir.join(triplet_id.to_string()).join(binary); + + std::fs::create_dir_all(out_path.parent().unwrap()).with_context(|| { + format!( + "Failed to create output directory {}", + out_path.parent().unwrap().display() + ) + })?; + + std::fs::copy(binary, &out_path).with_context(|| { + format!( + "Failed to copy binary {} to output directory {}", + binary.display(), + out_dir.display() + ) + })?; + } + Ok(()) +} diff --git a/src/commands/collapse.rs b/src/commands/collapse.rs index a376dd7..7a01088 100644 --- a/src/commands/collapse.rs +++ b/src/commands/collapse.rs @@ -4,7 +4,7 @@ use itertools::Itertools; use owo_colors::OwoColorize; use qpm_package::models::{ package::PackageConfig, - triplet::{self, TripletId}, + triplet::TripletId, }; use crate::{ diff --git a/src/commands/dependency.rs b/src/commands/dependency.rs index d3fd20b..3e95be1 100644 --- a/src/commands/dependency.rs +++ b/src/commands/dependency.rs @@ -4,17 +4,16 @@ use color_eyre::{ Result, eyre::{Context, ContextCompat, bail}, }; -use owo_colors::OwoColorize; use qpm_package::models::{ package::{DependencyId, PackageConfig}, shared_package::SharedPackageConfig, - triplet::{self, PackageTripletDependency, TripletId}, + triplet::{PackageTripletDependency, TripletId}, }; use semver::{Version, VersionReq}; use crate::{ models::package::{PackageConfigExtensions, SharedPackageConfigExtensions}, - repository::{self, Repository, local::FileRepository}, + repository::{self, Repository}, terminal::colors::QPMColor, }; diff --git a/src/commands/install.rs b/src/commands/install.rs index 4884521..7e7f5e2 100644 --- a/src/commands/install.rs +++ b/src/commands/install.rs @@ -1,14 +1,11 @@ -use std::{collections::HashSet, path::PathBuf}; +use std::path::PathBuf; use clap::Args; use color_eyre::eyre::{bail, Context, ContextCompat}; -use qpm_package::{ - extensions::package_metadata::PackageMetadataExtensions, - models::{package::PackageConfig, shared_package::SharedPackageConfig}, -}; +use qpm_package::models::shared_package::SharedPackageConfig; use crate::{ - models::package::{PackageConfigExtensions, SharedPackageConfigExtensions}, + models::package::PackageConfigExtensions, repository::{self, local::FileRepository}, }; diff --git a/src/commands/list/versions.rs b/src/commands/list/versions.rs index 6cf05be..323fe7b 100644 --- a/src/commands/list/versions.rs +++ b/src/commands/list/versions.rs @@ -1,5 +1,4 @@ use clap::Args; -use color_eyre::eyre::ContextCompat; use owo_colors::OwoColorize; use qpm_package::models::package::DependencyId; diff --git a/src/commands/mod.rs b/src/commands/mod.rs index b3aa119..44ac4da 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -16,10 +16,11 @@ pub mod ndk; pub mod package; pub mod publish; pub mod qmod; +pub mod qpkg; pub mod restore; pub mod scripts; +pub mod build; pub mod version; -pub mod qpkg; #[cfg(feature = "templatr")] pub mod templatr; @@ -85,6 +86,9 @@ pub enum MainCommand { /// QPKG control QPkg(qpkg::QPkgCommand), + + /// Triplet commands + Triplet(build::BuildCommand), } impl Command for MainCommand { @@ -108,7 +112,9 @@ impl Command for MainCommand { MainCommand::Scripts(s) => s.execute(), MainCommand::Version(v) => v.execute(), MainCommand::GenSchema(g) => g.execute(), + MainCommand::QPkg(q) => q.execute(), + MainCommand::Triplet(t) => t.execute(), #[cfg(feature = "templatr")] MainCommand::Templatr(c) => c.execute(), diff --git a/src/commands/package/edit.rs b/src/commands/package/edit.rs index d980ea2..595374f 100644 --- a/src/commands/package/edit.rs +++ b/src/commands/package/edit.rs @@ -5,7 +5,6 @@ use semver::Version; use crate::{ commands::Command, models::package::PackageConfigExtensions, - repository::{self}, }; #[derive(Args, Debug, Clone)] diff --git a/src/commands/package/edit_extra.rs b/src/commands/package/edit_extra.rs index 0a2d121..8cc304e 100644 --- a/src/commands/package/edit_extra.rs +++ b/src/commands/package/edit_extra.rs @@ -1,16 +1,14 @@ -use clap::{Args, Subcommand}; +use clap::Args; use color_eyre::eyre::ContextCompat; use qpm_package::models::{ package::PackageConfig, shared_package::SharedPackageConfig, - triplet::{PackageTriplet, TripletId}, + triplet::TripletId, }; use crate::{ commands::Command, models::package::PackageConfigExtensions, - repository::{self}, - utils::toggle::Toggle, }; #[derive(Args, Debug, Clone)] diff --git a/src/commands/package/format.rs b/src/commands/package/format.rs index 00a85a8..0dac920 100644 --- a/src/commands/package/format.rs +++ b/src/commands/package/format.rs @@ -39,7 +39,7 @@ pub fn reserialize_package(sort: bool) -> Result<()> { // Check if the qpm.shared.json file exists if fs::exists("qpm.shared.json").unwrap_or(false) { // Read the shared package - let mut shared_package = SharedPackageConfig::read(".")?; + let shared_package = SharedPackageConfig::read(".")?; if sort { // Sort the dependencies by id diff --git a/src/commands/publish/mod.rs b/src/commands/publish/mod.rs index 629a274..e1b7663 100644 --- a/src/commands/publish/mod.rs +++ b/src/commands/publish/mod.rs @@ -1,5 +1,5 @@ -use clap::{Args, Parser, ValueEnum}; -use color_eyre::eyre::{Context, ContextCompat, anyhow, bail}; +use clap::{Args, ValueEnum}; +use color_eyre::eyre::{Context, ContextCompat, bail}; use owo_colors::OwoColorize; use qpm_package::models::{ package::PackageConfig, @@ -27,7 +27,7 @@ pub struct PublishCommand { pub qpkg_url: String, #[clap(long, default_value = "qpackages")] - pub backend: Backend, + backend: Backend, /// the authorization header to use for publishing, if present #[clap(long = "token")] @@ -43,12 +43,10 @@ impl Command for PublishCommand { let shared_package = SharedPackageConfig::read(".")?; for (triplet_id, shared_triplet) in &shared_package.locked_triplet { - check_triplet(&package, &qpackages, &triplet_id, &shared_triplet) + check_triplet(&package, &qpackages, triplet_id, shared_triplet) .with_context(|| format!("Triplet {triplet_id}"))?; } - - if let Some(key) = &self.publish_auth { QPMRepository::publish_package(&shared_package, key)?; } else { @@ -80,11 +78,14 @@ fn check_triplet( ) -> Result<(), color_eyre::eyre::Error> { let triplet = package .triplets - .get_triplet(&triplet_id) + .get_triplet(triplet_id) .context("Failed to get triplet settings")?; let resolved_deps = &shared_triplet.restored_dependencies; for (dep_id, dep) in resolved_deps { - if let Option::None = qpackages.get_package(&dep_id, &dep.restored_version)? { + if qpackages + .get_package(dep_id, &dep.restored_version)? + .is_none() + { bail!( "dependency {} was not available on qpackages in the given version range", &dep_id.dependency_id_color() @@ -114,6 +115,5 @@ fn check_triplet( // check if url is set to download headers - Ok(()) } diff --git a/src/commands/qmod/manifest.rs b/src/commands/qmod/manifest.rs index f051406..df2e936 100644 --- a/src/commands/qmod/manifest.rs +++ b/src/commands/qmod/manifest.rs @@ -1,8 +1,8 @@ use std::path::PathBuf; use clap::Args; -use qpm_package::models::shared_package::{self, SharedPackageConfig}; -use qpm_package::models::triplet::{QPM_ENV_GAME_ID, QPM_ENV_GAME_VERSION, TripletId}; +use qpm_package::models::shared_package::SharedPackageConfig; +use qpm_package::models::triplet::{QPM_ENV_GAME_ID, QPM_ENV_GAME_VERSION}; use semver::VersionReq; use qpm_qmod::models::mod_json::ModJson; diff --git a/src/commands/qmod/zip.rs b/src/commands/qmod/zip.rs index 05af7aa..b887d9d 100644 --- a/src/commands/qmod/zip.rs +++ b/src/commands/qmod/zip.rs @@ -9,7 +9,6 @@ use itertools::Itertools; use owo_colors::OwoColorize; use qpm_package::extensions::workspace::WorkspaceConfigExtensions; use qpm_package::models::shared_package::SharedPackageConfig; -use qpm_package::models::triplet::{TripletId, default_triplet_id}; use qpm_qmod::models::mod_json::ModJson; use crate::commands::qmod::manifest::{ManifestQmodOperationArgs, generate_qmod_manifest}; diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index b2978ed..76bf818 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -1,16 +1,84 @@ +use std::{collections::HashMap, path::PathBuf}; + use clap::Args; +use color_eyre::eyre::{Context, ContextCompat}; +use qpm_package::models::{ + package::PackageConfig, + qpkg::{QPKG_JSON, QPkg, QPkgTripletInfo}, + shared_package::SharedPackageConfig, + triplet::TripletId, + }; +use zip::{ZipWriter, write::FileOptions}; + +use crate::{ + models::package::PackageConfigExtensions, terminal::colors::QPMColor, +}; use super::Command; /// Templatr rust rewrite (implementation not based on the old one) #[derive(Args, Clone, Debug)] pub struct QPkgCommand { - + #[clap(short, long)] + pub bin_dir: Option, } impl Command for QPkgCommand { fn execute(self) -> color_eyre::Result<()> { - // Placeholder for QPKG command execution logic + let package = PackageConfig::read(".")?; + + let file = std::fs::File::create(QPKG_JSON)?; + let mut zip = ZipWriter::new(file); + + let options = FileOptions::<()>::default(); + + // add shared directory + zip.add_directory_from_path(&package.shared_directory, options) + .context("Failed to add shared directory to QPKG zip")?; + + let build_dir = self + .bin_dir + .map(PathBuf::from) + .unwrap_or_else(|| package.dependencies_directory.join("build")); + + let triplets: HashMap = package + .triplets + .iter_triplets() + .filter_map(|(triplet_id, triplet)| { + // extern/build/{triplet_id}/ + let triplet_dir = build_dir.join(&triplet_id.0); + + let binaries = triplet.out_binaries.clone()?; + for binary in &binaries { + // extern/build/{triplet_id}/{binary} + let binary_built = triplet_dir.join(binary); + + if !binary_built.exists() { + panic!( + "Binary {} for triplet {} does not exist", + binary.display(), + triplet_id.triplet_id_color() + ); + } + + zip.start_file_from_path(binary_built, options) + .expect("Failed to start file in QPKG zip"); + } + + Some((triplet_id, QPkgTripletInfo { files: binaries })) + }) + .collect(); + + let qpkg = QPkg { + shared_dir: package.shared_directory, + triplets, + }; + + zip.start_file(QPKG_JSON, options) + .context("Failed to start file in QPKG zip")?; + serde_json::to_writer(&mut zip, &qpkg).context("Failed to write QPKG JSON to zip")?; + zip.finish()?; + println!("Executing QPKG command..."); Ok(()) } diff --git a/src/commands/restore.rs b/src/commands/restore.rs index 2148d4c..e9140ea 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -15,11 +15,8 @@ use qpm_package::models::{ use semver::Version; use crate::{ - models::{ - config::get_combine_config, - package::{PackageConfigExtensions, SharedPackageConfigExtensions}, - }, - repository::{self, Repository}, + models::package::{PackageConfigExtensions, SharedPackageConfigExtensions}, + repository::{self}, resolver::dependency, terminal::colors::QPMColor, }; @@ -48,7 +45,7 @@ pub(crate) fn is_ignored() -> bool { excludes.is_ok_and(|mut attribute| { attribute .at_path( - SHARED_PACKAGE_FILE_NAME, + QPM_SHARED_JSON, Some(gix::index::entry::Mode::FILE), ) .is_ok_and(|e| e.is_excluded()) @@ -113,7 +110,7 @@ impl Command for RestoreCommand { .get(&triplet_id) .expect("Locked triplet should exist"); - dependency::locked_resolve(shared_package, &repo, &shared_triplet)?.collect_vec() + dependency::locked_resolve(shared_package, &repo, shared_triplet)?.collect_vec() } // Unlocked resolve _ => { @@ -161,7 +158,7 @@ fn is_modified( return true; }; - let Some(locked_triplet) = shared_package.locked_triplet.get(&triplet_id) else { + let Some(locked_triplet) = shared_package.locked_triplet.get(triplet_id) else { return true; }; @@ -182,7 +179,7 @@ fn is_modified( } } - return false; + false } pub fn validate_ndk(package: &PackageConfig) -> Result<()> { diff --git a/src/lib.rs b/src/lib.rs index bf18d37..b098f91 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,5 @@ #![feature(try_find)] #![feature(iterator_try_collect)] -#![feature(let_chains)] #![feature(exit_status_error)] #![feature(if_let_guard)] #![feature(path_add_extension)] diff --git a/src/main.rs b/src/main.rs index 3a5418d..cf8ab63 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,5 @@ #![feature(try_find)] #![feature(iterator_try_collect)] -#![feature(let_chains)] #![feature(exit_status_error)] #![feature(if_let_guard)] #![feature(path_add_extension)] diff --git a/src/models/mod_json.rs b/src/models/mod_json.rs index e4f3420..7d37c37 100644 --- a/src/models/mod_json.rs +++ b/src/models/mod_json.rs @@ -10,7 +10,7 @@ use color_eyre::{Result, eyre::Context}; use itertools::Itertools; use qpm_qmod::models::mod_json::{ModDependency, ModJson}; -use crate::{commands::Opt, utils::json}; +use crate::utils::json; use super::schemas::{SchemaLinks, WithSchema}; diff --git a/src/models/package.rs b/src/models/package.rs index 56f18c3..b57f6b6 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -1,9 +1,4 @@ -use std::{ - collections::{HashMap, HashSet}, - fs::File, - io::BufReader, - path::Path, -}; +use std::{collections::HashMap, fs::File, io::BufReader, path::Path}; use color_eyre::{ Result, Section, @@ -20,7 +15,6 @@ use qpm_package::models::{ }; use qpm_qmod::models::mod_json::{ModDependency, ModJson}; use semver::VersionReq; -use serde::de; use crate::{ repository::Repository, @@ -190,8 +184,8 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { let triplet_dependencies: HashMap = config .triplets .specific_triplets - .iter() - .map(|(triplet_id, _triplet)| -> color_eyre::Result<_> { + .keys() + .map(|triplet_id| -> color_eyre::Result<_> { let resolved = resolve(&config, repository, triplet_id)?.collect_vec(); Ok((triplet_id.clone(), resolved)) @@ -267,7 +261,7 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { // get the package config for the dependency let dep_package = repo - .get_package(&dep_id, &shared_dep_triplet.restored_version) + .get_package(dep_id, &shared_dep_triplet.restored_version) .expect("Failed to get package") .expect("Package should exist in repository"); @@ -295,10 +289,10 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { // mods that are header-only but provide qmods can be added as deps // Must be directly referenced in qpm.json let mods: Vec = direct_dependencies - .iter() + .values() // Removes any dependency without a qmod link - .filter(|(dep_package, result)| result.dep_triplet.qmod_url.is_some()) - .map(|(dep_config, result)| ModDependency { + .filter(|result| result.dep_triplet.qmod_url.is_some()) + .map(|result| ModDependency { version_range: result.restored_triplet.version_range.clone(), id: result.dep_config.id.0.clone(), mod_link: result.dep_triplet.qmod_url.clone(), @@ -363,8 +357,8 @@ impl SharedTripletExtensions for SharedTriplet { let dep_env = self .restored_dependencies - .iter() - .map(|(dep_id, dep)| &dep.restored_env) + .values() + .map(|dep| &dep.restored_env) .collect_vec(); // ensure no key collisions @@ -373,8 +367,7 @@ impl SharedTripletExtensions for SharedTriplet { for (key, value) in env { if flattened_map.contains_key(key) { eprintln!( - "Warning: Environment variable {} is defined multiple times, using the last value.", - key + "Warning: Environment variable {key} is defined multiple times, using the last value." ); } flattened_map.insert(key.clone(), value.clone()); diff --git a/src/models/package_files.rs b/src/models/package_files.rs index 5dbf4f2..74e7c99 100644 --- a/src/models/package_files.rs +++ b/src/models/package_files.rs @@ -1,4 +1,4 @@ -use std::{ops::Deref, path::PathBuf}; +use std::{ops::Deref, path::{Path, PathBuf}}; use qpm_package::models::{ package::{DependencyId, QPM_JSON}, @@ -28,7 +28,7 @@ impl PackageIdPath { pub fn versions_path(&self) -> PathBuf { let combine = UserConfig::read_combine().unwrap(); let cache = combine.cache.as_ref().unwrap(); - cache.join(&self.0.to_string()) + cache.join(self.0.to_string()) } } @@ -84,7 +84,7 @@ impl PackageTripletPath { self.triplet_path().join("lib") } - pub fn binary_path(&self, binary: &PathBuf) -> PathBuf { + pub fn binary_path(&self, binary: &Path) -> PathBuf { self.binaries_path().join(binary.file_name().expect("Binary file name")) } } diff --git a/src/models/toolchain.rs b/src/models/toolchain.rs index 6b8c450..db2109b 100644 --- a/src/models/toolchain.rs +++ b/src/models/toolchain.rs @@ -29,7 +29,7 @@ pub fn write_toolchain_file( .restored_dependencies .iter() .filter_map(|(dep_id, dep_triplet)| { - let dep_config = repo.get_package(&dep_id, &dep_triplet.restored_version).ok()??; + let dep_config = repo.get_package(dep_id, &dep_triplet.restored_version).ok()??; let dep_triplet_config = dep_config.triplets.get_triplet_settings(&dep_triplet.restored_triplet)?; let package_id = &dep_config.id; diff --git a/src/repository/local.rs b/src/repository/local.rs index aa2fd63..5fb7572 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -6,7 +6,6 @@ use itertools::Itertools; use owo_colors::OwoColorize; use qpm_package::models::{ package::{DependencyId, PackageConfig}, - shared_package::SharedPackageConfig, triplet::TripletId, }; use schemars::JsonSchema; @@ -127,11 +126,11 @@ impl FileRepository { } if cache_path.src_path().exists() { - fs::remove_dir_all(&cache_path.src_path()) + fs::remove_dir_all(cache_path.src_path()) .context("Failed to remove existing src folder")?; } - fs::create_dir_all(&cache_path.src_path()).context("Failed to create lib path")?; + fs::create_dir_all(cache_path.src_path()).context("Failed to create lib path")?; for binary_src in binaries { if !binary_src.exists() { @@ -557,7 +556,7 @@ impl Repository for FileRepository { let exist_in_db = self.get_artifact(&config.id, &config.version).is_some(); let package_path = PackageIdPath::new(config.id.clone()).version(config.version.clone()); - let config = PackageConfig::read(&package_path.qpm_json_path()); + let config = PackageConfig::read(package_path.qpm_json_path()); Ok(exist_in_db && package_path.src_path().exists() && config.is_ok()) } diff --git a/src/repository/memcached.rs b/src/repository/memcached.rs index 84ac694..0210b4d 100644 --- a/src/repository/memcached.rs +++ b/src/repository/memcached.rs @@ -3,7 +3,7 @@ use color_eyre::Result; use semver::Version; use std::{cell::UnsafeCell, collections::HashMap}; -use qpm_package::models::{package::{DependencyId, PackageConfig}, shared_package::SharedPackageConfig}; +use qpm_package::models::package::{DependencyId, PackageConfig}; use super::Repository; diff --git a/src/repository/mod.rs b/src/repository/mod.rs index 955a910..26ee43a 100644 --- a/src/repository/mod.rs +++ b/src/repository/mod.rs @@ -2,7 +2,7 @@ use color_eyre::Result; use itertools::Itertools; use semver::Version; -use qpm_package::models::{package::{DependencyId, PackageConfig}, shared_package::SharedPackageConfig}; +use qpm_package::models::package::{DependencyId, PackageConfig}; use self::{ local::FileRepository, memcached::MemcachedRepository, multi::MultiDependencyRepository, diff --git a/src/repository/multi.rs b/src/repository/multi.rs index ddc1ac5..cc51c7f 100644 --- a/src/repository/multi.rs +++ b/src/repository/multi.rs @@ -1,7 +1,7 @@ use color_eyre::{Result, eyre::bail}; use itertools::Itertools; -use qpm_package::models::{package::{DependencyId, PackageConfig}, shared_package::SharedPackageConfig}; +use qpm_package::models::package::{DependencyId, PackageConfig}; use semver::Version; use super::Repository; @@ -32,7 +32,7 @@ impl Repository for MultiDependencyRepository { .filter_map(|r| r.get_package_versions(id).expect("Failed to get versions")) .flatten() .unique() - .sorted_by(|a, b| a.cmp(&b)) + .sorted_by(|a, b| a.cmp(b)) .rev() // highest first .collect(); diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 521a309..c2d3cf2 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -1,6 +1,6 @@ use bytes::{BufMut, BytesMut}; use color_eyre::{ - Result, Section, + Result, eyre::{Context, ContextCompat, OptionExt, bail}, }; use itertools::Itertools; @@ -9,34 +9,27 @@ use reqwest::StatusCode; use semver::Version; use sha2::{Digest, Sha256}; use std::{ - fs::{self, File}, - io::{BufWriter, Cursor}, - path::{Path, PathBuf}, + fs::{self}, + io::Cursor, }; use zip::ZipArchive; use serde::Deserialize; -use qpm_package::{ - extensions::package_metadata::PackageMetadataExtensions, - models::{ +use qpm_package::models::{ package::{DependencyId, PackageConfig}, qpackages::QPackagesPackage, qpkg::{QPKG_JSON, QPkg}, - shared_package::{QPM_SHARED_JSON, SharedPackageConfig}, - triplet::{self, TripletId}, - }, -}; + shared_package::SharedPackageConfig, + }; use crate::{ models::{ - config::get_combine_config, package::PackageConfigExtensions, package_files::PackageIdPath, + package::PackageConfigExtensions, package_files::PackageIdPath, qpackages::QPackageExtensions, qpkg::QPkgExtensions, }, network::agent::{download_file_report, get_agent}, - repository::local::FileRepository, terminal::colors::QPMColor, - utils::git, }; use super::Repository; @@ -168,7 +161,7 @@ impl QPMRepository { let mut bytes = BytesMut::new().writer(); println!("Downloading {}", qpkg_url.file_path_color()); - download_file_report(&qpkg_url, &mut bytes, |_, _| {}) + download_file_report(qpkg_url, &mut bytes, |_, _| {}) .with_context(|| format!("Failed while downloading {}", qpkg_url.blue()))?; let buffer = Cursor::new(bytes.get_ref()); @@ -307,7 +300,7 @@ impl Repository for QPMRepository { let versions = Self::get_versions(id)?.map(|versions| { versions .into_iter() - .sorted_by(|a, b| a.cmp(&b)) + .sorted_by(|a, b| a.cmp(b)) .rev() .collect_vec() }); diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index f9bca32..0252510 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -23,7 +23,7 @@ use pubgrub::{ use qpm_package::models::{ package::{DependencyId, PackageConfig}, shared_package::{SharedPackageConfig, SharedTriplet}, - triplet::{PackageTriplet, PackageTripletDependency, PackageTripletsConfig, TripletId}, + triplet::{PackageTriplet, TripletId}, }; /// Represents a resolved dependency @@ -190,8 +190,8 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> // Count versions that satisfy the range constraint let version_count = versions - .iter() - .filter(|v| range.contains(&VersionWrapper(v.clone().clone()))) + .into_iter() + .filter(|v| range.contains(&VersionWrapper(v.clone()))) .count(); // If no versions satisfy the constraint, use maximum priority @@ -265,7 +265,7 @@ pub fn restore>( &dep.version.to_string().dependency_version_color(), dep_triplet.0.triplet_id_color() ); - repository.download_to_cache(&dep).with_context(|| { + repository.download_to_cache(dep).with_context(|| { format!( "Requesting {}:{}", dep.id.0.dependency_id_color(), @@ -293,7 +293,7 @@ pub fn locked_resolve<'a, R: Repository>( // TODO: ensure restored dependencies take precedence over let packages = triplet.restored_dependencies.iter().map(|(dep_id, dep)| { let shared_package = repository - .get_package(&dep_id, &dep.restored_version) + .get_package(dep_id, &dep.restored_version) .unwrap_or_else(|e| { panic!( "Encountered an issue resolving for package {}:{} {e:#?}", diff --git a/src/terminal/colors.rs b/src/terminal/colors.rs index 23742ae..096bbbb 100644 --- a/src/terminal/colors.rs +++ b/src/terminal/colors.rs @@ -3,39 +3,39 @@ use owo_colors::{FgColorDisplay, OwoColorize}; /// Defines a color scheme for Spiggy pub trait QPMColor: OwoColorize { #[inline(always)] - fn download_file_name_color(&self) -> FgColorDisplay { + fn download_file_name_color(&self) -> FgColorDisplay<'_, owo_colors::colors::Cyan, Self> { self.cyan() } #[inline(always)] - fn file_path_color(&self) -> FgColorDisplay { + fn file_path_color(&self) -> FgColorDisplay<'_, owo_colors::colors::Yellow, Self> { self.yellow() } #[inline(always)] - fn dependency_id_color(&self) -> FgColorDisplay { + fn dependency_id_color(&self) -> FgColorDisplay<'_, owo_colors::colors::Blue, Self> { self.blue() } #[inline(always)] - fn version_id_color(&self) -> FgColorDisplay { + fn version_id_color(&self) -> FgColorDisplay<'_, owo_colors::colors::Blue, Self> { self.blue() } #[inline(always)] - fn dependency_version_color(&self) -> FgColorDisplay { + fn dependency_version_color(&self) -> FgColorDisplay<'_, owo_colors::colors::Magenta, Self> { self.purple() } #[inline(always)] fn alternate_dependency_version_color( &self, - ) -> FgColorDisplay { + ) -> FgColorDisplay<'_, owo_colors::colors::Yellow, Self> { self.yellow() } #[inline(always)] - fn triplet_id_color(&self) -> FgColorDisplay { + fn triplet_id_color(&self) -> FgColorDisplay<'_, owo_colors::colors::Green, Self> { self.green() } } diff --git a/src/utils/android.rs b/src/utils/android.rs index 01ada73..527dd48 100644 --- a/src/utils/android.rs +++ b/src/utils/android.rs @@ -70,7 +70,7 @@ pub fn get_ndk_str_versions_str( manifest .remote_package .iter() - .filter(|&p| (p.path.starts_with("ndk;") && get_host_archive(p).is_some())) + .filter(|&p| p.path.starts_with("ndk;") && get_host_archive(p).is_some()) .map(|p| (p.path.split_once(';').unwrap().1, p)) .collect() } From 54e2ecab6e6e53bc80ab941098fb483d40114e43 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sun, 27 Jul 2025 16:07:39 -0400 Subject: [PATCH 023/119] Enhance BuildCommand to support qmod option and improve binary copying logic --- src/commands/build.rs | 25 ++++++++++++++++++------- src/commands/qmod/mod.rs | 4 ++-- src/commands/qmod/zip.rs | 23 ++++++++++++++++------- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/commands/build.rs b/src/commands/build.rs index eb6b4d4..6c0749b 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -9,7 +9,10 @@ use qpm_package::{ }; use crate::{ - commands::scripts, models::package::PackageConfigExtensions, repository, resolver::dependency, + commands::{qmod::zip, scripts}, + models::package::PackageConfigExtensions, + repository, + resolver::dependency, terminal::colors::QPMColor, }; @@ -24,6 +27,9 @@ pub struct BuildCommand { #[clap(short, long, default_value = "false")] pub out_dir: Option, + + #[clap(long, default_value = "false")] + pub qmod: bool, } impl Command for BuildCommand { @@ -70,12 +76,18 @@ impl Command for BuildCommand { ); scripts::invoke_script(script, &args, &package, triplet_id)?; + let triplet_dir = out_dir.join(&triplet_id.0); + // now copy binaries copy_bins( - &out_dir, - triplet_id, + &triplet_dir, &triplet.out_binaries.unwrap_or_default(), )?; + + // finally qmod + if self.qmod { + zip::execute_qmod_zip_operation(Default::default(), &[&triplet_dir])?; + } } Ok(()) @@ -83,13 +95,12 @@ impl Command for BuildCommand { } fn copy_bins( - out_dir: &Path, - triplet_id: &qpm_package::models::triplet::TripletId, + triplet_dir: &Path, out_binaries: &[PathBuf], ) -> color_eyre::Result<()> { for binary in out_binaries { // create the output directory if it doesn't exist - let out_path = out_dir.join(triplet_id.to_string()).join(binary); + let out_path = triplet_dir.join(binary); std::fs::create_dir_all(out_path.parent().unwrap()).with_context(|| { format!( @@ -102,7 +113,7 @@ fn copy_bins( format!( "Failed to copy binary {} to output directory {}", binary.display(), - out_dir.display() + triplet_dir.display() ) })?; } diff --git a/src/commands/qmod/mod.rs b/src/commands/qmod/mod.rs index a2b3f28..97a9270 100644 --- a/src/commands/qmod/mod.rs +++ b/src/commands/qmod/mod.rs @@ -6,7 +6,7 @@ use super::Command; mod create; mod edit; mod manifest; -mod zip; +pub mod zip; #[derive(Args, Debug, Clone)] @@ -47,7 +47,7 @@ impl Command for QmodCommand { manifest::execute_qmod_manifest_operation(b) } QmodOperation::Manifest(b) => manifest::execute_qmod_manifest_operation(b), - QmodOperation::Zip(b) => zip::execute_qmod_zip_operation(b), + QmodOperation::Zip(b) => zip::execute_qmod_zip_operation(b, &[]), QmodOperation::Edit(e) => e.execute(), } } diff --git a/src/commands/qmod/zip.rs b/src/commands/qmod/zip.rs index b887d9d..17a956a 100644 --- a/src/commands/qmod/zip.rs +++ b/src/commands/qmod/zip.rs @@ -1,7 +1,7 @@ use std::env; use std::fs::{self, File}; use std::io::Write; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use clap::Args; use itertools::Itertools; @@ -24,7 +24,7 @@ use color_eyre::eyre::ensure; use color_eyre::Result; -#[derive(Args, Debug, Clone)] +#[derive(Args, Debug, Clone, Default)] pub struct ZipQmodOperationArgs { /// /// Tells QPM to exclude mods from being listed as copied mod or libs dependencies @@ -84,7 +84,10 @@ fn get_relative_pathbuf(path: PathBuf) -> Result Result<()> { +pub fn execute_qmod_zip_operation( + build_parameters: ZipQmodOperationArgs, + additional_include_folders: &[&Path], +) -> Result<()> { ensure!( std::path::Path::new("mod.template.json").exists(), "No mod.template.json found in the current directory, set it up please :) Hint: use \"qmod create\"" @@ -126,14 +129,20 @@ pub(crate) fn execute_qmod_zip_operation(build_parameters: ZipQmodOperationArgs) .include_dirs .unwrap_or(package.workspace.qmod_include_dirs); - let include_files = build_parameters - .include_files - .unwrap_or(package.workspace.qmod_include_files); + let include_files = additional_include_folders + .iter() + .map(PathBuf::from) + .chain( + build_parameters + .include_files + .unwrap_or(package.workspace.qmod_include_files), + ) + .collect_vec(); let qmod_out = build_parameters .out_target .or(package.workspace.qmod_output) - .unwrap_or(format!("./{}", package.id).into()); + .unwrap_or(format!("./{}", new_manifest.id).into()); let look_for_files = |s: &str| { include_dirs From d18e68fa75197baaa5fe3be8887251573567e09b Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Mon, 28 Jul 2025 17:54:37 -0400 Subject: [PATCH 024/119] Implement triplet specific qmod template path --- Cargo.lock | 21 +++++++++++---------- src/commands/qmod/create.rs | 21 +++++++++++++++++---- src/commands/qmod/edit.rs | 22 +++++++++++++++++++--- src/commands/qmod/manifest.rs | 35 +++++++++++++++++++++++++---------- src/main.rs | 4 ++-- src/models/mod_json.rs | 21 ++++----------------- 6 files changed, 78 insertions(+), 46 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 69ac293..5211126 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2082,9 +2082,9 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4488594b9328dee448adb906d8b126d9b7deb7cf5c22161ee591610bb1be83c0" +checksum = "360e552c93fa0e8152ab463bc4c4837fce76a225df11dfaeea66c313de5e61f7" dependencies = [ "bitflags", "libc", @@ -2560,7 +2560,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#c6326babd6c260f674dd7e6975f6d71b867945b9" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#bb902df2b44ee7d5877105ae7f2dad9c94705e14" dependencies = [ "cursed-semver-parser", "schemars", @@ -2681,9 +2681,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.16" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7251471db004e509f4e75a62cca9435365b5ec7bcdff530d612ac7c87c44a792" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags", ] @@ -2820,9 +2820,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.30" +version = "0.23.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069a8df149a16b1a12dcc31497c3396a173844be3cac4bd40c9e7671fef96671" +checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" dependencies = [ "once_cell", "ring", @@ -3768,7 +3768,7 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.2", + "windows-targets 0.53.3", ] [[package]] @@ -3789,10 +3789,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.2" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", diff --git a/src/commands/qmod/create.rs b/src/commands/qmod/create.rs index 3022c20..1163472 100644 --- a/src/commands/qmod/create.rs +++ b/src/commands/qmod/create.rs @@ -1,13 +1,14 @@ use clap::Args; +use qpm_package::models::{package::PackageConfig, shared_package::SharedPackageConfig}; use semver::Version; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use qpm_qmod::models::mod_json::ModJson; -use color_eyre::Result; +use color_eyre::{eyre::ContextCompat, Result}; -use crate::models::mod_json::ModJsonExtensions; +use crate::models::{mod_json::ModJsonExtensions, package::PackageConfigExtensions}; /// Some properties are not editable through the qmod create command, these properties are either editable through the package, or not at all #[derive(Args, Debug, Clone)] @@ -41,6 +42,18 @@ pub struct CreateQmodJsonOperationArgs { pub(crate) fn execute_qmod_create_operation( create_parameters: CreateQmodJsonOperationArgs, ) -> Result<()> { + let package = PackageConfig::read(".")?; + let shared_package = SharedPackageConfig::read(".")?; + let triplet = package + .triplets + .get_triplet_settings(&shared_package.restored_triplet) + .context("Restored triplet not in package config")?; + + let mod_template = triplet + .qmod_template + .as_deref() + .unwrap_or_else(|| Path::new("mod.template.json")); + let schema_version = match &create_parameters.schema_version { Option::Some(s) => s.clone(), Option::None => Version::new(1, 1, 0), @@ -67,6 +80,6 @@ pub(crate) fn execute_qmod_create_operation( ..Default::default() }; - json.write(&PathBuf::from(ModJson::get_template_name()))?; + json.write(&PathBuf::from(mod_template))?; Ok(()) } diff --git a/src/commands/qmod/edit.rs b/src/commands/qmod/edit.rs index 63b7eca..c0c2932 100644 --- a/src/commands/qmod/edit.rs +++ b/src/commands/qmod/edit.rs @@ -1,8 +1,12 @@ +use std::path::Path; + use clap::Args; +use color_eyre::eyre::ContextCompat; +use qpm_package::models::{package::PackageConfig, shared_package::SharedPackageConfig}; use qpm_qmod::models::mod_json::ModJson; use semver::Version; -use crate::{commands::Command, models::mod_json::ModJsonExtensions}; +use crate::{commands::Command, models::{mod_json::ModJsonExtensions, package::PackageConfigExtensions}}; /// Some properties are not editable through the qmod edit command, these properties are either editable through the package, or not at all #[derive(Args, Debug, Clone)] @@ -33,7 +37,19 @@ pub struct EditQmodJsonCommand { impl Command for EditQmodJsonCommand { fn execute(self) -> color_eyre::Result<()> { - let mut json = ModJson::read(&ModJson::get_template_path())?; + let package = PackageConfig::read(".")?; + let shared_package = SharedPackageConfig::read(".")?; + let triplet = package + .triplets + .get_triplet_settings(&shared_package.restored_triplet) + .context("Restored triplet not in package config")?; + + let mod_template = triplet + .qmod_template + .as_deref() + .unwrap_or_else(|| Path::new("mod.template.json")); + + let mut json = ModJson::read(&mod_template)?; if let Some(schema_version) = self.schema_version { json.schema_version = schema_version; @@ -69,7 +85,7 @@ impl Command for EditQmodJsonCommand { } } - json.write(&ModJson::get_template_path())?; + json.write(mod_template)?; Ok(()) } } diff --git a/src/commands/qmod/manifest.rs b/src/commands/qmod/manifest.rs index df2e936..6bb562a 100644 --- a/src/commands/qmod/manifest.rs +++ b/src/commands/qmod/manifest.rs @@ -1,4 +1,4 @@ -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use clap::Args; use qpm_package::models::shared_package::SharedPackageConfig; @@ -54,18 +54,28 @@ pub(crate) fn generate_qmod_manifest( shared_package: SharedPackageConfig, build_parameters: ManifestQmodOperationArgs, ) -> Result { - ensure!( - std::path::Path::new("mod.template.json").exists(), - "No mod.template.json found in the current directory, set it up please :) Hint: use \"qmod create\"" - ); - println!("Generating mod.json file from template using qpm.shared.json..."); - let shared_triplet = shared_package.get_restored_triplet(); let triplet = package .triplets .get_triplet_settings(&shared_package.restored_triplet) .context("Restored triplet not in package config")?; + let mod_template = triplet + .qmod_template + .as_deref() + .unwrap_or_else(|| Path::new("mod.template.json")); + + ensure!( + mod_template.exists(), + "QMod template file {} does not exist. Hint: use \"qmod create\"", + mod_template.display() + ); + + println!( + "Generating mod.json file from template {} using qpm.shared.json...", + mod_template.display() + ); + let env = &shared_triplet.env; let game_version = env.get(QPM_ENV_GAME_VERSION); @@ -93,13 +103,14 @@ pub(crate) fn generate_qmod_manifest( additional_env: env.clone(), }; - let mut existing_json = ModJson::read_and_preprocess(preprocess_data)?; + let mut existing_json = ModJson::read_and_preprocess(preprocess_data, mod_template)?; let repo = repository::useful_default_new(build_parameters.offline)?; let template_mod_json: ModJson = shared_package.clone().to_mod_json(&repo); - let legacy_0_1_0 = package.matches_version(&VersionReq::parse("^0.1.0")?); - existing_json = ModJson::merge_modjson(existing_json, template_mod_json, legacy_0_1_0); + // Merge the existing json with the template mod json + existing_json = ModJson::merge_modjson(existing_json, template_mod_json); + if let Some(excluded) = build_parameters.exclude_libs { let exclude_filter = |lib_name: &String| -> bool { // returning false means don't include @@ -109,6 +120,8 @@ pub(crate) fn generate_qmod_manifest( existing_json.mod_files.retain(exclude_filter); existing_json.library_files.retain(exclude_filter); + existing_json.late_mod_files.retain(exclude_filter); + existing_json.mod_files.retain(exclude_filter); // whitelist libraries } else if let Some(included) = build_parameters.include_libs { let include_filter = |lib_name: &String| -> bool { @@ -119,6 +132,8 @@ pub(crate) fn generate_qmod_manifest( existing_json.mod_files.retain(include_filter); existing_json.library_files.retain(include_filter); + existing_json.mod_files.retain(include_filter); + existing_json.late_mod_files.retain(include_filter); } Ok(existing_json) } diff --git a/src/main.rs b/src/main.rs index cf8ab63..6897555 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,8 +24,8 @@ pub mod utils; #[cfg(benchmark)] mod benchmark; -#[cfg(test)] -mod tests; +// #[cfg(test)] +// mod tests; fn print_completions(generator: G, cmd: &mut clap::Command) { generate( diff --git a/src/models/mod_json.rs b/src/models/mod_json.rs index 7d37c37..71106e9 100644 --- a/src/models/mod_json.rs +++ b/src/models/mod_json.rs @@ -15,10 +15,8 @@ use crate::utils::json; use super::schemas::{SchemaLinks, WithSchema}; pub trait ModJsonExtensions: Sized { - fn get_template_name() -> &'static str; fn get_result_name() -> &'static str; - fn get_template_path() -> PathBuf; - fn read_and_preprocess(preprocess_data: PreProcessingData) -> Result; + fn read_and_preprocess(preprocess_data: PreProcessingData, file: &Path) -> Result; fn read(path: &Path) -> Result; fn write(&self, path: &Path) -> Result<()>; @@ -26,7 +24,6 @@ pub trait ModJsonExtensions: Sized { fn merge_modjson( existing_json: ModJson, template_mod_json: ModJson, - add_default_binary: bool, ) -> ModJson; } @@ -73,20 +70,13 @@ impl PreProcessingData { } impl ModJsonExtensions for ModJson { - fn get_template_name() -> &'static str { - "mod.template.json" - } fn get_result_name() -> &'static str { "mod.json" } - fn get_template_path() -> std::path::PathBuf { - PathBuf::new().join(Self::get_template_name()) - } - - fn read_and_preprocess(preprocess_data: PreProcessingData) -> Result { - let mut file = File::open(Self::get_template_name()).context("Opening mod.json failed")?; + fn read_and_preprocess(preprocess_data: PreProcessingData, path: &Path) -> Result { + let mut file = File::open(path).context("Opening mod.json failed")?; // Get data let mut json = String::with_capacity(file.metadata()?.len() as usize); @@ -123,7 +113,6 @@ impl ModJsonExtensions for ModJson { fn merge_modjson( mut existing_json: ModJson, mut template_mod_json: ModJson, - add_default_binary: bool, ) -> ModJson { let existing_binaries: HashSet = existing_json .library_files @@ -153,9 +142,7 @@ impl ModJsonExtensions for ModJson { .dependencies .retain(|d| !existing_dependencies.contains_key(&d.id)); - if add_default_binary { - insert_default_mod_binary(&mut existing_json, &mut template_mod_json); - }; + existing_json .library_files From 5ce5f84336524a70fc3dcb4df1d12d26e7c948ec Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Mon, 28 Jul 2025 17:55:42 -0400 Subject: [PATCH 025/119] Remove openssl dependency --- Cargo.lock | 71 ------------------------------------------------------ Cargo.toml | 26 ++++++++++---------- 2 files changed, 13 insertions(+), 84 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5211126..8b1b0c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -669,21 +669,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.2.1" @@ -2269,54 +2254,6 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" -[[package]] -name = "openssl" -version = "0.10.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" -dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - -[[package]] -name = "openssl-src" -version = "300.5.1+3.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "735230c832b28c000e3bc117119e6466a663ec73506bc0a9907ea4187508e42a" -dependencies = [ - "cc", -] - -[[package]] -name = "openssl-sys" -version = "0.9.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" -dependencies = [ - "cc", - "libc", - "openssl-src", - "pkg-config", - "vcpkg", -] - [[package]] name = "option-ext" version = "0.2.0" @@ -2532,8 +2469,6 @@ dependencies = [ "hex", "itertools", "keyring", - "openssl", - "openssl-sys", "owo-colors", "pathdiff", "pbr", @@ -3502,12 +3437,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "vergen" version = "8.3.2" diff --git a/Cargo.toml b/Cargo.toml index 9bbf13d..03c1c88 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -107,19 +107,19 @@ schemars = { version = "0.8", features = ["semver"] } sha2 = "0.10.9" hex = "0.4.3" -[target.aarch64-apple-darwin.dependencies] -# Allow cross compiles -openssl = { version = "0.10", features = ["vendored"] } -openssl-sys = { version = "0.9", features = ["vendored"] } -[target.x86_64-apple-darwin.dependencies] -# Statically link openssl -openssl = { version = "0.10", features = ["vendored"] } -openssl-sys = { version = "0.9", features = ["vendored"] } - -[target.x86_64-unknown-linux-musl.dependencies] -# Statically link openssl -openssl = { version = "0.10", features = ["vendored"] } -openssl-sys = { version = "0.9", features = ["vendored"] } +# [target.aarch64-apple-darwin.dependencies] +# # Allow cross compiles +# openssl = { version = "0.10", features = ["vendored"] } +# openssl-sys = { version = "0.9", features = ["vendored"] } +# [target.x86_64-apple-darwin.dependencies] +# # Statically link openssl +# openssl = { version = "0.10", features = ["vendored"] } +# openssl-sys = { version = "0.9", features = ["vendored"] } + +# [target.x86_64-unknown-linux-musl.dependencies] +# # Statically link openssl +# openssl = { version = "0.10", features = ["vendored"] } +# openssl-sys = { version = "0.9", features = ["vendored"] } [profile.release] opt-level = 3 From 09ce5a6c332f9bcf04f196c10fab6aa19b044209 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Mon, 28 Jul 2025 17:56:18 -0400 Subject: [PATCH 026/119] Rename qpm binary --- .github/workflows/cargo-build.yml | 12 ++++++------ Cargo.toml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/cargo-build.yml b/.github/workflows/cargo-build.yml index 6c1ab62..e21b25b 100644 --- a/.github/workflows/cargo-build.yml +++ b/.github/workflows/cargo-build.yml @@ -76,34 +76,34 @@ jobs: matrix: include: - os: ubuntu-latest - file-name: qpm + file-name: qpm2 prefix: linux suffix: linux-x64 - os: ubuntu-latest - file-name: qpm + file-name: qpm2 prefix: linux-static suffix: linux-x64-static target: x86_64-unknown-linux-musl - os: macos-13 - file-name: qpm + file-name: qpm2 prefix: macos-x64 suffix: macos-x64 - os: macos-13 - file-name: qpm + file-name: qpm2 prefix: macos-arm64 suffix: macos-arm64 target: aarch64-apple-darwin - os: windows-latest - file-name: qpm.exe + file-name: qpm2.exe prefix: windows suffix: windows-x64 - os: windows-latest - file-name: qpm.exe + file-name: qpm2.exe target: aarch64-pc-windows-msvc prefix: windows-arm64 suffix: windows-arm64 diff --git a/Cargo.toml b/Cargo.toml index 03c1c88..895110d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ rust-version = "1.85" # Rename binary [[bin]] -name = "qpm" +name = "qpm2" path = "src/main.rs" [lib] From 7bef2f91aa116ce590fa1b91a8cf18787f20c5df Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Mon, 28 Jul 2025 18:01:44 -0400 Subject: [PATCH 027/119] Cargo fix and fmt --- src/commands/build.rs | 10 ++------- src/commands/collapse.rs | 12 ++++------ src/commands/install.rs | 7 ++---- src/commands/mod.rs | 2 +- src/commands/package/edit.rs | 13 ++--------- src/commands/package/edit_extra.rs | 9 ++------ src/commands/package/format.rs | 6 +++-- src/commands/qmod/create.rs | 2 +- src/commands/qmod/edit.rs | 7 ++++-- src/commands/qmod/manifest.rs | 1 - src/commands/qpkg.rs | 15 +++++-------- src/commands/restore.rs | 5 +---- src/commands/scripts.rs | 5 ++++- src/models/mod.rs | 6 ++--- src/models/mod_json.rs | 36 +++--------------------------- src/models/package_files.rs | 8 +++++-- src/models/qpackages.rs | 14 ++++++------ src/models/qpkg.rs | 19 +++++++--------- src/models/toolchain.rs | 12 +++++++--- src/repository/local.rs | 2 +- src/repository/mod.rs | 6 +---- src/repository/qpackages.rs | 17 ++++++-------- src/resolver/dependency.rs | 8 +++++-- src/utils/git.rs | 12 ++++++++-- 24 files changed, 95 insertions(+), 139 deletions(-) diff --git a/src/commands/build.rs b/src/commands/build.rs index 6c0749b..4cc6aa0 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -79,10 +79,7 @@ impl Command for BuildCommand { let triplet_dir = out_dir.join(&triplet_id.0); // now copy binaries - copy_bins( - &triplet_dir, - &triplet.out_binaries.unwrap_or_default(), - )?; + copy_bins(&triplet_dir, &triplet.out_binaries.unwrap_or_default())?; // finally qmod if self.qmod { @@ -94,10 +91,7 @@ impl Command for BuildCommand { } } -fn copy_bins( - triplet_dir: &Path, - out_binaries: &[PathBuf], -) -> color_eyre::Result<()> { +fn copy_bins(triplet_dir: &Path, out_binaries: &[PathBuf]) -> color_eyre::Result<()> { for binary in out_binaries { // create the output directory if it doesn't exist let out_path = triplet_dir.join(binary); diff --git a/src/commands/collapse.rs b/src/commands/collapse.rs index 7a01088..3f05121 100644 --- a/src/commands/collapse.rs +++ b/src/commands/collapse.rs @@ -2,10 +2,7 @@ use clap::Args; use color_eyre::eyre::Context; use itertools::Itertools; use owo_colors::OwoColorize; -use qpm_package::models::{ - package::PackageConfig, - triplet::TripletId, -}; +use qpm_package::models::{package::PackageConfig, triplet::TripletId}; use crate::{ models::package::PackageConfigExtensions, @@ -49,14 +46,13 @@ impl Command for CollapseCommand { "Listing dependencies for triplet {}", triplet.0.triplet_id_color() ); - list_triplet_dependencies(package.clone(), &repo, &triplet.0, self.env).with_context( - || { + list_triplet_dependencies(package.clone(), &repo, &triplet.0, self.env) + .with_context(|| { format!( "Failed to list dependencies for triplet {}", triplet.0.triplet_id_color() ) - }, - )?; + })?; } } } diff --git a/src/commands/install.rs b/src/commands/install.rs index 7e7f5e2..1f3962e 100644 --- a/src/commands/install.rs +++ b/src/commands/install.rs @@ -1,7 +1,7 @@ use std::path::PathBuf; use clap::Args; -use color_eyre::eyre::{bail, Context, ContextCompat}; +use color_eyre::eyre::{ContextCompat, bail}; use qpm_package::models::shared_package::SharedPackageConfig; use crate::{ @@ -44,10 +44,7 @@ impl Command for InstallCommand { } else { for binary in &binaries { if !binary.exists() { - bail!( - "Binary file {} does not exist", - binary.display() - ); + bail!("Binary file {} does not exist", binary.display()); } } } diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 44ac4da..028b35f 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -2,6 +2,7 @@ use clap::{Parser, Subcommand}; use clap_complete::Shell; use color_eyre::Result; +pub mod build; pub mod cache; pub mod clear; pub mod collapse; @@ -19,7 +20,6 @@ pub mod qmod; pub mod qpkg; pub mod restore; pub mod scripts; -pub mod build; pub mod version; #[cfg(feature = "templatr")] diff --git a/src/commands/package/edit.rs b/src/commands/package/edit.rs index 595374f..bc7cd2a 100644 --- a/src/commands/package/edit.rs +++ b/src/commands/package/edit.rs @@ -1,16 +1,12 @@ use clap::Args; -use qpm_package::models::{package::{DependencyId, PackageConfig}, shared_package::SharedPackageConfig}; +use qpm_package::models::{package::PackageConfig, shared_package::SharedPackageConfig}; use semver::Version; -use crate::{ - commands::Command, - models::package::PackageConfigExtensions, -}; +use crate::{commands::Command, models::package::PackageConfigExtensions}; #[derive(Args, Debug, Clone)] pub struct EditArgs { - ///Edit the version property of the package #[clap(long)] pub version: Option, @@ -38,11 +34,6 @@ impl Command for EditArgs { } } -fn package_set_id(package: &mut PackageConfig, id: String) { - println!("Setting package id: {id}"); - package.id = DependencyId(id); -} - fn package_set_version(package: &mut PackageConfig, version: Version) { println!("Setting package version: {version}"); package.version = version; diff --git a/src/commands/package/edit_extra.rs b/src/commands/package/edit_extra.rs index 8cc304e..1541ae7 100644 --- a/src/commands/package/edit_extra.rs +++ b/src/commands/package/edit_extra.rs @@ -1,15 +1,10 @@ use clap::Args; use color_eyre::eyre::ContextCompat; use qpm_package::models::{ - package::PackageConfig, - shared_package::SharedPackageConfig, - triplet::TripletId, + package::PackageConfig, shared_package::SharedPackageConfig, triplet::TripletId, }; -use crate::{ - commands::Command, - models::package::PackageConfigExtensions, -}; +use crate::{commands::Command, models::package::PackageConfigExtensions}; #[derive(Args, Debug, Clone)] diff --git a/src/commands/package/format.rs b/src/commands/package/format.rs index 0dac920..82cba1a 100644 --- a/src/commands/package/format.rs +++ b/src/commands/package/format.rs @@ -1,8 +1,10 @@ use std::fs; use clap::Args; -use color_eyre::{eyre::ContextCompat, Result}; -use qpm_package::models::{package::PackageConfig, shared_package::SharedPackageConfig, triplet::default_triplet_id}; +use color_eyre::{Result, eyre::ContextCompat}; +use qpm_package::models::{ + package::PackageConfig, shared_package::SharedPackageConfig, triplet::default_triplet_id, +}; use crate::{commands::Command, models::package::PackageConfigExtensions}; diff --git a/src/commands/qmod/create.rs b/src/commands/qmod/create.rs index 1163472..d21de9e 100644 --- a/src/commands/qmod/create.rs +++ b/src/commands/qmod/create.rs @@ -6,7 +6,7 @@ use std::path::{Path, PathBuf}; use qpm_qmod::models::mod_json::ModJson; -use color_eyre::{eyre::ContextCompat, Result}; +use color_eyre::{Result, eyre::ContextCompat}; use crate::models::{mod_json::ModJsonExtensions, package::PackageConfigExtensions}; diff --git a/src/commands/qmod/edit.rs b/src/commands/qmod/edit.rs index c0c2932..14cb825 100644 --- a/src/commands/qmod/edit.rs +++ b/src/commands/qmod/edit.rs @@ -6,7 +6,10 @@ use qpm_package::models::{package::PackageConfig, shared_package::SharedPackageC use qpm_qmod::models::mod_json::ModJson; use semver::Version; -use crate::{commands::Command, models::{mod_json::ModJsonExtensions, package::PackageConfigExtensions}}; +use crate::{ + commands::Command, + models::{mod_json::ModJsonExtensions, package::PackageConfigExtensions}, +}; /// Some properties are not editable through the qmod edit command, these properties are either editable through the package, or not at all #[derive(Args, Debug, Clone)] @@ -49,7 +52,7 @@ impl Command for EditQmodJsonCommand { .as_deref() .unwrap_or_else(|| Path::new("mod.template.json")); - let mut json = ModJson::read(&mod_template)?; + let mut json = ModJson::read(mod_template)?; if let Some(schema_version) = self.schema_version { json.schema_version = schema_version; diff --git a/src/commands/qmod/manifest.rs b/src/commands/qmod/manifest.rs index 6bb562a..ce28112 100644 --- a/src/commands/qmod/manifest.rs +++ b/src/commands/qmod/manifest.rs @@ -3,7 +3,6 @@ use std::path::{Path, PathBuf}; use clap::Args; use qpm_package::models::shared_package::SharedPackageConfig; use qpm_package::models::triplet::{QPM_ENV_GAME_ID, QPM_ENV_GAME_VERSION}; -use semver::VersionReq; use qpm_qmod::models::mod_json::ModJson; diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 76bf818..9234320 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -1,18 +1,15 @@ use std::{collections::HashMap, path::PathBuf}; use clap::Args; -use color_eyre::eyre::{Context, ContextCompat}; +use color_eyre::eyre::Context; use qpm_package::models::{ - package::PackageConfig, - qpkg::{QPKG_JSON, QPkg, QPkgTripletInfo}, - shared_package::SharedPackageConfig, - triplet::TripletId, - }; + package::PackageConfig, + qpkg::{QPKG_JSON, QPkg, QPkgTripletInfo}, + triplet::TripletId, +}; use zip::{ZipWriter, write::FileOptions}; -use crate::{ - models::package::PackageConfigExtensions, terminal::colors::QPMColor, -}; +use crate::{models::package::PackageConfigExtensions, terminal::colors::QPMColor}; use super::Command; diff --git a/src/commands/restore.rs b/src/commands/restore.rs index e9140ea..5e34b20 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -44,10 +44,7 @@ pub(crate) fn is_ignored() -> bool { excludes.is_ok_and(|mut attribute| { attribute - .at_path( - QPM_SHARED_JSON, - Some(gix::index::entry::Mode::FILE), - ) + .at_path(QPM_SHARED_JSON, Some(gix::index::entry::Mode::FILE)) .is_ok_and(|e| e.is_excluded()) }) }) diff --git a/src/commands/scripts.rs b/src/commands/scripts.rs index 5099024..b61903d 100644 --- a/src/commands/scripts.rs +++ b/src/commands/scripts.rs @@ -107,7 +107,10 @@ pub fn invoke_script( // QPM defined environment variables c.env("QPM_ACTIVE_TRIPLET", triplet_id.to_string()) - .env("QPM_QMOD_ID", triplet.qmod_id.as_deref().unwrap_or(package.id.0.as_str())) + .env( + "QPM_QMOD_ID", + triplet.qmod_id.as_deref().unwrap_or(package.id.0.as_str()), + ) .env("QPM_PACKAGE_ID", package.id.to_string()) .env("QPM_PACKAGE_VERSION", package.version.to_string()); diff --git a/src/models/mod.rs b/src/models/mod.rs index 09e89bc..c01190b 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -2,9 +2,9 @@ pub mod android_repo; pub mod config; pub mod mod_json; pub mod package; +pub mod qpackages; +pub mod qpkg; pub(crate) mod schemas; pub mod toolchain; -pub mod qpkg; -pub mod qpackages; -pub mod package_files; \ No newline at end of file +pub mod package_files; diff --git a/src/models/mod_json.rs b/src/models/mod_json.rs index 71106e9..992b116 100644 --- a/src/models/mod_json.rs +++ b/src/models/mod_json.rs @@ -2,7 +2,7 @@ use std::{ collections::{HashMap, HashSet}, fs::File, io::{BufReader, Read}, - path::{Path, PathBuf}, + path::Path, }; use color_eyre::{Result, eyre::Context}; @@ -21,10 +21,7 @@ pub trait ModJsonExtensions: Sized { fn read(path: &Path) -> Result; fn write(&self, path: &Path) -> Result<()>; - fn merge_modjson( - existing_json: ModJson, - template_mod_json: ModJson, - ) -> ModJson; + fn merge_modjson(existing_json: ModJson, template_mod_json: ModJson) -> ModJson; } pub struct PreProcessingData { @@ -70,7 +67,6 @@ impl PreProcessingData { } impl ModJsonExtensions for ModJson { - fn get_result_name() -> &'static str { "mod.json" } @@ -110,10 +106,7 @@ impl ModJsonExtensions for ModJson { Ok(()) } - fn merge_modjson( - mut existing_json: ModJson, - mut template_mod_json: ModJson, - ) -> ModJson { + fn merge_modjson(mut existing_json: ModJson, mut template_mod_json: ModJson) -> ModJson { let existing_binaries: HashSet = existing_json .library_files .iter() @@ -142,8 +135,6 @@ impl ModJsonExtensions for ModJson { .dependencies .retain(|d| !existing_dependencies.contains_key(&d.id)); - - existing_json .library_files .append(&mut template_mod_json.library_files); @@ -165,24 +156,3 @@ impl ModJsonExtensions for ModJson { existing_json } } - -fn insert_default_mod_binary(existing_json: &mut ModJson, template_mod_json: &mut ModJson) { - // put it all under library - let is_library = existing_json.is_library.unwrap_or(false); - if is_library { - existing_json - .library_files - .append(&mut template_mod_json.late_mod_files); - existing_json - .library_files - .append(&mut template_mod_json.mod_files); - return; - } - - existing_json - .mod_files - .append(&mut template_mod_json.mod_files); - existing_json - .late_mod_files - .append(&mut template_mod_json.late_mod_files); -} diff --git a/src/models/package_files.rs b/src/models/package_files.rs index 74e7c99..3389495 100644 --- a/src/models/package_files.rs +++ b/src/models/package_files.rs @@ -1,4 +1,7 @@ -use std::{ops::Deref, path::{Path, PathBuf}}; +use std::{ + ops::Deref, + path::{Path, PathBuf}, +}; use qpm_package::models::{ package::{DependencyId, QPM_JSON}, @@ -85,7 +88,8 @@ impl PackageTripletPath { } pub fn binary_path(&self, binary: &Path) -> PathBuf { - self.binaries_path().join(binary.file_name().expect("Binary file name")) + self.binaries_path() + .join(binary.file_name().expect("Binary file name")) } } diff --git a/src/models/qpackages.rs b/src/models/qpackages.rs index 72cf506..cfb1b20 100644 --- a/src/models/qpackages.rs +++ b/src/models/qpackages.rs @@ -28,7 +28,8 @@ impl QPackageExtensions for QPackagesPackage { fn read>(dir: P) -> Result where - Self: std::marker::Sized { + Self: std::marker::Sized, + { let path = dir.as_ref().join(QPACKAGES_JSON); let file = File::open(&path).with_context(|| format!("{path:?} does not exist"))?; let res = json::json_from_reader_fast::<_, Self>(BufReader::new(file)) @@ -39,11 +40,10 @@ impl QPackageExtensions for QPackagesPackage { fn write>(&self, dir: P) -> Result<()> { let path = dir.as_ref().join(QPACKAGES_JSON); - - let serialized = serde_json::to_string_pretty(self) - .context("Failed to serialize QPackage")?; - std::fs::write(path, serialized) - .context("Failed to write QPackage to file")?; + + let serialized = + serde_json::to_string_pretty(self).context("Failed to serialize QPackage")?; + std::fs::write(path, serialized).context("Failed to write QPackage to file")?; Ok(()) } -} \ No newline at end of file +} diff --git a/src/models/qpkg.rs b/src/models/qpkg.rs index 99ad400..ad91a33 100644 --- a/src/models/qpkg.rs +++ b/src/models/qpkg.rs @@ -1,18 +1,17 @@ use std::{fs::File, io::BufReader, path::Path}; use color_eyre::eyre::{Context, Result}; -use qpm_package::models::qpkg::{QPkg, QPKG_JSON}; +use qpm_package::models::qpkg::{QPKG_JSON, QPkg}; use crate::utils::json; pub trait QPkgExtensions: Sized { fn exists>(dir: P) -> bool; - + fn read>(dir: P) -> Result where Self: std::marker::Sized; fn write>(&self, dir: P) -> Result<()>; - } impl QPkgExtensions for QPkg { @@ -23,23 +22,21 @@ impl QPkgExtensions for QPkg { fn read>(dir: P) -> Result where - Self: std::marker::Sized { + Self: std::marker::Sized, + { let path = dir.as_ref().join(QPKG_JSON); let file = File::open(&path).with_context(|| format!("{path:?} does not exist"))?; let res = json::json_from_reader_fast::<_, Self>(BufReader::new(file)) .with_context(|| format!("Unable to read PackageConfig at {path:?}"))?; - Ok(res) } fn write>(&self, dir: P) -> Result<()> { let path = dir.as_ref().join(QPKG_JSON); - - let serialized = serde_json::to_string_pretty(self) - .context("Failed to serialize QPkg")?; - std::fs::write(path, serialized) - .context("Failed to write QPkg to file")?; + + let serialized = serde_json::to_string_pretty(self).context("Failed to serialize QPkg")?; + std::fs::write(path, serialized).context("Failed to write QPkg to file")?; Ok(()) } -} \ No newline at end of file +} diff --git a/src/models/toolchain.rs b/src/models/toolchain.rs index db2109b..b87c44e 100644 --- a/src/models/toolchain.rs +++ b/src/models/toolchain.rs @@ -1,7 +1,9 @@ use std::{fs::File, path::PathBuf}; use color_eyre::eyre::Result; -use qpm_package::models::{extra::PackageTripletCompileOptions, shared_package::SharedPackageConfig}; +use qpm_package::models::{ + extra::PackageTripletCompileOptions, shared_package::SharedPackageConfig, +}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; @@ -29,8 +31,12 @@ pub fn write_toolchain_file( .restored_dependencies .iter() .filter_map(|(dep_id, dep_triplet)| { - let dep_config = repo.get_package(dep_id, &dep_triplet.restored_version).ok()??; - let dep_triplet_config = dep_config.triplets.get_triplet_settings(&dep_triplet.restored_triplet)?; + let dep_config = repo + .get_package(dep_id, &dep_triplet.restored_version) + .ok()??; + let dep_triplet_config = dep_config + .triplets + .get_triplet_settings(&dep_triplet.restored_triplet)?; let package_id = &dep_config.id; let prepend_path = |dir: &String| format!("{extern_dir}/includes/{package_id}/{dir}"); diff --git a/src/repository/local.rs b/src/repository/local.rs index 5fb7572..74c1854 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -418,7 +418,7 @@ impl FileRepository { let extern_binaries = extern_dir.join("libs"); let extern_headers = extern_dir.join("includes"); - + let mut paths = HashMap::::new(); // direct deps (binaries) diff --git a/src/repository/mod.rs b/src/repository/mod.rs index 26ee43a..c62cfc4 100644 --- a/src/repository/mod.rs +++ b/src/repository/mod.rs @@ -22,11 +22,7 @@ pub trait Repository { /// Ordered by version descending fn get_package_versions(&self, id: &DependencyId) -> Result>>; - fn get_package( - &self, - id: &DependencyId, - version: &Version, - ) -> Result>; + fn get_package(&self, id: &DependencyId, version: &Version) -> Result>; // add to the db cache // this just stores the shared config itself, not the package fn add_to_db_cache(&mut self, config: PackageConfig, permanent: bool) -> Result<()>; diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index c2d3cf2..64b2ba0 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -17,11 +17,11 @@ use zip::ZipArchive; use serde::Deserialize; use qpm_package::models::{ - package::{DependencyId, PackageConfig}, - qpackages::QPackagesPackage, - qpkg::{QPKG_JSON, QPkg}, - shared_package::SharedPackageConfig, - }; + package::{DependencyId, PackageConfig}, + qpackages::QPackagesPackage, + qpkg::{QPKG_JSON, QPkg}, + shared_package::SharedPackageConfig, +}; use crate::{ models::{ @@ -239,11 +239,8 @@ impl QPMRepository { // assert that the triplets binaries are present for triplet in config.triplets.iter_triplets() { - let triplet_path = package_path - .clone() - .triplet(triplet.0.clone()); - let triplet_bin_path = triplet_path - .binaries_path(); + let triplet_path = package_path.clone().triplet(triplet.0.clone()); + let triplet_bin_path = triplet_path.binaries_path(); if !triplet_bin_path.exists() { bail!( "Triplet binaries for {} not found in {}", diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index 0252510..0fa2e32 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -225,7 +225,6 @@ pub fn resolve<'a>( if id.0 == root.id && version == root.version { return None; } - let package = repository .get_package(&id.0, &version.into()) @@ -278,7 +277,12 @@ pub fn restore>( repository.write_repo()?; println!("Copying now"); - FileRepository::copy_from_cache(&shared_package.config, triplet, resolved_deps, workspace.as_ref())?; + FileRepository::copy_from_cache( + &shared_package.config, + triplet, + resolved_deps, + workspace.as_ref(), + )?; shared_package.try_write_toolchain(repository)?; diff --git a/src/utils/git.rs b/src/utils/git.rs index 1e99e25..8f9dbb2 100644 --- a/src/utils/git.rs +++ b/src/utils/git.rs @@ -1,6 +1,14 @@ -use std::{fs::File, io::{BufReader, BufWriter}, path::Path, process::{Command, Stdio}}; +use std::{ + fs::File, + io::{BufReader, BufWriter}, + path::Path, + process::{Command, Stdio}, +}; -use color_eyre::{eyre::{bail, Context, Result}, Section}; +use color_eyre::{ + Section, + eyre::{Context, Result, bail}, +}; use owo_colors::OwoColorize; use serde::{Deserialize, Serialize}; From 887eb8da10fb11f36f9ef128aae0a0434bc77d19 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Mon, 28 Jul 2025 18:26:10 -0400 Subject: [PATCH 028/119] Refactor qpkg installation to be backend agnostic --- Cargo.lock | 2 +- src/commands/qpkg.rs | 3 +- src/repository/local.rs | 150 +++++++++++++++++++++++++++++++++++- src/repository/qpackages.rs | 129 ++++--------------------------- src/utils/json.rs | 2 +- 5 files changed, 170 insertions(+), 116 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8b1b0c3..4e69334 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2495,7 +2495,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#bb902df2b44ee7d5877105ae7f2dad9c94705e14" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#9fa5ba5e3eb06f15531c8e5b7c7b7b6d5c68f023" dependencies = [ "cursed-semver-parser", "schemars", diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 9234320..7b3f002 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -67,7 +67,8 @@ impl Command for QPkgCommand { .collect(); let qpkg = QPkg { - shared_dir: package.shared_directory, + shared_dir: package.shared_directory.clone(), + config: package, triplets, }; diff --git a/src/repository/local.rs b/src/repository/local.rs index 74c1854..0a520af 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -6,6 +6,7 @@ use itertools::Itertools; use owo_colors::OwoColorize; use qpm_package::models::{ package::{DependencyId, PackageConfig}, + qpkg::{QPKG_JSON, QPkg}, triplet::TripletId, }; use schemars::JsonSchema; @@ -14,16 +15,18 @@ use serde::{Deserialize, Serialize}; use std::{ collections::{HashMap, HashSet, hash_map::Entry}, fs, - io::{BufReader, Write}, + io::{BufReader, Cursor, Read, Write}, ops::Not, path::{Path, PathBuf}, }; +use zip::ZipArchive; use crate::{ models::{ config::get_combine_config, package::PackageConfigExtensions, package_files::PackageIdPath, + qpkg::QPkgExtensions, schemas::{SchemaLinks, WithSchema}, }, resolver::dependency::ResolvedDependency, @@ -230,6 +233,151 @@ impl FileRepository { fs::remove_file(Self::global_file_repository_path()) } + pub fn install_qpkg(bytes: T) -> color_eyre::Result<()> + where + T: Read + AsRef<[u8]>, + { + let buffer = Cursor::new(bytes); + + // Extract to tmp folder + let mut zip_archive = ZipArchive::new(buffer).context("Reading zip")?; + + // get qpkg in memory + let qpkg_file = zip_archive + .by_name(QPKG_JSON) + .with_context(|| format!("Failed to find {QPKG_JSON} in zip"))?; + + let qpkg: QPkg = json::json_from_reader_fast(qpkg_file) + .with_context(|| format!("Failed to read {QPKG_JSON} from zip"))?; + + let config = &qpkg.config; + + let package_path: crate::models::package_files::PackageVersionPath = + PackageIdPath::new(config.id.clone()).version(config.version.clone()); + + let src_path = package_path.src_path(); + let tmp_path = package_path.tmp_path(); + let qpkg_file_dst = package_path.qpkg_json_path(); + + let headers_dst = package_path.src_path(); + + // ensure the src path exists + if !headers_dst.exists() { + // src did not exist, this means that we need to download the repo/zip file from packageconfig.url + fs::create_dir_all(&src_path) + .with_context(|| format!("Failed to create lib path {headers_dst:?}"))?; + } + + // if the tmp path exists, but src doesn't, that's a failed cache, delete it and try again! + if tmp_path.exists() { + fs::remove_dir_all(&tmp_path) + .with_context(|| format!("Failed to remove existing tmp folder {tmp_path:?}"))?; + } + + // make tmp_path + fs::create_dir_all(&tmp_path).with_context(|| { + format!( + "Failed to create tmp folder {}", + tmp_path.display().file_path_color() + ) + })?; + + // now extract the zip to the tmp path + zip_archive.extract(&tmp_path).context("Zip extraction")?; + + // copy QPKG.qpm.json to {cache}/{id}/{version}/src/qpm2.qpkg.json + fs::copy(tmp_path.join(QPKG_JSON), &qpkg_file_dst).with_context(|| { + format!( + "Failed to copy QPkg file from {} to {}", + tmp_path.display().file_path_color(), + qpkg_file_dst.display().file_path_color() + ) + })?; + + // copy headers to src folder + fs::copy(tmp_path.join(&qpkg.shared_dir), &headers_dst).with_context(|| { + format!( + "Failed to copy headers from {} to {}", + tmp_path.display().file_path_color(), + headers_dst.display().file_path_color() + ) + })?; + + // copy binaries to lib folder + for (triplet_id, triplet_info) in &qpkg.triplets { + let bin_dir = package_path + .clone() + .triplet(triplet_id.clone()) + .binaries_path(); + + if !bin_dir.exists() { + fs::create_dir_all(&bin_dir).context("Failed to create lib path")?; + } + + for file in &triplet_info.files { + let src_file = tmp_path.join(file); + let dst_file = bin_dir.join(file.file_name().unwrap()); + // copy as {cache}/{id}/{version}/{triplet}/lib/{file_name} + fs::copy(&src_file, &dst_file).with_context(|| { + format!( + "Failed to copy file from {} to {}", + src_file.display().file_path_color(), + dst_file.display().file_path_color() + ) + })?; + } + } + + // assert that the triplets binaries are present + for (triplet_id, triplet) in config.triplets.iter_triplets() { + let triplet_path = package_path.clone().triplet(triplet_id.clone()); + let triplet_bin_path = triplet_path.binaries_path(); + if !triplet_bin_path.exists() { + bail!( + "Triplet binaries for {} not found in {}", + triplet_id.triplet_id_color(), + triplet_bin_path.display().file_path_color() + ); + } + + for binary in triplet.out_binaries.iter().flatten() { + // {cache}/{id}/{version}/{triplet}/lib/{binary} + let binary_path = triplet_path.binary_path(binary); + if !binary_path.exists() { + bail!( + "Binary {} not found in triplet {} at {}", + binary.display().file_path_color(), + triplet_id.triplet_id_color(), + binary_path.display().file_path_color() + ); + } + } + } + + // now write the package config to the src path + config.write(&src_path).with_context(|| { + format!( + "Failed to write package config to {}", + src_path.display().file_path_color() + ) + })?; + + // write the qpkg file to the src path + qpkg.write(&src_path).with_context(|| { + format!( + "Failed to write QPkg file to {}", + src_path.display().file_path_color() + ) + })?; + + // clear up tmp folder if it still exists + if tmp_path.exists() { + std::fs::remove_dir_all(tmp_path).context("Failed to remove tmp folder")?; + } + + Ok(()) + } + pub fn copy_from_cache( package: &PackageConfig, triplet: &TripletId, diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 64b2ba0..5dc408c 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -10,16 +10,14 @@ use semver::Version; use sha2::{Digest, Sha256}; use std::{ fs::{self}, - io::Cursor, + io::Read, }; -use zip::ZipArchive; use serde::Deserialize; use qpm_package::models::{ package::{DependencyId, PackageConfig}, qpackages::QPackagesPackage, - qpkg::{QPKG_JSON, QPkg}, shared_package::SharedPackageConfig, }; @@ -29,6 +27,7 @@ use crate::{ qpackages::QPackageExtensions, qpkg::QPkgExtensions, }, network::agent::{download_file_report, get_agent}, + repository::local::FileRepository, terminal::colors::QPMColor, }; @@ -136,27 +135,11 @@ impl QPMRepository { let src_path = package_path.src_path(); let tmp_path = package_path.tmp_path(); - let qpkg_file_dst = package_path.qpkg_json_path(); - let headers_dst = package_path.src_path(); - if QPackagesPackage::read(&src_path).is_ok() { // already cached, no need to download again return Ok(()); } - // Downloads the repo / zip file into src folder w/ subfolder taken into account - if !headers_dst.exists() { - // src did not exist, this means that we need to download the repo/zip file from packageconfig.url - fs::create_dir_all(&src_path) - .with_context(|| format!("Failed to create lib path {headers_dst:?}"))?; - } - - // if the tmp path exists, but src doesn't, that's a failed cache, delete it and try again! - if tmp_path.exists() { - fs::remove_dir_all(&tmp_path) - .with_context(|| format!("Failed to remove existing tmp folder {tmp_path:?}"))?; - } - let qpkg_url = &qpackage_config.qpkg_url; let mut bytes = BytesMut::new().writer(); @@ -164,11 +147,9 @@ impl QPMRepository { download_file_report(qpkg_url, &mut bytes, |_, _| {}) .with_context(|| format!("Failed while downloading {}", qpkg_url.blue()))?; - let buffer = Cursor::new(bytes.get_ref()); - // Ensure checksum matches if let Some(checksum) = &qpackage_config.qpkg_checksum { - let result = Sha256::digest(buffer.get_ref()); + let result = Sha256::digest(bytes.get_ref()); let hash_hex = hex::encode(result); if !hash_hex.eq_ignore_ascii_case(checksum) { @@ -181,108 +162,32 @@ impl QPMRepository { } } - // Extract to tmp folder - ZipArchive::new(buffer) - .context("Reading zip")? - .extract(&tmp_path) - .context("Zip extraction")?; - - let qpkg_file = QPkg::read(&tmp_path).with_context(|| { - format!( - "Failed to read QPkg file from {}", - tmp_path.display().file_path_color() - ) - })?; - - // copy QPKG.qpm.json to {cache}/{id}/{version}/src/qpm2.qpkg.json - fs::copy(tmp_path.join(QPKG_JSON), &qpkg_file_dst).with_context(|| { + FileRepository::install_qpkg(bytes.get_ref().as_ref()).with_context(|| { format!( - "Failed to copy QPkg file from {} to {}", - tmp_path.display().file_path_color(), - qpkg_file_dst.display().file_path_color() + "QPackages QPKG installation from {}:{}", + qpackage_config.config.id, qpackage_config.config.version ) })?; - // copy headers to src folder - fs::copy(tmp_path.join(qpkg_file.shared_dir), &headers_dst).with_context(|| { - format!( - "Failed to copy headers from {} to {}", - tmp_path.display().file_path_color(), - headers_dst.display().file_path_color() - ) - })?; - - // copy binaries to lib folder - for (triplet_id, triplet_info) in &qpkg_file.triplets { - let bin_dir = package_path - .clone() - .triplet(triplet_id.clone()) - .binaries_path(); - - if !bin_dir.exists() { - fs::create_dir_all(&bin_dir).context("Failed to create lib path")?; - } - - for file in &triplet_info.files { - let src_file = tmp_path.join(file); - let dst_file = bin_dir.join(file.file_name().unwrap()); - // copy as {cache}/{id}/{version}/{triplet}/lib/{file_name} - fs::copy(&src_file, &dst_file).with_context(|| { - format!( - "Failed to copy file from {} to {}", - src_file.display().file_path_color(), - dst_file.display().file_path_color() - ) - })?; - } - } - - // assert that the triplets binaries are present - for triplet in config.triplets.iter_triplets() { - let triplet_path = package_path.clone().triplet(triplet.0.clone()); - let triplet_bin_path = triplet_path.binaries_path(); - if !triplet_bin_path.exists() { - bail!( - "Triplet binaries for {} not found in {}", - triplet.0.triplet_id_color(), - triplet_bin_path.display().file_path_color() - ); - } - - for binary in triplet.1.out_binaries.iter().flatten() { - // {cache}/{id}/{version}/{triplet}/lib/{binary} - let binary_path = triplet_path.binary_path(binary); - if !binary_path.exists() { - bail!( - "Binary {} not found in triplet {} at {}", - binary.display().file_path_color(), - triplet.0.triplet_id_color(), - binary_path.display().file_path_color() - ); - } - } + let package = PackageConfig::read(&src_path)?; + // assert that the package is the same as the one we downloaded + if package != qpackage_config.config { + bail!( + "Package config mismatch. Got {}:{}: expected {:?}, got {:?} (the changes might not be id/version, but the config itself)", + package.id.dependency_id_color(), + package.version.version_id_color(), + qpackage_config.config, + package + ); } - // now write the package config to the src path - qpackage_config.config.write(&src_path).with_context(|| { - format!( - "Failed to write package config to {}", - src_path.display().file_path_color() - ) - })?; - qpackage_config.write(&src_path).with_context(|| { format!( - "Failed to write QPkg to {}", + "Failed to write QPackages.json to {}", src_path.display().file_path_color() ) })?; - // clear up tmp folder if it still exists - if tmp_path.exists() { - std::fs::remove_dir_all(tmp_path).context("Failed to remove tmp folder")?; - } - Ok(()) } } diff --git a/src/utils/json.rs b/src/utils/json.rs index af31f84..1d2e2b2 100644 --- a/src/utils/json.rs +++ b/src/utils/json.rs @@ -6,7 +6,7 @@ #[inline(always)] pub fn json_from_reader_fast(mut rdr: R) -> color_eyre::Result where - R: std::io::BufRead, + R: std::io::Read, T: serde::de::DeserializeOwned, { let mut bytes = Vec::::with_capacity(8 * 1024); From 166c4ba9e5e67f5ef2a8202195df246fb96d5c4b Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Mon, 28 Jul 2025 18:45:26 -0400 Subject: [PATCH 029/119] Enhance InstallCommand with URL support and legacy installation option --- src/commands/install.rs | 76 ++++++++++++++++++++++++++++++------- src/repository/local.rs | 28 +++++++++----- src/repository/qpackages.rs | 13 +++---- 3 files changed, 86 insertions(+), 31 deletions(-) diff --git a/src/commands/install.rs b/src/commands/install.rs index 1f3962e..5eadf9b 100644 --- a/src/commands/install.rs +++ b/src/commands/install.rs @@ -1,12 +1,17 @@ -use std::path::PathBuf; +use std::{ + fs::File, + io::{BufReader, Cursor}, + path::PathBuf, +}; +use bytes::{BufMut, BytesMut}; use clap::Args; -use color_eyre::eyre::{ContextCompat, bail}; +use color_eyre::eyre::{Context, ContextCompat, bail}; use qpm_package::models::shared_package::SharedPackageConfig; use crate::{ - models::package::PackageConfigExtensions, - repository::{self, local::FileRepository}, + models::package::PackageConfigExtensions, network::agent::download_file_report, + repository::local::FileRepository, terminal::colors::QPMColor, }; use super::Command; @@ -16,29 +21,75 @@ pub struct InstallCommand { #[clap(long, default_value = "false")] offline: bool, + /// Path to the qpkg file to install + #[clap(long = "path")] + qpkg_path: Option, + + /// URL of the qpkg to install + #[clap(long = "url")] + qpkg_url: Option, + #[clap(long, default_value = "false")] pub no_validate: bool, + + /// Whether to install the qpkg as a legacy package + #[clap(long, default_value = "false")] + pub legacy: bool, } impl Command for InstallCommand { fn execute(self) -> color_eyre::Result<()> { - println!("Publishing package to local file repository"); + if self.legacy { + return self.local_install(); + } + self.qpkg_install()?; + Ok(()) + } +} - // let package = PackageConfig::read(".")?; - let repo = repository::useful_default_new(self.offline)?; - let shared_package = SharedPackageConfig::read(".")?; +impl InstallCommand { + fn qpkg_install(&self) -> Result<(), color_eyre::eyre::Error> { + let package = if let Some(qpkg_path) = &self.qpkg_path { + println!("Installing qpkg from path: {}", qpkg_path.display()); + + let qpkg_file = File::open(qpkg_path).context("Failed to open qpkg file")?; + let qpkg_file = BufReader::new(qpkg_file); + + FileRepository::install_qpkg(qpkg_file, true).context("Installing qpkg zip failed")? + } else if let Some(qpkg_url) = &self.qpkg_url { + println!("Installing qpkg from URL: {qpkg_url}"); + + let mut bytes = BytesMut::new().writer(); + download_file_report(qpkg_url, &mut bytes, |_, _| {}) + .context("Downloading qpkg file failed")?; + + let cursor = Cursor::new(bytes.get_ref()); + FileRepository::install_qpkg(cursor, true).context("Installing qpkg zip failed")? + } else { + bail!("Either --path or --url must be provided to install a qpkg"); + }; + + println!( + "Successfully installed qpkg: {}:{}", + package.id.dependency_id_color(), + package.version.version_id_color() + ); + + Ok(()) + } + + fn local_install(&self) -> Result<(), color_eyre::eyre::Error> { + println!("Publishing package to local file repository"); + let shared_package = SharedPackageConfig::read(".")?; let project_folder = PathBuf::from(".").canonicalize()?; let restored_triplet_id = shared_package.restored_triplet; - let restored_triplet = shared_package .config .triplets .get_triplet_settings(&restored_triplet_id) .context("Failed to get triplet")?; - let binaries = restored_triplet.out_binaries.unwrap_or_default(); - if !self.no_validate { println!("Skipping validation of binaries"); } else { @@ -48,7 +99,6 @@ impl Command for InstallCommand { } } } - let mut file_repo = FileRepository::read()?; FileRepository::copy_to_cache( &shared_package.config, @@ -57,9 +107,7 @@ impl Command for InstallCommand { binaries, false, )?; - file_repo.add_artifact_and_cache(shared_package.config, true)?; - file_repo.write()?; Ok(()) } diff --git a/src/repository/local.rs b/src/repository/local.rs index 0a520af..1dd2b84 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -15,7 +15,7 @@ use serde::{Deserialize, Serialize}; use std::{ collections::{HashMap, HashSet, hash_map::Entry}, fs, - io::{BufReader, Cursor, Read, Write}, + io::{BufReader, Read, Seek, Write}, ops::Not, path::{Path, PathBuf}, }; @@ -107,6 +107,7 @@ impl FileRepository { Ok(()) } + #[deprecated(note = "Use qpkg_install instead")] pub fn copy_to_cache( package: &PackageConfig, triplet: &TripletId, @@ -233,11 +234,20 @@ impl FileRepository { fs::remove_file(Self::global_file_repository_path()) } - pub fn install_qpkg(bytes: T) -> color_eyre::Result<()> + pub fn install_qpkg(buffer: T, overwrite_existing: bool) -> color_eyre::Result where - T: Read + AsRef<[u8]>, + T: Read + Seek, { - let buffer = Cursor::new(bytes); + if QPkg::exists(".") { + match overwrite_existing { + false => { + bail!("QPKG already exists in the current directory"); + } + true => { + println!("Overwriting existing QPKG in the current directory"); + } + } + } // Extract to tmp folder let mut zip_archive = ZipArchive::new(buffer).context("Reading zip")?; @@ -250,10 +260,8 @@ impl FileRepository { let qpkg: QPkg = json::json_from_reader_fast(qpkg_file) .with_context(|| format!("Failed to read {QPKG_JSON} from zip"))?; - let config = &qpkg.config; - let package_path: crate::models::package_files::PackageVersionPath = - PackageIdPath::new(config.id.clone()).version(config.version.clone()); + PackageIdPath::new(qpkg.config.id.clone()).version(qpkg.config.version.clone()); let src_path = package_path.src_path(); let tmp_path = package_path.tmp_path(); @@ -329,7 +337,7 @@ impl FileRepository { } // assert that the triplets binaries are present - for (triplet_id, triplet) in config.triplets.iter_triplets() { + for (triplet_id, triplet) in qpkg.config.triplets.iter_triplets() { let triplet_path = package_path.clone().triplet(triplet_id.clone()); let triplet_bin_path = triplet_path.binaries_path(); if !triplet_bin_path.exists() { @@ -355,7 +363,7 @@ impl FileRepository { } // now write the package config to the src path - config.write(&src_path).with_context(|| { + qpkg.config.write(&src_path).with_context(|| { format!( "Failed to write package config to {}", src_path.display().file_path_color() @@ -375,7 +383,7 @@ impl FileRepository { std::fs::remove_dir_all(tmp_path).context("Failed to remove tmp folder")?; } - Ok(()) + Ok(qpkg.config) } pub fn copy_from_cache( diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 5dc408c..2a8d2dd 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -8,10 +8,7 @@ use owo_colors::OwoColorize; use reqwest::StatusCode; use semver::Version; use sha2::{Digest, Sha256}; -use std::{ - fs::{self}, - io::Read, -}; +use std::io::Read; use serde::Deserialize; @@ -133,7 +130,6 @@ impl QPMRepository { let package_path = PackageIdPath::new(config.id.clone()).version(config.version.clone()); let src_path = package_path.src_path(); - let tmp_path = package_path.tmp_path(); if QPackagesPackage::read(&src_path).is_ok() { // already cached, no need to download again @@ -147,9 +143,12 @@ impl QPMRepository { download_file_report(qpkg_url, &mut bytes, |_, _| {}) .with_context(|| format!("Failed while downloading {}", qpkg_url.blue()))?; + let cursor = std::io::Cursor::new(bytes.get_ref()); + + // Ensure checksum matches if let Some(checksum) = &qpackage_config.qpkg_checksum { - let result = Sha256::digest(bytes.get_ref()); + let result = Sha256::digest(cursor.get_ref()); let hash_hex = hex::encode(result); if !hash_hex.eq_ignore_ascii_case(checksum) { @@ -162,7 +161,7 @@ impl QPMRepository { } } - FileRepository::install_qpkg(bytes.get_ref().as_ref()).with_context(|| { + FileRepository::install_qpkg(cursor, false).with_context(|| { format!( "QPackages QPKG installation from {}:{}", qpackage_config.config.id, qpackage_config.config.version From f40da475d8c5eaac43bf957a56149ca24df27f38 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Mon, 28 Jul 2025 18:46:57 -0400 Subject: [PATCH 030/119] Fix binary name --- installer/installer.iss | 2 +- src/network/github.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/installer/installer.iss b/installer/installer.iss index 28c1596..2c63ce5 100644 --- a/installer/installer.iss +++ b/installer/installer.iss @@ -8,7 +8,7 @@ #define MyAppPublisher "QuestPackageManager" #define MyAppDescription "Quest Package Manager (QPM) is a command-line tool for managing and creating Quest mod projects. It functions as a package manager specifically designed for these projects, simplifying the process of handling mods and their dependencies." #define MyAppURL "https://github.com/QuestPackageManager/QPM.CLI" -#define MyAppExeName "qpm.exe" +#define MyAppExeName "qpm2.exe" [Setup] ; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. diff --git a/src/network/github.rs b/src/network/github.rs index 5812f2a..bcb1471 100644 --- a/src/network/github.rs +++ b/src/network/github.rs @@ -8,13 +8,13 @@ const GITHUB_REPO: &str = "QPM.CLI"; const GITHUB_ACTION: &str = "cargo-build"; #[cfg(windows)] -const GITHUB_ARTIFACT_NAME: &str = "windows-qpm.exe"; +const GITHUB_ARTIFACT_NAME: &str = "windows-qpm2.exe"; #[cfg(target_os = "linux")] -const GITHUB_ARTIFACT_NAME: &str = "linux-qpm"; +const GITHUB_ARTIFACT_NAME: &str = "linux-qpm2"; #[cfg(target_os = "macos")] -const GITHUB_ARTIFACT_NAME: &str = "macos-qpm"; +const GITHUB_ARTIFACT_NAME: &str = "macos-qpm2"; #[derive(Serialize, Deserialize)] pub struct GithubBranchResponse { From 7b288fdfbe45a067a1df11637935e9ec606f564c Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Mon, 28 Jul 2025 18:57:31 -0400 Subject: [PATCH 031/119] Rename output files and artifacts to use 'qpm2' prefix for clarity --- .github/workflows/cargo-build.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/cargo-build.yml b/.github/workflows/cargo-build.yml index e21b25b..b442aab 100644 --- a/.github/workflows/cargo-build.yml +++ b/.github/workflows/cargo-build.yml @@ -193,28 +193,28 @@ jobs: - name: Compress build if: matrix.file-name != '' && matrix.prefix != '' && startsWith(matrix.os, 'windows-') run: | - pwsh -Command Compress-Archive ./target/${{ matrix.target }}/release/${{matrix.file-name}} -DestinationPath qpm-${{matrix.suffix}}.zip + pwsh -Command Compress-Archive ./target/${{ matrix.target }}/release/${{matrix.file-name}} -DestinationPath qpm2-${{matrix.suffix}}.zip # Non-windows - name: Compress build if: matrix.file-name != '' && matrix.prefix != '' && !startsWith(matrix.os, 'windows-') run: | chmod +x "./target/${{ matrix.target }}/release/${{matrix.file-name}}" - zip -j "qpm-${{matrix.suffix}}.zip" "./target/${{ matrix.target }}/release/${{matrix.file-name}}" + zip -j "qpm2-${{matrix.suffix}}.zip" "./target/${{ matrix.target }}/release/${{matrix.file-name}}" - name: Artifact Upload (Archive) if: matrix.prefix != '' uses: actions/upload-artifact@v4 with: name: release-${{matrix.suffix}} - path: qpm-${{matrix.suffix}}.zip + path: qpm2-${{matrix.suffix}}.zip if-no-files-found: error - name: Artifact Upload if: matrix.prefix != '' uses: actions/upload-artifact@v4 with: - name: ${{matrix.prefix}}-qpm + name: ${{matrix.prefix}}-qpm2 path: target/${{ matrix.target }}/release/${{matrix.file-name}} if-no-files-found: error @@ -238,7 +238,7 @@ jobs: if: matrix.file-name != '' && matrix.os == 'windows-latest' && matrix.target != 'aarch64-pc-windows-msvc' with: name: release-installer-${{ matrix.prefix }} - path: ./installer/qpm-installer.exe + path: ./installer/qpm2-installer.exe if-no-files-found: error macos-universal: @@ -249,31 +249,31 @@ jobs: - name: Download Intel macOS build uses: actions/download-artifact@v4 with: - name: macos-x64-qpm + name: macos-x64-qpm2 path: macos-x64 - name: Download ARM macOS build uses: actions/download-artifact@v4 with: - name: macos-arm64-qpm + name: macos-arm64-qpm2 path: macos-arm64 - name: Make Universal Binary run: | - lipo -create -output "qpm" "macos-x64/qpm" "macos-arm64/qpm" - chmod +x qpm - zip -j "qpm-macos-universal.zip" "qpm" + lipo -create -output "qpm2" "macos-x64/qpm2" "macos-arm64/qpm2" + chmod +x qpm2 + zip -j "qpm2-macos-universal.zip" "qpm2" - name: Artifact Upload (Archive) uses: actions/upload-artifact@v4 with: name: release-macos-universal - path: qpm-macos-universal.zip + path: qpm2-macos-universal.zip if-no-files-found: error - name: Artifact Upload uses: actions/upload-artifact@v4 with: - name: macos-universal-qpm - path: qpm + name: macos-universal-qpm2 + path: qpm2 if-no-files-found: error From bb9bce6712b88bdaf03880be79b5ea9f0e2d8f5f Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Mon, 28 Jul 2025 19:03:39 -0400 Subject: [PATCH 032/119] Update installer output filename and PATH reference to use 'qpm2' --- installer/installer.iss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/installer/installer.iss b/installer/installer.iss index 2c63ce5..c16528a 100644 --- a/installer/installer.iss +++ b/installer/installer.iss @@ -31,14 +31,14 @@ InfoAfterFile=.\information.txt ;PrivilegesRequired=lowest PrivilegesRequiredOverridesAllowed=dialog OutputDir=.\ -OutputBaseFilename=qpm-installer +OutputBaseFilename=qpm2-installer Compression=lzma SolidCompression=yes WizardStyle=modern ArchitecturesInstallIn64BitMode=x64 ; Taken from https://stackoverflow.com/a/46609047/11395424. Credit to author Wojciech Mleczek -; Adds qpm to PATH on installation and remove on uninstallation +; Adds qpm2 to PATH on installation and remove on uninstallation [Code] const SystemEnvironmentKey = 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'; const UserEnvironmentKey = 'Environment'; From 9c1a71116f8cd227f599daad3ff0212ef31a8540 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 30 Jul 2025 13:25:40 -0400 Subject: [PATCH 033/119] Allow resolving `default` dependency --- src/commands/dependency.rs | 10 ++++++++-- src/commands/restore.rs | 2 +- src/models/package.rs | 22 +++++++++++++++------- src/resolver/dependency.rs | 5 ++--- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/commands/dependency.rs b/src/commands/dependency.rs index 3e95be1..b8dd463 100644 --- a/src/commands/dependency.rs +++ b/src/commands/dependency.rs @@ -71,6 +71,9 @@ pub struct DependencyOperationDownloadArgs { #[clap(short, long)] pub version: Option, + #[clap(long, short)] + pub triplet: Option, + /// Resolve all dependencies of the package #[clap(long, default_value = "false")] pub recursive: bool, @@ -242,8 +245,11 @@ fn download_dependency(dependency_args: DependencyOperationDownloadArgs) -> Resu // if recursive is true, resolve the dependencies of the package if dependency_args.recursive - && let Ok(resolved_deps) = - SharedPackageConfig::resolve_from_package(package.clone(), &repository) + && let Ok(resolved_deps) = SharedPackageConfig::resolve_from_package( + package.clone(), + dependency_args.triplet.map(TripletId), + &repository, + ) { let resolved_deps = resolved_deps.1; diff --git a/src/commands/restore.rs b/src/commands/restore.rs index 5e34b20..0a28de4 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -114,7 +114,7 @@ impl Command for RestoreCommand { println!("Resolving packages"); let (spc_result, mut restored_deps) = - SharedPackageConfig::resolve_from_package(package, &repo)?; + SharedPackageConfig::resolve_from_package(package, Some(triplet_id.clone()), &repo)?; // update shared_package shared_package_opt = Some(spc_result); diff --git a/src/models/package.rs b/src/models/package.rs index b57f6b6..675e43b 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -11,7 +11,7 @@ use qpm_package::models::{ shared_package::{ QPM_SHARED_JSON, SharedPackageConfig, SharedTriplet, SharedTripletDependencyInfo, }, - triplet::{PackageTriplet, PackageTripletDependency, TripletId}, + triplet::{PackageTriplet, PackageTripletDependency, TripletId, default_triplet_id}, }; use qpm_qmod::models::mod_json::{ModDependency, ModJson}; use semver::VersionReq; @@ -19,6 +19,7 @@ use semver::VersionReq; use crate::{ repository::Repository, resolver::dependency::{ResolvedDependency, resolve}, + terminal::colors::QPMColor, utils::json, }; @@ -45,6 +46,7 @@ pub trait PackageConfigExtensions { pub trait SharedPackageConfigExtensions: Sized { fn resolve_from_package( config: PackageConfig, + triplet: Option, repository: &impl Repository, ) -> Result<(Self, HashMap>)>; @@ -178,15 +180,15 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { /// Returns a tuple of the SharedPackageConfig and a map of triplet IDs to resolved fn resolve_from_package( config: PackageConfig, + triplet: Option, repository: &impl Repository, ) -> Result<(Self, HashMap>)> { // for each triplet, resolve the dependencies let triplet_dependencies: HashMap = config .triplets - .specific_triplets - .keys() - .map(|triplet_id| -> color_eyre::Result<_> { - let resolved = resolve(&config, repository, triplet_id)?.collect_vec(); + .iter_triplets() + .map(|(triplet_id, _triplet)| -> color_eyre::Result<_> { + let resolved = resolve(&config, repository, &triplet_id)?.collect_vec(); Ok((triplet_id.clone(), resolved)) }) @@ -229,7 +231,7 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { let shared_package_config = SharedPackageConfig { config, - restored_triplet: Default::default(), + restored_triplet: triplet.unwrap_or(default_triplet_id()), locked_triplet, }; Ok((shared_package_config, triplet_dependencies)) @@ -330,7 +332,13 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { fn get_restored_triplet(&self) -> &SharedTriplet { self.locked_triplet .get(&self.restored_triplet) - .expect("Restored triplet should exist in locked triplet map") + .unwrap_or_else(|| { + panic!( + "Restored triplet {} should exist in locked triplet map {:?}", + self.restored_triplet.triplet_id_color(), + self.locked_triplet.keys() + ) + }) } } diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index 0fa2e32..f60295d 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -102,8 +102,7 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> let triplet = self .root .triplets - .specific_triplets - .get(&package_triplet.1) + .get_triplet_settings(&package_triplet.1) .expect("Root triplet should always exist in the root package's triplets"); let deps = triplet @@ -276,7 +275,7 @@ pub fn restore>( repository.write_repo()?; - println!("Copying now"); + println!("Copying now {}", triplet.triplet_id_color()); FileRepository::copy_from_cache( &shared_package.config, triplet, From 2bf8789d0872ad842a07d241823ca37a4995c97b Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 30 Jul 2025 13:26:00 -0400 Subject: [PATCH 034/119] Fix test --- .vscode/launch.json | 10 +++++----- test_package/qpm2.json | 25 +++++++++++++++++++++++++ test_package/qpm2.shared.json | 35 +++++++++++++++++++++++++++++++++++ test_package/toolchain.json | 5 +++++ 4 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 test_package/qpm2.json create mode 100644 test_package/qpm2.shared.json create mode 100644 test_package/toolchain.json diff --git a/.vscode/launch.json b/.vscode/launch.json index 7e34ec5..1730569 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,14 +6,14 @@ "request": "launch", "name": "Debug executable 'qpm_cli'", "cargo": { - "args": ["build", "--bin=qpm", "--package=qpm_cli"], + "args": ["build", "--bin=qpm2", "--package=qpm_cli"], "filter": { - "name": "qpm", + "name": "qpm2", "kind": "bin" } }, - "args": ["download", "adb"], - "cwd": "${workspaceFolder}" + "args": ["restore","default"], + "cwd": "${workspaceFolder}/test_package" }, { "type": "lldb", @@ -22,7 +22,7 @@ "cargo": { "args": ["test", "--no-run", "--bin=qpm", "--package=qpm_cli"], "filter": { - "name": "qpm", + "name": "qpm2", "kind": "bin" } }, diff --git a/test_package/qpm2.json b/test_package/qpm2.json new file mode 100644 index 0000000..92985b8 --- /dev/null +++ b/test_package/qpm2.json @@ -0,0 +1,25 @@ +{ + "id": "paper", + "version": "2.0.0", + "dependenciesDirectory": "extern", + "sharedDirectory": "shared", + "workspace": { + "scripts": {}, + "qmodIncludeDirs": [], + "qmodIncludeFiles": [] + }, + "additionalData": { + "description": "", + "author": "", + "license": "" + }, + "triplets": { + "default": { + "dependencies": {}, + "devDependencies": {}, + "env": {} + } + }, + "configVersion": "2.0.0", + "toolchainOut": "toolchain.json" +} diff --git a/test_package/qpm2.shared.json b/test_package/qpm2.shared.json new file mode 100644 index 0000000..52f0684 --- /dev/null +++ b/test_package/qpm2.shared.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://raw.githubusercontent.com/QuestPackageManager/QPM.Package/refs/heads/main/qpm.shared.schema.json", + "config": { + "id": "paper", + "version": "2.0.0", + "dependenciesDirectory": "extern", + "sharedDirectory": "shared", + "workspace": { + "scripts": {}, + "qmodIncludeDirs": [], + "qmodIncludeFiles": [] + }, + "additionalData": { + "description": "", + "author": "", + "license": "" + }, + "triplets": { + "default": { + "dependencies": {}, + "devDependencies": {}, + "env": {} + } + }, + "configVersion": "2.0.0", + "toolchainOut": "toolchain.json" + }, + "restoredTriplet": "default", + "lockedTriplet": { + "default": { + "restoredDependencies": {}, + "env": {} + } + } +} \ No newline at end of file diff --git a/test_package/toolchain.json b/test_package/toolchain.json new file mode 100644 index 0000000..f145145 --- /dev/null +++ b/test_package/toolchain.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://raw.githubusercontent.com/QuestPackageManager/QPM.CLI/refs/heads/main/qpm.toolchain.schema.json", + "compile_options": {}, + "extern_dir": "extern" +} \ No newline at end of file From 5fd860e2da7242f5b77372bcdd0874496dce1194 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 30 Jul 2025 13:36:07 -0400 Subject: [PATCH 035/119] Handle optional triplet values --- Cargo.lock | 14 +++++++------- src/commands/restore.rs | 2 +- src/resolver/dependency.rs | 10 ++++++++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4e69334..bdf9fd8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -301,9 +301,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "clap" -version = "4.5.41" +version = "4.5.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" +checksum = "ed87a9d530bb41a67537289bafcac159cb3ee28460e0a4571123d2a778a6a882" dependencies = [ "clap_builder", "clap_derive", @@ -311,9 +311,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.41" +version = "4.5.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" +checksum = "64f4f3f3c77c94aff3c7e9aac9a2ca1974a5adf392a8bb751e827d6d127ab966" dependencies = [ "anstream", "anstyle", @@ -2495,7 +2495,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#9fa5ba5e3eb06f15531c8e5b7c7b7b6d5c68f023" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#b8f8b1c5d2bde7998f128c5f0883e55304e0a899" dependencies = [ "cursed-semver-parser", "schemars", @@ -2755,9 +2755,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.29" +version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ "once_cell", "ring", diff --git a/src/commands/restore.rs b/src/commands/restore.rs index 0a28de4..e8aec9d 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -168,7 +168,7 @@ fn is_modified( let Some(locked_dep) = locked_triplet.restored_dependencies.get(dep_id) else { return true; }; - if dep.triplet != locked_dep.restored_triplet { + if dep.triplet.clone().unwrap_or_default() != locked_dep.restored_triplet { return true; } if !dep.version_range.matches(&locked_dep.restored_version) { diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index f60295d..c50030b 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -111,7 +111,10 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> // add dev dependencies as well .chain(triplet.dev_dependencies.iter()) .map(|(dep_id, dep)| { - let pubgrub_dep = PubgrubDependencyTarget(dep_id.clone(), dep.triplet.clone()); + let pubgrub_dep = PubgrubDependencyTarget( + dep_id.clone(), + dep.triplet.clone().unwrap_or_default(), + ); let range = req_to_range(dep.version_range.clone()); (pubgrub_dep, range) @@ -143,7 +146,10 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> .dependencies .iter() .map(|(dep_id, dep)| { - let id = PubgrubDependencyTarget(dep_id.clone(), dep.triplet.clone()); + let id = PubgrubDependencyTarget( + dep_id.clone(), + dep.triplet.clone().unwrap_or_default(), + ); let range = req_to_range(dep.version_range.clone()); (id, range) }) From 1c2807e0d49b68d1d2d4f4c9f233179f0976385d Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 30 Jul 2025 13:49:23 -0400 Subject: [PATCH 036/119] Update qpm_package source to latest commit on qpm2 branch --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index bdf9fd8..8c15668 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2495,7 +2495,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#b8f8b1c5d2bde7998f128c5f0883e55304e0a899" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#8d43a1a2103499e231e008856042a07ef421e439" dependencies = [ "cursed-semver-parser", "schemars", From 0ceec8b10d99449fdd883e9461e75b1293e2ac6c Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 30 Jul 2025 14:02:34 -0400 Subject: [PATCH 037/119] Add migration deno script --- migrate.ts | 188 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 migrate.ts diff --git a/migrate.ts b/migrate.ts new file mode 100644 index 0000000..974895e --- /dev/null +++ b/migrate.ts @@ -0,0 +1,188 @@ +#!/bin/deno + +interface QPM1 { + version: string; + sharedDir: string; + dependenciesDir: string; + info: { + name?: string; + id: string; + version: string; + + url?: string; + author?: string; + + additionalData?: { + overrideSoName?: string; + cmake?: boolean; + toolchainOut?: string; + modLink?: string; + compileOptions?: { + // Additional include paths to add, relative to the extern directory. + includePaths?: string[]; + + // Additional system include paths to add, relative to the extern directory. + systemIncludes?: string[]; + + // Additional C++ flags to add. + cppFlags?: string[]; + + // Additional C flags to add. + cFlags?: string[]; + }; + }; + }; + workspace: { + scripts: + | { + build?: string[]; + debug?: string[]; + copy?: string[]; + qmod?: string[]; + } + | Record; + qmodIncludeDirs: string[]; + qmodIncludeFiles: string[]; + qmodOutput: string; + }; + dependencies: Array; +} + +type QPM1Dep = { + id: string; + versionRange: string; + additionalData: { + includeQmod?: boolean; + required?: boolean; + private?: boolean; + }; +}; + +type QPM2Triplet = { + dependencies: Record; + devDependencies: Record; + env: Record; + + // Additional compile options for the package + compileOptions?: { + // Additional include paths to add, relative to the extern directory. + includePaths?: string[]; + + // Additional system include paths to add, relative to the extern directory. + systemIncludes?: string[]; + + // Additional C++ flags to add. + cppFlags?: string[]; + + // Additional C flags to add. + cFlags?: string[]; + }; + + // QMod URL for this triplet + qmodUrl?: string; + + // QMod ID for this triplet + qmodId?: string; + + // QMod template path for this triplet (e.g. mod.template.json) + qmodTemplate?: string; + + // Output binaries for this triplet + outBinaries?: string[]; +}; + +interface QPM2 { + id: string; + version: string; + dependenciesDirectory: string; + sharedDirectory: string; + workspace: { + scripts: Record; + qmodIncludeDirs: string[]; + qmodIncludeFiles: string[]; + }; + additionalData?: { + description?: string; + author?: string; + license?: string; + }; + triplets: { + default: QPM2Triplet; + [key: string]: QPM2Triplet; + }; + configVersion: string; + toolchainOut: string; +} + +interface QPM2Dep { + versionRange: string; + triplet?: string | "default" | null; + qmodExport?: boolean; + qmodRequired?: boolean; +} + +function convertDep(dep: QPM1Dep): QPM2Dep { + return { + versionRange: dep.versionRange, + triplet: "default", + qmodExport: dep.additionalData.includeQmod ?? false, + qmodRequired: dep.additionalData.includeQmod ?? false, + }; +} + +const qpm1: QPM1 = JSON.parse(await Deno.readTextFile("./qpm.json")); + +const dependencies = qpm1.dependencies + .filter((x) => !x.additionalData.private) + .reduce((acc, dep) => { + acc[dep.id] = convertDep(dep); + return acc; + }, {} as Record); + +const devDependencies = qpm1.dependencies + .filter((x) => x.additionalData.private) + .reduce((acc, dep) => { + acc[dep.id] = convertDep(dep); + return acc; + }, {} as Record); + +const qpm2: QPM2 = { + id: qpm1.info.id, + version: qpm1.info.version, + dependenciesDirectory: qpm1.dependenciesDir, + sharedDirectory: qpm1.sharedDir, + workspace: { + scripts: { + build: qpm1.workspace.scripts.build, + debug: qpm1.workspace.scripts.debug, + copy: qpm1.workspace.scripts.copy, + qmod: qpm1.workspace.scripts.qmod, + }, + qmodIncludeDirs: qpm1.workspace.qmodIncludeDirs, + qmodIncludeFiles: qpm1.workspace.qmodIncludeFiles, + }, + additionalData: { + description: "", + author: qpm1.info.author, + license: "", + }, + triplets: { + default: { + dependencies: dependencies, + devDependencies: devDependencies, + compileOptions: qpm1.info.additionalData?.compileOptions, + outBinaries: [ + qpm1.info.additionalData?.overrideSoName ?? `${qpm1.info.id}.so`, + ], + qmodId: qpm1.info.id, + qmodTemplate: "mod.template.json", + qmodUrl: qpm1.info.additionalData?.modLink, + + env: {}, + }, + }, + configVersion: "2.0.0", + toolchainOut: qpm1.info.additionalData?.toolchainOut ?? "toolchain.json", +}; + +Deno.writeTextFile("./qpm2.json", JSON.stringify(qpm2, undefined, 2)); From e59015b3f8e0d187b4d5cba46ca7d83b203afd9d Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 30 Jul 2025 14:04:15 -0400 Subject: [PATCH 038/119] Use new registry subdomain --- src/repository/qpackages.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 2a8d2dd..608416d 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -30,7 +30,7 @@ use crate::{ use super::Repository; -const API_URL: &str = "https://qpackages.com"; +const API_URL: &str = "https://2.qpackages.com"; #[derive(Default)] pub struct QPMRepository {} From 71b930459755ab854ebeeefe30fba3cf17d2e6a3 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 30 Jul 2025 14:40:33 -0400 Subject: [PATCH 039/119] Fix qpkg command name --- src/commands/mod.rs | 1 + src/commands/restore.rs | 7 +++++-- src/repository/qpackages.rs | 1 - 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 028b35f..61c1d55 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -85,6 +85,7 @@ pub enum MainCommand { GenSchema(genschema::GenSchemaCommand), /// QPKG control + #[command(name = "qpkg", about = "QPKG control")] QPkg(qpkg::QPkgCommand), /// Triplet commands diff --git a/src/commands/restore.rs b/src/commands/restore.rs index e8aec9d..8f92195 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -113,8 +113,11 @@ impl Command for RestoreCommand { _ => { println!("Resolving packages"); - let (spc_result, mut restored_deps) = - SharedPackageConfig::resolve_from_package(package, Some(triplet_id.clone()), &repo)?; + let (spc_result, mut restored_deps) = SharedPackageConfig::resolve_from_package( + package, + Some(triplet_id.clone()), + &repo, + )?; // update shared_package shared_package_opt = Some(spc_result); diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 608416d..49aa5b2 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -145,7 +145,6 @@ impl QPMRepository { let cursor = std::io::Cursor::new(bytes.get_ref()); - // Ensure checksum matches if let Some(checksum) = &qpackage_config.qpkg_checksum { let result = Sha256::digest(cursor.get_ref()); From e08187250bfe0ce2a8a57f30002bfd845aa99b38 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 30 Jul 2025 14:47:48 -0400 Subject: [PATCH 040/119] Fix output dir --- migrate.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/migrate.ts b/migrate.ts index 974895e..8774fb2 100644 --- a/migrate.ts +++ b/migrate.ts @@ -146,6 +146,10 @@ const devDependencies = qpm1.dependencies return acc; }, {} as Record); +const qpm2Bin = + "./build/" + + (qpm1.info.additionalData?.overrideSoName ?? `${qpm1.info.id}.so`); + const qpm2: QPM2 = { id: qpm1.info.id, version: qpm1.info.version, @@ -171,9 +175,7 @@ const qpm2: QPM2 = { dependencies: dependencies, devDependencies: devDependencies, compileOptions: qpm1.info.additionalData?.compileOptions, - outBinaries: [ - qpm1.info.additionalData?.overrideSoName ?? `${qpm1.info.id}.so`, - ], + outBinaries: [qpm2Bin], qmodId: qpm1.info.id, qmodTemplate: "mod.template.json", qmodUrl: qpm1.info.additionalData?.modLink, From bcbf640cb12f46771d361321287be423d726dc56 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 30 Jul 2025 14:48:02 -0400 Subject: [PATCH 041/119] Fix `qpkg` out --- src/commands/qpkg.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 7b3f002..e73fcb4 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, path::PathBuf}; +use std::{collections::HashMap, path::{Path, PathBuf}}; use clap::Args; use color_eyre::eyre::Context; @@ -18,13 +18,17 @@ use super::Command; pub struct QPkgCommand { #[clap(short, long)] pub bin_dir: Option, + + qpkg_output: Option, } impl Command for QPkgCommand { fn execute(self) -> color_eyre::Result<()> { let package = PackageConfig::read(".")?; - let file = std::fs::File::create(QPKG_JSON)?; + let out = self.qpkg_output.as_deref().unwrap_or(Path::new(&package.id.0)).with_extension("qpkg"); + + let file = std::fs::File::create(out)?; let mut zip = ZipWriter::new(file); let options = FileOptions::<()>::default(); From a0d2b1e10f97e3f7a4c9c33a28d6206860f3bf69 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 30 Jul 2025 15:03:45 -0400 Subject: [PATCH 042/119] Fix version check --- src/models/package.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/models/package.rs b/src/models/package.rs index 675e43b..63b03ad 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -109,10 +109,10 @@ impl PackageConfigExtensions for PackageConfig { fn validate(&self) -> color_eyre::Result<()> { let default = Self::default(); - if self.version.major != default.version.major { + if self.config_version.major != default.config_version.major { eprintln!( "Warning: using outdate qpm schema. Current {} Latest: {:?}", - self.version, default.version + self.config_version, default.config_version ); } From c9c9d30f86d1000129caeb1aa3f11266a3d3be6f Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 30 Jul 2025 15:35:12 -0400 Subject: [PATCH 043/119] Improve error message for missing binaries in QPKG command --- src/commands/qpkg.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index e73fcb4..317b85a 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -56,7 +56,7 @@ impl Command for QPkgCommand { if !binary_built.exists() { panic!( - "Binary {} for triplet {} does not exist", + "Binary {} for triplet {} does not exist. `qpm2 build` must be run first.", binary.display(), triplet_id.triplet_id_color() ); From ab47be70250429a0bdb253052491a2621546301c Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 30 Jul 2025 15:45:29 -0400 Subject: [PATCH 044/119] Refactor BuildCommand to support triplet argument and enhance triplet handling --- src/commands/build.rs | 53 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/src/commands/build.rs b/src/commands/build.rs index 4cc6aa0..e4d4f24 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -5,7 +5,11 @@ use color_eyre::eyre::{Context, ContextCompat}; use itertools::Itertools; use qpm_package::{ extensions::workspace::WorkspaceConfigExtensions, - models::{package::PackageConfig, shared_package::SharedPackageConfig}, + models::{ + package::PackageConfig, + shared_package::{SharedPackageConfig, SharedTriplet}, + triplet::{PackageTriplet, TripletId}, + }, }; use crate::{ @@ -22,6 +26,10 @@ use super::Command; #[derive(Args, Clone, Debug)] pub struct BuildCommand { pub args: Option>, + + #[clap(short, long)] + pub triplet: Option, + #[clap(short, long, default_value = "false")] pub offline: bool, @@ -50,10 +58,12 @@ impl Command for BuildCommand { let mut repo = repository::useful_default_new(self.offline)?; - for (triplet_id, shared_triplet) in &shared_package.locked_triplet { - let triplet = package - .triplets - .get_triplet_settings(triplet_id) + let mut build_triplet = |triplet_id: &TripletId, + triplet: &PackageTriplet| + -> color_eyre::Result<()> { + let shared_triplet = shared_package + .locked_triplet + .get(triplet_id) .context("Failed to get triplet settings")?; println!( @@ -79,11 +89,40 @@ impl Command for BuildCommand { let triplet_dir = out_dir.join(&triplet_id.0); // now copy binaries - copy_bins(&triplet_dir, &triplet.out_binaries.unwrap_or_default())?; + copy_bins( + &triplet_dir, + &triplet.out_binaries.clone().unwrap_or_default(), + )?; // finally qmod if self.qmod { - zip::execute_qmod_zip_operation(Default::default(), &[&triplet_dir])?; + zip::execute_qmod_zip_operation(Default::default(), &[&triplet_dir]) + .context("Making triplet qmod")?; + } + Ok(()) + }; + + match self.triplet { + Some(triplet) => { + println!("Building triplet {}", triplet.triplet_id_color()); + let triplet_id = TripletId(triplet); + let triplet = package + .triplets + .get_triplet(&triplet_id) + .context("Failed to get triplet from package")?; + + build_triplet(&triplet_id, triplet).with_context(|| { + format!("Failed to build triplet {}", triplet_id.triplet_id_color()) + })?; + } + None => { + // build all triplets + for (triplet_id, triplet) in package.triplets.iter_triplets() { + println!("Building triplet {}", triplet_id.triplet_id_color()); + build_triplet(&triplet_id, triplet.as_ref()).with_context(|| { + format!("Failed to build triplet {}", triplet_id.triplet_id_color()) + })?; + } } } From 60c7c5a4b207858a07353b3c37bcd8f63308ad3b Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 30 Jul 2025 16:48:22 -0400 Subject: [PATCH 045/119] Add `-t`/`--triplets` filter for `qpm qpkg` and `qpm build` --- src/commands/build.rs | 30 +++++++++++++++++------------- src/commands/qpkg.rs | 23 +++++++++++++++++++---- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/commands/build.rs b/src/commands/build.rs index e4d4f24..cba613f 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -28,7 +28,7 @@ pub struct BuildCommand { pub args: Option>, #[clap(short, long)] - pub triplet: Option, + pub triplets: Option>, #[clap(short, long, default_value = "false")] pub offline: bool, @@ -102,18 +102,22 @@ impl Command for BuildCommand { Ok(()) }; - match self.triplet { - Some(triplet) => { - println!("Building triplet {}", triplet.triplet_id_color()); - let triplet_id = TripletId(triplet); - let triplet = package - .triplets - .get_triplet(&triplet_id) - .context("Failed to get triplet from package")?; - - build_triplet(&triplet_id, triplet).with_context(|| { - format!("Failed to build triplet {}", triplet_id.triplet_id_color()) - })?; + match self.triplets { + Some(triplets) => { + // build all triplets + for triplet_id in triplets { + println!("Building triplet {}", triplet_id.triplet_id_color()); + + let triplet_id = TripletId(triplet_id); + let triplet = package + .triplets + .get_triplet(&triplet_id) + .context(format!("Failed to get triplet {triplet_id} from package"))?; + + build_triplet(&triplet_id, triplet).with_context(|| { + format!("Failed to build triplet {}", triplet_id.triplet_id_color()) + })?; + } } None => { // build all triplets diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 317b85a..8007ffb 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -1,4 +1,7 @@ -use std::{collections::HashMap, path::{Path, PathBuf}}; +use std::{ + collections::HashMap, + path::{Path, PathBuf}, +}; use clap::Args; use color_eyre::eyre::Context; @@ -19,6 +22,9 @@ pub struct QPkgCommand { #[clap(short, long)] pub bin_dir: Option, + #[clap(short, long)] + pub triplets: Option>, + qpkg_output: Option, } @@ -26,7 +32,11 @@ impl Command for QPkgCommand { fn execute(self) -> color_eyre::Result<()> { let package = PackageConfig::read(".")?; - let out = self.qpkg_output.as_deref().unwrap_or(Path::new(&package.id.0)).with_extension("qpkg"); + let out = self + .qpkg_output + .as_deref() + .unwrap_or(Path::new(&package.id.0)) + .with_extension("qpkg"); let file = std::fs::File::create(out)?; let mut zip = ZipWriter::new(file); @@ -45,6 +55,10 @@ impl Command for QPkgCommand { let triplets: HashMap = package .triplets .iter_triplets() + // Filter triplets based on the provided triplet IDs + .filter(|(triplet_id, _)| { + self.triplets.is_none() || self.triplets.as_ref().unwrap().contains(&triplet_id.0) + }) .filter_map(|(triplet_id, triplet)| { // extern/build/{triplet_id}/ let triplet_dir = build_dir.join(&triplet_id.0); @@ -56,9 +70,10 @@ impl Command for QPkgCommand { if !binary_built.exists() { panic!( - "Binary {} for triplet {} does not exist. `qpm2 build` must be run first.", + "Binary {} for triplet {} does not exist (looking in {}). `qpm2 build` must be run first.", binary.display(), - triplet_id.triplet_id_color() + triplet_id.triplet_id_color(), + binary_built.display() ); } From 2ef608f72afeeb2752f2d5b165cc4b2f0dc52505 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 30 Jul 2025 16:49:14 -0400 Subject: [PATCH 046/119] Remove unused import --- src/commands/build.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/build.rs b/src/commands/build.rs index cba613f..7184a25 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -7,7 +7,7 @@ use qpm_package::{ extensions::workspace::WorkspaceConfigExtensions, models::{ package::PackageConfig, - shared_package::{SharedPackageConfig, SharedTriplet}, + shared_package::SharedPackageConfig, triplet::{PackageTriplet, TripletId}, }, }; From a956e185b0f19ad1de1511f3c9d5c03b16d6f2ad Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 10:57:09 -0400 Subject: [PATCH 047/119] Workspace is nullable --- migrate.ts | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/migrate.ts b/migrate.ts index 8774fb2..c84a98d 100644 --- a/migrate.ts +++ b/migrate.ts @@ -1,7 +1,7 @@ #!/bin/deno interface QPM1 { - version: string; + version?: string; sharedDir: string; dependenciesDir: string; info: { @@ -32,8 +32,8 @@ interface QPM1 { }; }; }; - workspace: { - scripts: + workspace?: { + scripts?: | { build?: string[]; debug?: string[]; @@ -41,9 +41,9 @@ interface QPM1 { qmod?: string[]; } | Record; - qmodIncludeDirs: string[]; - qmodIncludeFiles: string[]; - qmodOutput: string; + qmodIncludeDirs?: string[]; + qmodIncludeFiles?: string[]; + qmodOutput?: string; }; dependencies: Array; } @@ -96,10 +96,10 @@ interface QPM2 { version: string; dependenciesDirectory: string; sharedDirectory: string; - workspace: { - scripts: Record; - qmodIncludeDirs: string[]; - qmodIncludeFiles: string[]; + workspace?: { + scripts?: Record; + qmodIncludeDirs?: string[]; + qmodIncludeFiles?: string[]; }; additionalData?: { description?: string; @@ -157,13 +157,13 @@ const qpm2: QPM2 = { sharedDirectory: qpm1.sharedDir, workspace: { scripts: { - build: qpm1.workspace.scripts.build, - debug: qpm1.workspace.scripts.debug, - copy: qpm1.workspace.scripts.copy, - qmod: qpm1.workspace.scripts.qmod, + build: qpm1.workspace?.scripts?.build, + debug: qpm1.workspace?.scripts?.debug, + copy: qpm1.workspace?.scripts?.copy, + qmod: qpm1.workspace?.scripts?.qmod, }, - qmodIncludeDirs: qpm1.workspace.qmodIncludeDirs, - qmodIncludeFiles: qpm1.workspace.qmodIncludeFiles, + qmodIncludeDirs: qpm1.workspace?.qmodIncludeDirs, + qmodIncludeFiles: qpm1.workspace?.qmodIncludeFiles, }, additionalData: { description: "", From ed09bc68e0e51df87d3f46f6c1516f40faab10d8 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 11:11:16 -0400 Subject: [PATCH 048/119] Make build optional script --- src/commands/build.rs | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/commands/build.rs b/src/commands/build.rs index 7184a25..372c93d 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -38,6 +38,9 @@ pub struct BuildCommand { #[clap(long, default_value = "false")] pub qmod: bool, + + #[clap(long)] + pub build_script: Option, } impl Command for BuildCommand { @@ -49,10 +52,16 @@ impl Command for BuildCommand { .out_dir .unwrap_or_else(|| package.dependencies_directory.join("build")); - let script = package - .workspace - .get_build() - .context("Failed to get build script from workspace")?; + let build_script = match self.build_script { + Some(script) => Some( + package + .workspace + .scripts + .get(&script) + .context(format!("Failed to find build script {script} in package"))?, + ), + None => package.workspace.get_build(), + }; let args = self.args.unwrap_or_default(); @@ -80,11 +89,13 @@ impl Command for BuildCommand { shared_package.write(".")?; // run builld - println!( - "Building QPKG for triplet {}", - triplet_id.triplet_id_color() - ); - scripts::invoke_script(script, &args, &package, triplet_id)?; + if let Some(build_script) = &build_script { + println!( + "Building QPKG for triplet {}", + triplet_id.triplet_id_color() + ); + scripts::invoke_script(build_script, &args, &package, triplet_id)?; + } let triplet_dir = out_dir.join(&triplet_id.0); From acd745bccd59eb95442ac11266eaf6f9cc4a11fc Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 11:15:05 -0400 Subject: [PATCH 049/119] Cleanup extern/libs and extern/includes specifically --- src/repository/local.rs | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/repository/local.rs b/src/repository/local.rs index 1dd2b84..04e48a5 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -409,6 +409,23 @@ impl FileRepository { ..Default::default() }; + let extern_dir = workspace_dir.join(&package.dependencies_directory); + + ensure!(extern_dir != workspace_dir, "Extern dir is workspace dir!"); + + let extern_binaries = Self::libs_dir(&extern_dir); + let extern_headers = Self::headers_path(extern_dir); + + // delete if needed extern/libs and extern/includes + if extern_binaries.exists() { + fs::remove_dir_all(&extern_binaries) + .with_context(|| format!("Unable to delete {extern_binaries:?}"))?; + } + if extern_headers.exists() { + fs::remove_dir_all(&extern_headers) + .with_context(|| format!("Unable to delete {extern_headers:?}"))?; + } + for (src, dest) in files { fs::create_dir_all(dest.parent().unwrap())?; let symlink_result = if symlink { @@ -529,6 +546,14 @@ impl FileRepository { }) } + fn libs_dir(extern_dir: &PathBuf) -> PathBuf { + extern_dir.join("libs") + } + + fn headers_path(extern_dir: PathBuf) -> PathBuf { + extern_dir.join("includes") + } + /// Collects all dependencies of a package from the cache. /// Returns a map of source paths to target paths for the dependencies. pub fn collect_deps( @@ -566,14 +591,8 @@ impl FileRepository { ensure!(extern_dir != workspace_dir, "Extern dir is workspace dir!"); - // delete if needed - if extern_dir.exists() { - fs::remove_dir_all(&extern_dir) - .with_context(|| format!("Unable to delete {extern_dir:?}"))?; - } - - let extern_binaries = extern_dir.join("libs"); - let extern_headers = extern_dir.join("includes"); + let extern_binaries = Self::libs_dir(&extern_dir); + let extern_headers = Self::headers_path(extern_dir); let mut paths = HashMap::::new(); From a139344d08131b5ee86a457054249569bc2daeeb Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 11:18:25 -0400 Subject: [PATCH 050/119] Fix zipping --- src/commands/qpkg.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 8007ffb..60c3e5d 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -1,5 +1,6 @@ use std::{ collections::HashMap, + io::Write, path::{Path, PathBuf}, }; @@ -47,6 +48,18 @@ impl Command for QPkgCommand { zip.add_directory_from_path(&package.shared_directory, options) .context("Failed to add shared directory to QPKG zip")?; + for entry in walkdir::WalkDir::new(&package.shared_directory) + .into_iter() + .filter_map(Result::ok) + .filter(|e| e.file_type().is_file()) + { + let rel_path = entry.path().strip_prefix(&package.shared_directory).unwrap(); + zip.start_file_from_path(rel_path, options) + .context(format!("Failed to add file {:?} to QPKG zip", rel_path))?; + let bytes = std::fs::read(entry.path()).context("Failed to read shared file")?; + zip.write_all(&bytes).context("Failed to write shared file to QPKG zip")?; + } + let build_dir = self .bin_dir .map(PathBuf::from) @@ -77,8 +90,12 @@ impl Command for QPkgCommand { ); } - zip.start_file_from_path(binary_built, options) + zip.start_file_from_path(&binary_built, options) .expect("Failed to start file in QPKG zip"); + + let bytes = std::fs::read(&binary_built).expect("Failed to read binary file"); + zip.write_all(&bytes) + .expect("Failed to write binary file to QPKG zip"); } Some((triplet_id, QPkgTripletInfo { files: binaries })) From 1e54b50acb4aca9c900156d4abbd224d6a025f30 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 11:25:03 -0400 Subject: [PATCH 051/119] Fix QPkg minimum depth --- src/commands/qpkg.rs | 21 ++++++++++++++++----- src/repository/local.rs | 12 ++++++++---- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 60c3e5d..41de402 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -13,7 +13,10 @@ use qpm_package::models::{ }; use zip::{ZipWriter, write::FileOptions}; -use crate::{models::package::PackageConfigExtensions, terminal::colors::QPMColor}; +use crate::{ + models::package::PackageConfigExtensions, repository::local::FileRepository, + terminal::colors::QPMColor, +}; use super::Command; @@ -49,21 +52,29 @@ impl Command for QPkgCommand { .context("Failed to add shared directory to QPKG zip")?; for entry in walkdir::WalkDir::new(&package.shared_directory) + .min_depth(1) .into_iter() .filter_map(Result::ok) .filter(|e| e.file_type().is_file()) { - let rel_path = entry.path().strip_prefix(&package.shared_directory).unwrap(); + // remove the shared directory prefix from the path + let rel_path = entry + .path() + .strip_prefix(&package.shared_directory) + .unwrap(); + zip.start_file_from_path(rel_path, options) - .context(format!("Failed to add file {:?} to QPKG zip", rel_path))?; + .with_context(|| format!("Failed to add file {:?} to QPKG zip", rel_path))?; + let bytes = std::fs::read(entry.path()).context("Failed to read shared file")?; - zip.write_all(&bytes).context("Failed to write shared file to QPKG zip")?; + zip.write_all(&bytes) + .context("Failed to write shared file to QPKG zip")?; } let build_dir = self .bin_dir .map(PathBuf::from) - .unwrap_or_else(|| package.dependencies_directory.join("build")); + .unwrap_or_else(|| FileRepository::build_path(&package.dependencies_directory)); let triplets: HashMap = package .triplets diff --git a/src/repository/local.rs b/src/repository/local.rs index 04e48a5..2d5fe27 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -414,7 +414,7 @@ impl FileRepository { ensure!(extern_dir != workspace_dir, "Extern dir is workspace dir!"); let extern_binaries = Self::libs_dir(&extern_dir); - let extern_headers = Self::headers_path(extern_dir); + let extern_headers = Self::headers_path(&extern_dir); // delete if needed extern/libs and extern/includes if extern_binaries.exists() { @@ -546,14 +546,18 @@ impl FileRepository { }) } - fn libs_dir(extern_dir: &PathBuf) -> PathBuf { + pub fn libs_dir(extern_dir: &Path) -> PathBuf { extern_dir.join("libs") } - fn headers_path(extern_dir: PathBuf) -> PathBuf { + pub fn headers_path(extern_dir: &Path) -> PathBuf { extern_dir.join("includes") } + pub fn build_path(extern_dir: &Path) -> PathBuf { + extern_dir.join("build") + } + /// Collects all dependencies of a package from the cache. /// Returns a map of source paths to target paths for the dependencies. pub fn collect_deps( @@ -592,7 +596,7 @@ impl FileRepository { ensure!(extern_dir != workspace_dir, "Extern dir is workspace dir!"); let extern_binaries = Self::libs_dir(&extern_dir); - let extern_headers = Self::headers_path(extern_dir); + let extern_headers = Self::headers_path(&extern_dir); let mut paths = HashMap::::new(); From d2bd997beac460407a597d063b16ce20b6d1f749 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 11:25:10 -0400 Subject: [PATCH 052/119] Add more fields to toolchain --- src/models/toolchain.rs | 65 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 4 deletions(-) diff --git a/src/models/toolchain.rs b/src/models/toolchain.rs index b87c44e..e1c0ba8 100644 --- a/src/models/toolchain.rs +++ b/src/models/toolchain.rs @@ -1,13 +1,16 @@ -use std::{fs::File, path::PathBuf}; +use std::{collections::HashMap, fs::File, path::PathBuf}; use color_eyre::eyre::Result; use qpm_package::models::{ - extra::PackageTripletCompileOptions, shared_package::SharedPackageConfig, + extra::PackageTripletCompileOptions, package::DependencyId, shared_package::SharedPackageConfig, }; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::{models::package::SharedPackageConfigExtensions, repository::Repository}; +use crate::{ + models::package::SharedPackageConfigExtensions, + repository::{Repository, local::FileRepository}, +}; use super::schemas::{SchemaLinks, WithSchema}; @@ -18,6 +21,14 @@ pub struct ToolchainData { /// Path to the extern directory pub extern_dir: PathBuf, + + pub libs_dir: PathBuf, + pub include_dir: PathBuf, + + pub build_out: PathBuf, + pub triplet_out: PathBuf, + + pub linked_binaries: HashMap>, } pub fn write_toolchain_file( @@ -88,9 +99,55 @@ pub fn write_toolchain_file( } }); + let linked_binaries = + shared_config + .get_restored_triplet() + .restored_dependencies + .iter() + .filter_map(|(dep_id, dep_triplet)| { + let dep_config = repo + .get_package(dep_id, &dep_triplet.restored_version) + .unwrap_or_else(|e| { + panic!( + "Failed to get package config for package '{}' version '{}': {}", + dep_id, dep_triplet.restored_version, e + ) + }) + .unwrap_or_else(|| { + panic!( + "Package config not found for package '{}' version '{}'", + dep_id, dep_triplet.restored_version + ) + }); + let dep_triplet_config = dep_config + .triplets + .get_triplet_settings(&dep_triplet.restored_triplet) + .unwrap_or_else(|| panic!( + "Failed to get triplet settings for package '{}' version '{}' triplet '{}'", + dep_id, dep_triplet.restored_version, dep_triplet.restored_triplet + )); + + let out_binaries = dep_triplet_config.out_binaries.clone()?; + Some((dep_id.clone(), out_binaries)) + }) + .collect(); + + let extern_dir = shared_config.config.dependencies_directory.clone(); + let libs_dir = FileRepository::libs_dir(&extern_dir); + let include_dir = FileRepository::libs_dir(&extern_dir); + let build_out = FileRepository::build_path(&extern_dir); + let triplet_out = build_out.join(&shared_config.restored_triplet.0); + let toolchain = ToolchainData { compile_options, - extern_dir: shared_config.config.dependencies_directory.clone(), + extern_dir, + libs_dir, + include_dir, + + build_out, + triplet_out, + + linked_binaries, }; let file = File::create(toolchain_path)?; serde_json::to_writer_pretty( From 9b904d0f7efbe8de988790af04a1f24d9d1ed467 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 11:27:42 -0400 Subject: [PATCH 053/119] Fix build --- src/commands/qpkg.rs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 41de402..41fce40 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -64,7 +64,7 @@ impl Command for QPkgCommand { .unwrap(); zip.start_file_from_path(rel_path, options) - .with_context(|| format!("Failed to add file {:?} to QPKG zip", rel_path))?; + .with_context(|| format!("Failed to add file {} to QPKG zip", rel_path.display().file_path_color()))?; let bytes = std::fs::read(entry.path()).context("Failed to read shared file")?; zip.write_all(&bytes) @@ -88,23 +88,27 @@ impl Command for QPkgCommand { let triplet_dir = build_dir.join(&triplet_id.0); let binaries = triplet.out_binaries.clone()?; - for binary in &binaries { + for binary_rel_path in &binaries { // extern/build/{triplet_id}/{binary} - let binary_built = triplet_dir.join(binary); + let binary_src = triplet_dir.join(binary_rel_path); - if !binary_built.exists() { + let zip_path = binary_src + .strip_prefix(&build_dir) + .unwrap(); + + if !binary_src.exists() { panic!( "Binary {} for triplet {} does not exist (looking in {}). `qpm2 build` must be run first.", - binary.display(), + binary_rel_path.display().file_path_color(), triplet_id.triplet_id_color(), - binary_built.display() + binary_src.display().file_path_color() ); } - zip.start_file_from_path(&binary_built, options) + zip.start_file_from_path(zip_path, options) .expect("Failed to start file in QPKG zip"); - let bytes = std::fs::read(&binary_built).expect("Failed to read binary file"); + let bytes = std::fs::read(&binary_src).expect("Failed to read binary file"); zip.write_all(&bytes) .expect("Failed to write binary file to QPKG zip"); } From bbed529d75548bdeeafb00140bd0becbb3d2247c Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 11:54:09 -0400 Subject: [PATCH 054/119] Use tmp for zip --- src/commands/qpkg.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 41fce40..90b60ef 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -1,6 +1,6 @@ use std::{ collections::HashMap, - io::Write, + io::{BufWriter, Write}, path::{Path, PathBuf}, }; @@ -42,8 +42,11 @@ impl Command for QPkgCommand { .unwrap_or(Path::new(&package.id.0)) .with_extension("qpkg"); - let file = std::fs::File::create(out)?; - let mut zip = ZipWriter::new(file); + let tmp_out = package.dependencies_directory.join("tmp").join(&out); + + let file = std::fs::File::create(&tmp_out)?; + let buf_file = BufWriter::new(file); + let mut zip = ZipWriter::new(buf_file); let options = FileOptions::<()>::default(); @@ -64,7 +67,12 @@ impl Command for QPkgCommand { .unwrap(); zip.start_file_from_path(rel_path, options) - .with_context(|| format!("Failed to add file {} to QPKG zip", rel_path.display().file_path_color()))?; + .with_context(|| { + format!( + "Failed to add file {} to QPKG zip", + rel_path.display().file_path_color() + ) + })?; let bytes = std::fs::read(entry.path()).context("Failed to read shared file")?; zip.write_all(&bytes) @@ -128,7 +136,14 @@ impl Command for QPkgCommand { serde_json::to_writer(&mut zip, &qpkg).context("Failed to write QPKG JSON to zip")?; zip.finish()?; - println!("Executing QPKG command..."); + // move the temporary file to the final output location + std::fs::rename(tmp_out, &out).with_context(|| { + format!( + "Failed to move temporary QPKG file to final output: {}", + out.display().file_path_color() + ) + })?; + Ok(()) } } From 0d992e5780cbe4b24a8771beed72a139a074ea4a Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 12:05:02 -0400 Subject: [PATCH 055/119] Refactor temporary directory creation in QPkgCommand --- src/commands/qpkg.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 90b60ef..c0e4c73 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -1,7 +1,5 @@ use std::{ - collections::HashMap, - io::{BufWriter, Write}, - path::{Path, PathBuf}, + collections::HashMap, fs, io::{BufWriter, Write}, path::{Path, PathBuf} }; use clap::Args; @@ -42,7 +40,12 @@ impl Command for QPkgCommand { .unwrap_or(Path::new(&package.id.0)) .with_extension("qpkg"); - let tmp_out = package.dependencies_directory.join("tmp").join(&out); + let tmp = package.dependencies_directory.join("tmp"); + + fs::create_dir_all(&tmp) + .with_context(|| format!("Failed to create temporary directory: {}", tmp.display().file_path_color()))?; + + let tmp_out = tmp.join(&out); let file = std::fs::File::create(&tmp_out)?; let buf_file = BufWriter::new(file); From 5eff0715ff9dbe14e84b84c083f0c270979750e5 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 12:13:47 -0400 Subject: [PATCH 056/119] Add log --- src/commands/qpkg.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index c0e4c73..87c7796 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -68,6 +68,7 @@ impl Command for QPkgCommand { .path() .strip_prefix(&package.shared_directory) .unwrap(); + println!("Adding shared file: {}", rel_path.display().file_path_color()); zip.start_file_from_path(rel_path, options) .with_context(|| { From 4dccf543c888719fb3d9848febfa0d338713aa93 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 12:20:54 -0400 Subject: [PATCH 057/119] Fix rel path in QPKG --- src/commands/qpkg.rs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 87c7796..5f4b9bb 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -1,5 +1,8 @@ use std::{ - collections::HashMap, fs, io::{BufWriter, Write}, path::{Path, PathBuf} + collections::HashMap, + fs, + io::{BufWriter, Write}, + path::{Path, PathBuf}, }; use clap::Args; @@ -42,9 +45,13 @@ impl Command for QPkgCommand { let tmp = package.dependencies_directory.join("tmp"); - fs::create_dir_all(&tmp) - .with_context(|| format!("Failed to create temporary directory: {}", tmp.display().file_path_color()))?; - + fs::create_dir_all(&tmp).with_context(|| { + format!( + "Failed to create temporary directory: {}", + tmp.display().file_path_color() + ) + })?; + let tmp_out = tmp.join(&out); let file = std::fs::File::create(&tmp_out)?; @@ -63,12 +70,15 @@ impl Command for QPkgCommand { .filter_map(Result::ok) .filter(|e| e.file_type().is_file()) { - // remove the shared directory prefix from the path + // remove the project prefix from the path let rel_path = entry .path() - .strip_prefix(&package.shared_directory) + .strip_prefix(package.shared_directory.parent().unwrap_or(Path::new(""))) .unwrap(); - println!("Adding shared file: {}", rel_path.display().file_path_color()); + println!( + "Adding shared file: {}", + rel_path.display().file_path_color() + ); zip.start_file_from_path(rel_path, options) .with_context(|| { From 5961f70ce3284076b6d9a1ccebfc4f5d61cf2ae0 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 12:55:17 -0400 Subject: [PATCH 058/119] Verbose flag --- src/commands/qpkg.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 5f4b9bb..9275e51 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -30,6 +30,9 @@ pub struct QPkgCommand { #[clap(short, long)] pub triplets: Option>, + #[clap(short, long, default_value = "false")] + pub verbose: bool, + qpkg_output: Option, } @@ -75,10 +78,12 @@ impl Command for QPkgCommand { .path() .strip_prefix(package.shared_directory.parent().unwrap_or(Path::new(""))) .unwrap(); - println!( - "Adding shared file: {}", - rel_path.display().file_path_color() - ); + if self.verbose { + println!( + "Adding shared file: {}", + rel_path.display().file_path_color() + ); + } zip.start_file_from_path(rel_path, options) .with_context(|| { From 46d22b4954886c057af0e8a86b38f3de7c75f6c9 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 12:58:01 -0400 Subject: [PATCH 059/119] Move instead of copy --- src/repository/local.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/repository/local.rs b/src/repository/local.rs index 2d5fe27..67c5cea 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -294,7 +294,7 @@ impl FileRepository { zip_archive.extract(&tmp_path).context("Zip extraction")?; // copy QPKG.qpm.json to {cache}/{id}/{version}/src/qpm2.qpkg.json - fs::copy(tmp_path.join(QPKG_JSON), &qpkg_file_dst).with_context(|| { + fs::rename(tmp_path.join(QPKG_JSON), &qpkg_file_dst).with_context(|| { format!( "Failed to copy QPkg file from {} to {}", tmp_path.display().file_path_color(), @@ -303,7 +303,7 @@ impl FileRepository { })?; // copy headers to src folder - fs::copy(tmp_path.join(&qpkg.shared_dir), &headers_dst).with_context(|| { + fs::rename(tmp_path.join(&qpkg.shared_dir), &headers_dst).with_context(|| { format!( "Failed to copy headers from {} to {}", tmp_path.display().file_path_color(), @@ -326,7 +326,7 @@ impl FileRepository { let src_file = tmp_path.join(file); let dst_file = bin_dir.join(file.file_name().unwrap()); // copy as {cache}/{id}/{version}/{triplet}/lib/{file_name} - fs::copy(&src_file, &dst_file).with_context(|| { + fs::rename(&src_file, &dst_file).with_context(|| { format!( "Failed to copy file from {} to {}", src_file.display().file_path_color(), From 0bc1fec644a0dec4027f018f5dd55e4e836545ec Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 13:16:18 -0400 Subject: [PATCH 060/119] Refactor binary handling in QPkgCommand to use a mapping for source and destination paths --- src/commands/qpkg.rs | 51 +++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 9275e51..26a0fa0 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -115,32 +115,43 @@ impl Command for QPkgCommand { let triplet_dir = build_dir.join(&triplet_id.0); let binaries = triplet.out_binaries.clone()?; - for binary_rel_path in &binaries { - // extern/build/{triplet_id}/{binary} - let binary_src = triplet_dir.join(binary_rel_path); - - let zip_path = binary_src - .strip_prefix(&build_dir) - .unwrap(); - - if !binary_src.exists() { - panic!( - "Binary {} for triplet {} does not exist (looking in {}). `qpm2 build` must be run first.", - binary_rel_path.display().file_path_color(), - triplet_id.triplet_id_color(), - binary_src.display().file_path_color() - ); - } - - zip.start_file_from_path(zip_path, options) + + // src -> dst zip + let binaries_map: HashMap = binaries + .iter() + .map(|binary| { + // extern/build/{triplet_id}/{binary} + let binary_path = triplet_dir.join(binary); + + let zip_path = binary_path + .strip_prefix(&build_dir) + .unwrap() + .to_path_buf(); + + let zip_path = Path::new("bin").join(&zip_path); + + if !binary_path.exists() { + panic!( + "Binary {} for triplet {} does not exist (looking in {}). `qpm2 build` must be run first.", + binary.display().file_path_color(), + triplet_id.triplet_id_color(), + binary_path.display().file_path_color() + ); + } + (binary_path, zip_path) + }) + .collect(); + + for (src, dst) in &binaries_map { + zip.start_file_from_path(dst, options) .expect("Failed to start file in QPKG zip"); - let bytes = std::fs::read(&binary_src).expect("Failed to read binary file"); + let bytes = std::fs::read(src).expect("Failed to read binary file"); zip.write_all(&bytes) .expect("Failed to write binary file to QPKG zip"); } - Some((triplet_id, QPkgTripletInfo { files: binaries })) + Some((triplet_id, QPkgTripletInfo { files: binaries_map.into_values().collect() })) }) .collect(); From 516c792975347c6a1ad87f34d7810a0c9afe517e Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 15:34:20 -0400 Subject: [PATCH 061/119] Fix binary name references to `qpm2` --- src/commands/clear.rs | 7 ++----- src/commands/doctor.rs | 10 +++++----- src/commands/qmod/mod.rs | 4 ++-- src/commands/restore.rs | 2 +- src/main.rs | 2 +- src/models/config.rs | 4 ++-- src/models/package.rs | 2 +- src/tests/framework/common.rs | 4 ++-- 8 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/commands/clear.rs b/src/commands/clear.rs index 635e058..d82484d 100644 --- a/src/commands/clear.rs +++ b/src/commands/clear.rs @@ -3,7 +3,7 @@ use std::{fs, path::Path}; use clap::Args; use color_eyre::Result; use owo_colors::OwoColorize; -use qpm_package::models::package::PackageConfig; +use qpm_package::models::{package::PackageConfig, shared_package::QPM_SHARED_JSON}; use walkdir::WalkDir; use crate::models::package::PackageConfigExtensions; @@ -16,10 +16,7 @@ pub struct ClearCommand {} impl Command for ClearCommand { fn execute(self) -> color_eyre::Result<()> { remove_dependencies_dir()?; - remove("qpm.shared.json")?; - remove("extern.cmake")?; - remove("qpm_defines.cmake")?; - remove("mod.json")?; + remove(QPM_SHARED_JSON)?; Ok(()) } } diff --git a/src/commands/doctor.rs b/src/commands/doctor.rs index 2eca176..bbad87e 100644 --- a/src/commands/doctor.rs +++ b/src/commands/doctor.rs @@ -42,7 +42,7 @@ impl Command for DoctorCommand { let ninja = look_path("ninja")?; let adb = look_path("adb")?; - let qpm = look_path("qpm")?; + let qpm = look_path("qpm2")?; if !cmake { eprintln!( @@ -55,22 +55,22 @@ impl Command for DoctorCommand { if !ninja { eprintln!( "Ninja is not installed in path! Use {} to download ninja", - "qpm download ninja".yellow() + "qpm2 download ninja".yellow() ) } else { println!("Ninja found!"); } if !qpm { - eprintln!("Qpm not found in path!") + eprintln!("qpm2 not found in path!") } else { - println!("Qpm found!"); + println!("qpm2 found!"); } if !adb { eprintln!( "ADB not installed in path. Use {} to download ADB", - "qpm download adb".yellow() + "qpm2 download adb".yellow() ) } else { println!("ADB found!"); diff --git a/src/commands/qmod/mod.rs b/src/commands/qmod/mod.rs index 97a9270..578a2a4 100644 --- a/src/commands/qmod/mod.rs +++ b/src/commands/qmod/mod.rs @@ -41,8 +41,8 @@ impl Command for QmodCommand { QmodOperation::Build(b) => { println!( "{} is deprecated, switch to {}", - "qpm qmod build".yellow(), - "qpm qmod manifest".green() + "qpm2 qmod build".yellow(), + "qpm2 qmod manifest".green() ); manifest::execute_qmod_manifest_operation(b) } diff --git a/src/commands/restore.rs b/src/commands/restore.rs index 8f92195..beabbcb 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -216,7 +216,7 @@ pub fn validate_ndk(package: &PackageConfig) -> Result<()> { if !ndk_req.matches(&ndk_version) { return Err( eyre!("NDK Version {ndk_version} does not satisfy {ndk_req}") - .suggestion("qpm ndk resolve".to_string()), + .suggestion("qpm2 ndk resolve".to_string()), ); } diff --git a/src/main.rs b/src/main.rs index 6897555..2a4a3e7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -41,7 +41,7 @@ fn print_completions(generator: G, cmd: &mut clap::Command) { fn suggest_completion_location(shell: Shell) { eprintln!("To add this to your shell, you may use the following command:"); - let file_name = shell.file_name("qpm"); + let file_name = shell.file_name("qpm2"); // powershell is unique so // we make it its own suggestion diff --git a/src/models/config.rs b/src/models/config.rs index beb04a4..123a353 100644 --- a/src/models/config.rs +++ b/src/models/config.rs @@ -148,9 +148,9 @@ impl Default for UserConfig { fn default() -> Self { Self { symlink: Some(true), - cache: Some(dirs::data_dir().unwrap().join("QPM-RS").join("cache")), + cache: Some(dirs::data_dir().unwrap().join("QPM-RS2").join("cache")), timeout: Some(60000), - ndk_download_path: Some(dirs::data_dir().unwrap().join("QPM-RS").join("ndk")), + ndk_download_path: Some(dirs::data_dir().unwrap().join("QPM-RS2").join("ndk")), } } } diff --git a/src/models/package.rs b/src/models/package.rs index 63b03ad..46b8c42 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -124,7 +124,7 @@ impl PackageConfigExtensions for SharedPackageConfig { let path = dir.as_ref().join(QPM_SHARED_JSON); let file = File::open(&path) .with_context(|| format!("{path:?} not found")) - .suggestion(format!("Try running {}", "qpm restore".blue()))?; + .suggestion(format!("Try running {}", "qpm2 restore".blue()))?; json::json_from_reader_fast(BufReader::new(file)) .with_context(|| format!("Unable to read SharedPackageConfig at {path:?}")) diff --git a/src/tests/framework/common.rs b/src/tests/framework/common.rs index 3f53dc3..712b183 100644 --- a/src/tests/framework/common.rs +++ b/src/tests/framework/common.rs @@ -29,7 +29,7 @@ pub fn test_command( .wrap_err_with(|| format!("Failed to copy from {:?} to {:?}", input_dir, temp.path()))?; // Run the command using assert_cmd - Command::cargo_bin("qpm") + Command::cargo_bin("qpm2") .wrap_err("Failed to find qpm binary")? .args(args) .current_dir(temp.path()) @@ -83,7 +83,7 @@ pub fn test_command_check_files( .wrap_err_with(|| format!("Failed to copy from {:?} to {:?}", input_dir, temp.path()))?; // Run the command - Command::cargo_bin("qpm") + Command::cargo_bin("qpm2") .wrap_err("Failed to find qpm binary")? .args(args) .current_dir(temp.path()) From 3b0b5eff8dcbe67fe41c16f7c985531c3ea441d0 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 15:34:31 -0400 Subject: [PATCH 062/119] Add build command --- src/commands/mod.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 61c1d55..53e33ef 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -88,6 +88,8 @@ pub enum MainCommand { #[command(name = "qpkg", about = "QPKG control")] QPkg(qpkg::QPkgCommand), + Build(build::BuildCommand), + /// Triplet commands Triplet(build::BuildCommand), } @@ -113,12 +115,11 @@ impl Command for MainCommand { MainCommand::Scripts(s) => s.execute(), MainCommand::Version(v) => v.execute(), MainCommand::GenSchema(g) => g.execute(), - MainCommand::QPkg(q) => q.execute(), MainCommand::Triplet(t) => t.execute(), - #[cfg(feature = "templatr")] MainCommand::Templatr(c) => c.execute(), + MainCommand::Build(build_command) => build_command.execute(), } } } From 97d44c610eaeea96ec873e7114f2992fbb57e8a4 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 15:34:48 -0400 Subject: [PATCH 063/119] Fix build command --- src/commands/build.rs | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/commands/build.rs b/src/commands/build.rs index 372c93d..8aceab7 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -33,7 +33,7 @@ pub struct BuildCommand { #[clap(short, long, default_value = "false")] pub offline: bool, - #[clap(short, long, default_value = "false")] + #[clap(short, long)] pub out_dir: Option, #[clap(long, default_value = "false")] @@ -75,18 +75,22 @@ impl Command for BuildCommand { .get(triplet_id) .context("Failed to get triplet settings")?; - println!( - "Restoring dependencies for triplet {}", - triplet_id.triplet_id_color() - ); - // restore for triplet - let resolved_deps = - dependency::locked_resolve(&shared_package, &repo, shared_triplet)?.collect_vec(); + if shared_package.restored_triplet != *triplet_id { + println!( + "Restoring dependencies for triplet {}", + triplet_id.triplet_id_color() + ); + + // restore for triplet + let resolved_deps = + dependency::locked_resolve(&shared_package, &repo, shared_triplet)? + .collect_vec(); - // now restore - dependency::restore(".", &shared_package, triplet_id, &resolved_deps, &mut repo)?; - shared_package.restored_triplet = triplet_id.clone(); - shared_package.write(".")?; + // now restore + dependency::restore(".", &shared_package, triplet_id, &resolved_deps, &mut repo)?; + shared_package.restored_triplet = triplet_id.clone(); + shared_package.write(".")?; + } // run builld if let Some(build_script) = &build_script { @@ -147,8 +151,14 @@ impl Command for BuildCommand { fn copy_bins(triplet_dir: &Path, out_binaries: &[PathBuf]) -> color_eyre::Result<()> { for binary in out_binaries { + println!( + "Copying binary {} to triplet directory {}", + binary.display().file_path_color(), + triplet_dir.display().file_path_color() + ); + // create the output directory if it doesn't exist - let out_path = triplet_dir.join(binary); + let out_path = triplet_dir.join(binary.file_name().unwrap_or_default()); std::fs::create_dir_all(out_path.parent().unwrap()).with_context(|| { format!( From ca5091e53bef4bddee512d103c49e840c2bb44f2 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 15:34:59 -0400 Subject: [PATCH 064/119] Refactor command argument definitions to use short flags for `qpkg_path` and `qpkg_url`; update binary path handling in QPkgCommand and FileRepository to improve clarity and maintainability. --- src/commands/install.rs | 4 +- src/commands/qpkg.rs | 15 ++++--- src/repository/local.rs | 82 +++++++++++++++++++++---------------- src/repository/qpackages.rs | 22 +++++++--- 4 files changed, 71 insertions(+), 52 deletions(-) diff --git a/src/commands/install.rs b/src/commands/install.rs index 5eadf9b..4f1d4c6 100644 --- a/src/commands/install.rs +++ b/src/commands/install.rs @@ -22,11 +22,11 @@ pub struct InstallCommand { offline: bool, /// Path to the qpkg file to install - #[clap(long = "path")] + #[clap(short, long = "path")] qpkg_path: Option, /// URL of the qpkg to install - #[clap(long = "url")] + #[clap(short, long = "url")] qpkg_url: Option, #[clap(long, default_value = "false")] diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 26a0fa0..84f3785 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -121,14 +121,12 @@ impl Command for QPkgCommand { .iter() .map(|binary| { // extern/build/{triplet_id}/{binary} - let binary_path = triplet_dir.join(binary); + let binary_name = binary.file_name().unwrap_or_default(); + let binary_path = triplet_dir.join(binary_name); - let zip_path = binary_path - .strip_prefix(&build_dir) - .unwrap() - .to_path_buf(); - - let zip_path = Path::new("bin").join(&zip_path); + let zip_path = Path::new("bin") + .join(&triplet_id.0) + .join(binary_name); if !binary_path.exists() { panic!( @@ -163,7 +161,8 @@ impl Command for QPkgCommand { zip.start_file(QPKG_JSON, options) .context("Failed to start file in QPKG zip")?; - serde_json::to_writer(&mut zip, &qpkg).context("Failed to write QPKG JSON to zip")?; + serde_json::to_writer_pretty(&mut zip, &qpkg) + .context("Failed to write QPKG JSON to zip")?; zip.finish()?; // move the temporary file to the final output location diff --git a/src/repository/local.rs b/src/repository/local.rs index 67c5cea..47035ea 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -5,8 +5,9 @@ use color_eyre::{ use itertools::Itertools; use owo_colors::OwoColorize; use qpm_package::models::{ - package::{DependencyId, PackageConfig}, + package::{DependencyId, PackageConfig, QPM_JSON}, qpkg::{QPKG_JSON, QPkg}, + shared_package::QPM_SHARED_JSON, triplet::TripletId, }; use schemars::JsonSchema; @@ -158,12 +159,12 @@ impl FileRepository { &cache_path.src_path().join(&package.shared_directory), )?; copy_things( - &project_folder.join("qpm.json"), - &cache_path.src_path().join("qpm.json"), + &project_folder.join(QPM_JSON), + &cache_path.src_path().join(QPM_JSON), )?; copy_things( - &project_folder.join("qpm.shared.json"), - &cache_path.src_path().join("qpm.shared.json"), + &project_folder.join(QPM_SHARED_JSON), + &cache_path.src_path().join(QPM_SHARED_JSON), )?; // if the tmp path exists, but src doesn't, that's a failed cache, delete it and try again! @@ -238,17 +239,6 @@ impl FileRepository { where T: Read + Seek, { - if QPkg::exists(".") { - match overwrite_existing { - false => { - bail!("QPKG already exists in the current directory"); - } - true => { - println!("Overwriting existing QPKG in the current directory"); - } - } - } - // Extract to tmp folder let mut zip_archive = ZipArchive::new(buffer).context("Reading zip")?; @@ -263,24 +253,41 @@ impl FileRepository { let package_path: crate::models::package_files::PackageVersionPath = PackageIdPath::new(qpkg.config.id.clone()).version(qpkg.config.version.clone()); - let src_path = package_path.src_path(); let tmp_path = package_path.tmp_path(); let qpkg_file_dst = package_path.qpkg_json_path(); - let headers_dst = package_path.src_path(); + let base_path = package_path.base_path(); - // ensure the src path exists - if !headers_dst.exists() { - // src did not exist, this means that we need to download the repo/zip file from packageconfig.url - fs::create_dir_all(&src_path) - .with_context(|| format!("Failed to create lib path {headers_dst:?}"))?; + if QPkg::exists(&base_path) { + match overwrite_existing { + false => { + bail!( + "QPKG already exists {}", + base_path.display().file_path_color() + ); + } + true => { + println!( + "Overwriting existing QPKG {}", + base_path.display().file_path_color() + ); + } + } } - // if the tmp path exists, but src doesn't, that's a failed cache, delete it and try again! - if tmp_path.exists() { - fs::remove_dir_all(&tmp_path) - .with_context(|| format!("Failed to remove existing tmp folder {tmp_path:?}"))?; - } + // copy QPKG.qpm.json to {cache}/{id}/{version}/src/qpm2.qpkg.json + fs::remove_dir_all(&base_path).with_context(|| { + format!( + "Failed to remove existing QPkg at {}", + package_path.base_path().display().file_path_color() + ) + })?; + fs::create_dir_all(&base_path).with_context(|| { + format!( + "Failed to create package path{}", + package_path.base_path().display().file_path_color() + ) + })?; // make tmp_path fs::create_dir_all(&tmp_path).with_context(|| { @@ -290,10 +297,13 @@ impl FileRepository { ) })?; + // src did not exist, this means that we need to download the repo/zip file from packageconfig.url + fs::create_dir_all(&headers_dst) + .with_context(|| format!("Failed to create lib path {headers_dst:?}"))?; + // now extract the zip to the tmp path zip_archive.extract(&tmp_path).context("Zip extraction")?; - // copy QPKG.qpm.json to {cache}/{id}/{version}/src/qpm2.qpkg.json fs::rename(tmp_path.join(QPKG_JSON), &qpkg_file_dst).with_context(|| { format!( "Failed to copy QPkg file from {} to {}", @@ -363,18 +373,18 @@ impl FileRepository { } // now write the package config to the src path - qpkg.config.write(&src_path).with_context(|| { + qpkg.config.write(&base_path).with_context(|| { format!( "Failed to write package config to {}", - src_path.display().file_path_color() + headers_dst.display().file_path_color() ) })?; // write the qpkg file to the src path - qpkg.write(&src_path).with_context(|| { + qpkg.write(&base_path).with_context(|| { format!( "Failed to write QPkg file to {}", - src_path.display().file_path_color() + headers_dst.display().file_path_color() ) })?; @@ -443,13 +453,13 @@ impl FileRepository { eprintln!( "Failed to create symlink: {}\nfalling back to copy, did the link already exist, or did you not enable windows dev mode?\nTo disable this warning (and default to copy), use the command {}", e.bright_red(), - "qpm config symlink disable".bright_yellow() + "qpm2 config symlink disable".bright_yellow() ); #[cfg(not(windows))] eprintln!( "Failed to create symlink: {}\nfalling back to copy, did the link already exist?\nTo disable this warning (and default to copy), use the command {}", e.bright_red(), - "qpm config symlink disable".bright_yellow() + "qpm2 config symlink disable".bright_yellow() ); } @@ -459,7 +469,7 @@ impl FileRepository { bail!( "The file or folder\n\t'{}'\ndid not exist! what happened to the cache? you should probably run {} to make sure everything is in order...", src.display().bright_yellow(), - "qpm cache clear".bright_yellow() + "qpm2 cache clear".bright_yellow() ); } else if src.is_dir() { std::fs::create_dir_all(&dest) diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 49aa5b2..8522959 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -129,9 +129,19 @@ impl QPMRepository { ); let package_path = PackageIdPath::new(config.id.clone()).version(config.version.clone()); - let src_path = package_path.src_path(); - - if QPackagesPackage::read(&src_path).is_ok() { + let base_path = package_path.base_path(); + + let qpackages_cached = QPackagesPackage::read(&base_path); + if let Ok(qpackages_cached) = qpackages_cached { + if qpackages_cached != *qpackage_config { + eprintln!( + "Cached QPackages {}:{} does not match the requested {}:{}", + qpackages_cached.config.id.dependency_id_color(), + qpackages_cached.config.version.version_id_color(), + config.id.dependency_id_color(), + config.version.version_id_color() + ); + } // already cached, no need to download again return Ok(()); } @@ -167,7 +177,7 @@ impl QPMRepository { ) })?; - let package = PackageConfig::read(&src_path)?; + let package = PackageConfig::read(&base_path)?; // assert that the package is the same as the one we downloaded if package != qpackage_config.config { bail!( @@ -179,10 +189,10 @@ impl QPMRepository { ); } - qpackage_config.write(&src_path).with_context(|| { + qpackage_config.write(&base_path).with_context(|| { format!( "Failed to write QPackages.json to {}", - src_path.display().file_path_color() + base_path.display().file_path_color() ) })?; From f0acb56651332c981708961e273ca4ac423ddafb Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 15:41:40 -0400 Subject: [PATCH 065/119] Enhance command argument definitions in BuildCommand, InstallCommand, and QPkgCommand; add new options for output directory, build script, and validation skipping to improve functionality and user experience. --- src/commands/build.rs | 9 +++++++-- src/commands/install.rs | 2 ++ src/commands/qpkg.rs | 45 ++++++++++++++++++++++++++++++++--------- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/commands/build.rs b/src/commands/build.rs index 8aceab7..398262a 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -15,7 +15,7 @@ use qpm_package::{ use crate::{ commands::{qmod::zip, scripts}, models::package::PackageConfigExtensions, - repository, + repository::{self, local::FileRepository}, resolver::dependency, terminal::colors::QPMColor, }; @@ -30,15 +30,20 @@ pub struct BuildCommand { #[clap(short, long)] pub triplets: Option>, + /// Offline mode repository access #[clap(short, long, default_value = "false")] pub offline: bool, + /// Where to output the triplets #[clap(short, long)] pub out_dir: Option, + /// Whether to zip each triplet as a qmod + /// This does not set the QMOD url #[clap(long, default_value = "false")] pub qmod: bool, + /// The build script to run for each triplet #[clap(long)] pub build_script: Option, } @@ -50,7 +55,7 @@ impl Command for BuildCommand { let out_dir = self .out_dir - .unwrap_or_else(|| package.dependencies_directory.join("build")); + .unwrap_or_else(|| FileRepository::build_path(&package.dependencies_directory)); let build_script = match self.build_script { Some(script) => Some( diff --git a/src/commands/install.rs b/src/commands/install.rs index 4f1d4c6..567fe85 100644 --- a/src/commands/install.rs +++ b/src/commands/install.rs @@ -18,6 +18,7 @@ use super::Command; #[derive(Args, Debug, Clone)] pub struct InstallCommand { + /// Offline mode repository access #[clap(long, default_value = "false")] offline: bool, @@ -29,6 +30,7 @@ pub struct InstallCommand { #[clap(short, long = "url")] qpkg_url: Option, + /// Whether to skip validation of the binaries #[clap(long, default_value = "false")] pub no_validate: bool, diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 84f3785..2fe4809 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -15,8 +15,8 @@ use qpm_package::models::{ use zip::{ZipWriter, write::FileOptions}; use crate::{ - models::package::PackageConfigExtensions, repository::local::FileRepository, - terminal::colors::QPMColor, + commands::build::BuildCommand, models::package::PackageConfigExtensions, + repository::local::FileRepository, terminal::colors::QPMColor, }; use super::Command; @@ -24,22 +24,52 @@ use super::Command; /// Templatr rust rewrite (implementation not based on the old one) #[derive(Args, Clone, Debug)] pub struct QPkgCommand { - #[clap(short, long)] - pub bin_dir: Option, + /// Directory storing the binaries for each triplet as {triplet}/{binary_name} + #[clap(short, long = "input-bins")] + pub input_bin_dir: Option, + + /// If to build the QPKG before creating the QPKG file + #[clap(short, long, default_value = "false")] + pub build: bool, + + /// Offline mode repository access + #[clap(long, default_value = "false")] + pub offline: bool, + /// Triplets to QPKG. Forwarded to build #[clap(short, long)] pub triplets: Option>, + /// Verbose output #[clap(short, long, default_value = "false")] pub verbose: bool, - qpkg_output: Option, + /// Where to output the QPKG file + pub qpkg_output: Option, } impl Command for QPkgCommand { fn execute(self) -> color_eyre::Result<()> { let package = PackageConfig::read(".")?; + let build_dir = self + .input_bin_dir + .map(PathBuf::from) + .unwrap_or_else(|| FileRepository::build_path(&package.dependencies_directory)); + + if self.build { + let command = BuildCommand { + args: None, + triplets: self.triplets.clone(), + offline: self.offline, + out_dir: Some(build_dir.clone()), + qmod: false, + build_script: None, + }; + + command.execute().context("Failed to build qpkg")?; + } + let out = self .qpkg_output .as_deref() @@ -98,11 +128,6 @@ impl Command for QPkgCommand { .context("Failed to write shared file to QPKG zip")?; } - let build_dir = self - .bin_dir - .map(PathBuf::from) - .unwrap_or_else(|| FileRepository::build_path(&package.dependencies_directory)); - let triplets: HashMap = package .triplets .iter_triplets() From 2d294de4da182ecf925dc1949d4f591903b4d177 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 15:45:08 -0400 Subject: [PATCH 066/119] Add finish log --- src/commands/qpkg.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 2fe4809..77e97c0 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -198,6 +198,11 @@ impl Command for QPkgCommand { ) })?; + println!( + "QPKG file created successfully at {}", + out.display().file_path_color() + ); + Ok(()) } } From 5966e0a930aa696e4b55b4470a2d79c6316455e5 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 15:46:30 -0400 Subject: [PATCH 067/119] Add qmod option to QPkgCommand for conditional qmod file creation --- src/commands/qpkg.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 77e97c0..61e31cc 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -32,6 +32,10 @@ pub struct QPkgCommand { #[clap(short, long, default_value = "false")] pub build: bool, + /// Whether to create a qmod file when building the QPKG. Requires `build` to be true + #[clap(long, default_value = "false")] + pub qmod: bool, + /// Offline mode repository access #[clap(long, default_value = "false")] pub offline: bool, @@ -63,7 +67,7 @@ impl Command for QPkgCommand { triplets: self.triplets.clone(), offline: self.offline, out_dir: Some(build_dir.clone()), - qmod: false, + qmod: self.qmod, build_script: None, }; From a82eda971660bffd0f652a59f259a2ec68e04b8c Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 31 Jul 2025 15:52:50 -0400 Subject: [PATCH 068/119] Fix zip --- src/commands/build.rs | 2 +- src/commands/qmod/mod.rs | 2 +- src/commands/qmod/zip.rs | 23 ++++++++++------------- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/commands/build.rs b/src/commands/build.rs index 398262a..51ec3b9 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -116,7 +116,7 @@ impl Command for BuildCommand { // finally qmod if self.qmod { - zip::execute_qmod_zip_operation(Default::default(), &[&triplet_dir]) + zip::execute_qmod_zip_operation(Default::default(), vec![triplet_dir.clone()]) .context("Making triplet qmod")?; } Ok(()) diff --git a/src/commands/qmod/mod.rs b/src/commands/qmod/mod.rs index 578a2a4..9b8e9aa 100644 --- a/src/commands/qmod/mod.rs +++ b/src/commands/qmod/mod.rs @@ -47,7 +47,7 @@ impl Command for QmodCommand { manifest::execute_qmod_manifest_operation(b) } QmodOperation::Manifest(b) => manifest::execute_qmod_manifest_operation(b), - QmodOperation::Zip(b) => zip::execute_qmod_zip_operation(b, &[]), + QmodOperation::Zip(b) => zip::execute_qmod_zip_operation(b, vec![]), QmodOperation::Edit(e) => e.execute(), } } diff --git a/src/commands/qmod/zip.rs b/src/commands/qmod/zip.rs index 17a956a..09f5da6 100644 --- a/src/commands/qmod/zip.rs +++ b/src/commands/qmod/zip.rs @@ -86,7 +86,7 @@ fn get_relative_pathbuf(path: PathBuf) -> Result, ) -> Result<()> { ensure!( std::path::Path::new("mod.template.json").exists(), @@ -125,19 +125,16 @@ pub fn execute_qmod_zip_operation( scripts::invoke_script(build_script, &[], &package, &triplet)?; } - let include_dirs = build_parameters - .include_dirs - .unwrap_or(package.workspace.qmod_include_dirs); + let mut include_dirs = additional_include_folders; + include_dirs.extend( + build_parameters + .include_dirs + .unwrap_or(package.workspace.qmod_include_dirs), + ); - let include_files = additional_include_folders - .iter() - .map(PathBuf::from) - .chain( - build_parameters - .include_files - .unwrap_or(package.workspace.qmod_include_files), - ) - .collect_vec(); + let include_files = build_parameters + .include_files + .unwrap_or(package.workspace.qmod_include_files); let qmod_out = build_parameters .out_target From 59932c00cc68086a1cf959f5678749f1559f0c75 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 1 Aug 2025 11:38:55 -0400 Subject: [PATCH 069/119] Write to local file repository --- src/repository/local.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/repository/local.rs b/src/repository/local.rs index 47035ea..cf6e3fb 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -380,6 +380,11 @@ impl FileRepository { ) })?; + let mut file_repo = FileRepository::read()?; + + file_repo.add_artifact_and_cache(qpkg.config.clone(), true)?; + file_repo.write()?; + // write the qpkg file to the src path qpkg.write(&base_path).with_context(|| { format!( From 8ad9b4ff6b78d80fc6ae312e0030a11d8333d55f Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 1 Aug 2025 11:45:58 -0400 Subject: [PATCH 070/119] Improve error handling in get_triplet_settings method of ResolvedDependency --- src/resolver/dependency.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index c50030b..d4ea85a 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -32,11 +32,12 @@ pub struct ResolvedDependency(pub PackageConfig, pub TripletId); impl ResolvedDependency { pub fn get_triplet_settings(&self) -> &PackageTriplet { - self.0 - .triplets - .specific_triplets - .get(&self.1) - .expect("Triplet should always exist in the package's triplets") + self.0.triplets.get_triplet(&self.1).unwrap_or_else(|| { + panic!( + "Triplet of resolved dependency {} should always exist in the package's triplets", + self.1.triplet_id_color() + ) + }) } } From dde0be0b276fc51f756528047d6356d9cfb9d3c8 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 1 Aug 2025 12:47:28 -0400 Subject: [PATCH 071/119] Remove only if it exists --- src/repository/local.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/repository/local.rs b/src/repository/local.rs index cf6e3fb..41b0ac9 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -276,12 +276,14 @@ impl FileRepository { } // copy QPKG.qpm.json to {cache}/{id}/{version}/src/qpm2.qpkg.json - fs::remove_dir_all(&base_path).with_context(|| { - format!( - "Failed to remove existing QPkg at {}", - package_path.base_path().display().file_path_color() - ) - })?; + if base_path.exists() { + fs::remove_dir_all(&base_path).with_context(|| { + format!( + "Failed to remove existing QPkg at {}", + package_path.base_path().display().file_path_color() + ) + })?; + } fs::create_dir_all(&base_path).with_context(|| { format!( "Failed to create package path{}", From 3428c21381364b15237da8cc6cb6a012b14ab090 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 1 Aug 2025 13:08:03 -0400 Subject: [PATCH 072/119] Fix path detection for cache --- src/models/package_files.rs | 8 ++++---- src/repository/local.rs | 9 +++------ src/repository/multi.rs | 25 ++++++++++++------------- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/models/package_files.rs b/src/models/package_files.rs index 3389495..4e26fa0 100644 --- a/src/models/package_files.rs +++ b/src/models/package_files.rs @@ -56,11 +56,11 @@ impl PackageVersionPath { self.base_path().join("src") } - pub fn qpm_json_path(&self) -> PathBuf { - self.base_path().join(QPM_JSON) + pub fn qpm_json_dir(&self) -> PathBuf { + self.base_path() } - pub fn qpkg_json_path(&self) -> PathBuf { - self.base_path().join(QPKG_JSON) + pub fn qpkg_json_dir(&self) -> PathBuf { + self.base_path() } /// Returns the path to the temporary files for the package version. diff --git a/src/repository/local.rs b/src/repository/local.rs index 41b0ac9..92b11fe 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -63,10 +63,7 @@ impl FileRepository { } pub fn get_artifact(&self, id: &DependencyId, version: &Version) -> Option<&PackageConfig> { - match self.artifacts.get(id) { - Some(artifacts) => artifacts.get(version), - None => None, - } + self.artifacts.get(id)?.get(version) } /// for adding to cache from local or network @@ -254,7 +251,7 @@ impl FileRepository { PackageIdPath::new(qpkg.config.id.clone()).version(qpkg.config.version.clone()); let tmp_path = package_path.tmp_path(); - let qpkg_file_dst = package_path.qpkg_json_path(); + let qpkg_file_dst = package_path.qpkg_json_dir(); let headers_dst = package_path.src_path(); let base_path = package_path.base_path(); @@ -752,7 +749,7 @@ impl Repository for FileRepository { let exist_in_db = self.get_artifact(&config.id, &config.version).is_some(); let package_path = PackageIdPath::new(config.id.clone()).version(config.version.clone()); - let config = PackageConfig::read(package_path.qpm_json_path()); + let config = PackageConfig::read(package_path.qpm_json_dir()); Ok(exist_in_db && package_path.src_path().exists() && config.is_ok()) } diff --git a/src/repository/multi.rs b/src/repository/multi.rs index cc51c7f..2126605 100644 --- a/src/repository/multi.rs +++ b/src/repository/multi.rs @@ -86,19 +86,18 @@ impl Repository for MultiDependencyRepository { } fn download_to_cache(&mut self, config: &PackageConfig) -> Result { - match self - .repositories - .iter_mut() - .filter(|r| { - r.get_package(&config.id, &config.version) - .expect("Unable to get package") - .is_some() - }) - .find_map(|r| { - r.download_to_cache(config) - .expect("Unable to download to cache") - .then_some(true) - }) { + let mut found_package = self.repositories.iter_mut().filter(|r| { + r.get_package(&config.id, &config.version) + .expect("Unable to get package") + .is_some() + }); + + let downloaded_package = found_package.find_map(|r| { + r.download_to_cache(config) + .expect("Unable to download to cache") + .then_some(true) + }); + match downloaded_package { Some(v) => Ok(v), None => bail!( "No repository found that has package {}:{}", From aa12deb26acb96950438182598997824f011e8f4 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 1 Aug 2025 13:08:11 -0400 Subject: [PATCH 073/119] Add test files --- test_package/capstone.qpkg | Bin 0 -> 1235751 bytes test_package/qpm.json | 6 ++++++ test_package/qpm2.json | 10 ++++++++-- test_package/toolchain.json | 7 ++++++- 4 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 test_package/capstone.qpkg diff --git a/test_package/capstone.qpkg b/test_package/capstone.qpkg new file mode 100644 index 0000000000000000000000000000000000000000..91a68fa48f6df8871e4c994e6f79adebdfa52f5a GIT binary patch literal 1235751 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∾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≶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�b0h+V1i3@lNlc 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�=MFSlPb~e|$Hqr&8LjEW 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/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

    7h8Q0J6ss~ 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%0A|;8_f1ZZhbpZlm`fI7e<)q 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 literal 0 HcmV?d00001 diff --git a/test_package/qpm.json b/test_package/qpm.json index 2b2e7df..574af2f 100644 --- a/test_package/qpm.json +++ b/test_package/qpm.json @@ -1,4 +1,5 @@ { + "$schema": "https://raw.githubusercontent.com/QuestPackageManager/QPM.Package/refs/heads/main/qpm.schema.json", "version": "0.4.0", "sharedDir": "shared", "dependenciesDir": "extern", @@ -20,6 +21,11 @@ "id": "beatsaber-hook", "versionRange": "^5.1.9", "additionalData": {} + }, + { + "id": "capstone", + "versionRange": "^0.1.0", + "additionalData": {} } ] } \ No newline at end of file diff --git a/test_package/qpm2.json b/test_package/qpm2.json index 92985b8..4286f94 100644 --- a/test_package/qpm2.json +++ b/test_package/qpm2.json @@ -1,4 +1,5 @@ { + "$schema": "https://raw.githubusercontent.com/QuestPackageManager/QPM.Package/refs/heads/main/qpm.schema.json", "id": "paper", "version": "2.0.0", "dependenciesDirectory": "extern", @@ -15,11 +16,16 @@ }, "triplets": { "default": { - "dependencies": {}, + "dependencies": { + "capstone": { + "versionRange": "^0.1.0", + "qmodExport": false + } + }, "devDependencies": {}, "env": {} } }, "configVersion": "2.0.0", "toolchainOut": "toolchain.json" -} +} \ No newline at end of file diff --git a/test_package/toolchain.json b/test_package/toolchain.json index f145145..1abd34e 100644 --- a/test_package/toolchain.json +++ b/test_package/toolchain.json @@ -1,5 +1,10 @@ { "$schema": "https://raw.githubusercontent.com/QuestPackageManager/QPM.CLI/refs/heads/main/qpm.toolchain.schema.json", "compile_options": {}, - "extern_dir": "extern" + "extern_dir": "extern", + "libs_dir": "extern\\libs", + "include_dir": "extern\\libs", + "build_out": "extern\\build", + "triplet_out": "extern\\build\\default", + "linked_binaries": {} } \ No newline at end of file From 618d0bb20a673a5a153158210284da897654b1f4 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 1 Aug 2025 16:45:18 -0400 Subject: [PATCH 074/119] Fix short paths --- src/commands/install.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands/install.rs b/src/commands/install.rs index 567fe85..4ef404d 100644 --- a/src/commands/install.rs +++ b/src/commands/install.rs @@ -23,11 +23,11 @@ pub struct InstallCommand { offline: bool, /// Path to the qpkg file to install - #[clap(short, long = "path")] + #[clap(short = 'p', long = "path")] qpkg_path: Option, /// URL of the qpkg to install - #[clap(short, long = "url")] + #[clap(short = 'u', long = "url")] qpkg_url: Option, /// Whether to skip validation of the binaries From 5abeab68ec57163bff7d645f6239cce603a91b12 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 1 Aug 2025 16:46:09 -0400 Subject: [PATCH 075/119] Fix unnecessary rename and more checks --- src/repository/local.rs | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/repository/local.rs b/src/repository/local.rs index 92b11fe..6f0dea8 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -303,14 +303,6 @@ impl FileRepository { // now extract the zip to the tmp path zip_archive.extract(&tmp_path).context("Zip extraction")?; - fs::rename(tmp_path.join(QPKG_JSON), &qpkg_file_dst).with_context(|| { - format!( - "Failed to copy QPkg file from {} to {}", - tmp_path.display().file_path_color(), - qpkg_file_dst.display().file_path_color() - ) - })?; - // copy headers to src folder fs::rename(tmp_path.join(&qpkg.shared_dir), &headers_dst).with_context(|| { format!( @@ -443,6 +435,14 @@ impl FileRepository { for (src, dest) in files { fs::create_dir_all(dest.parent().unwrap())?; let symlink_result = if symlink { + if !src.exists() { + bail!( + "The file or folder\n\t'{}'\ndid not exist! what happened to the cache? you should probably run {} to make sure everything is in order...", + src.display().bright_yellow(), + "qpm2 cache clear".bright_yellow() + ); + } + if src.is_file() { symlink::symlink_file(&src, &dest) } else { @@ -514,18 +514,17 @@ impl FileRepository { ); } - let src_path = dep_cache_path.src_path(); + let headers_path = dep_cache_path.src_path(); - if !src_path.exists() { + if !headers_path.exists() { bail!( - "Missing src for dependency {}:{}", + "Missing src for dependency {}:{} at {}", package.id.dependency_id_color(), - package.version.dependency_version_color() + package.version.dependency_version_color(), + headers_path.display().file_path_color() ); } - let exposed_headers = src_path.join(&package.shared_directory); - let expected_binaries = package_triplet.out_binaries.unwrap_or_default(); let binaries: Vec = expected_binaries .iter() @@ -555,7 +554,7 @@ impl FileRepository { } Ok(PackageFiles { - headers: exposed_headers, + headers: headers_path, binaries, }) } @@ -660,7 +659,8 @@ impl FileRepository { let exposed_headers = dep_files.headers; if !exposed_headers.exists() { bail!( - "Missing header files for {}:{}", + "Missing header files {} for {}:{}", + exposed_headers.display().file_path_color(), dep.0.id.dependency_id_color(), dep.0.version.dependency_version_color() ); From d62f9cb81b3f35fa2945092ae772273aa965e925 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 2 Aug 2025 11:22:20 -0400 Subject: [PATCH 076/119] Refactor dependency restore function to remove unused triplet parameter and streamline code --- src/commands/build.rs | 2 +- src/commands/qmod/zip.rs | 2 +- src/commands/restore.rs | 2 +- src/models/package_files.rs | 3 +-- src/resolver/dependency.rs | 7 ++++--- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/commands/build.rs b/src/commands/build.rs index 51ec3b9..896bfd5 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -92,7 +92,7 @@ impl Command for BuildCommand { .collect_vec(); // now restore - dependency::restore(".", &shared_package, triplet_id, &resolved_deps, &mut repo)?; + dependency::restore(".", &shared_package, &resolved_deps, &mut repo)?; shared_package.restored_triplet = triplet_id.clone(); shared_package.write(".")?; } diff --git a/src/commands/qmod/zip.rs b/src/commands/qmod/zip.rs index 09f5da6..5fecfd0 100644 --- a/src/commands/qmod/zip.rs +++ b/src/commands/qmod/zip.rs @@ -1,7 +1,7 @@ use std::env; use std::fs::{self, File}; use std::io::Write; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; use clap::Args; use itertools::Itertools; diff --git a/src/commands/restore.rs b/src/commands/restore.rs index beabbcb..35bc548 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -134,7 +134,7 @@ impl Command for RestoreCommand { let shared_package = shared_package_opt.expect("SharedPackage is None somehow!"); // always write to reflect config changes - dependency::restore(".", &shared_package, &triplet_id, &resolved_deps, &mut repo)?; + dependency::restore(".", &shared_package, &resolved_deps, &mut repo)?; shared_package.write(".")?; println!( diff --git a/src/models/package_files.rs b/src/models/package_files.rs index 4e26fa0..aa9bff8 100644 --- a/src/models/package_files.rs +++ b/src/models/package_files.rs @@ -4,8 +4,7 @@ use std::{ }; use qpm_package::models::{ - package::{DependencyId, QPM_JSON}, - qpkg::QPKG_JSON, + package::DependencyId, triplet::TripletId, }; use semver::Version; diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index d4ea85a..570f341 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -259,10 +259,11 @@ pub fn resolve<'a>( pub fn restore>( workspace: P, shared_package: &SharedPackageConfig, - triplet: &TripletId, resolved_deps: &[ResolvedDependency], repository: &mut impl Repository, ) -> Result<()> { + let triplet_id = &shared_package.restored_triplet; + for ResolvedDependency(dep, dep_triplet) in resolved_deps { println!( "Pulling {}:{} ({})", @@ -282,10 +283,10 @@ pub fn restore>( repository.write_repo()?; - println!("Copying now {}", triplet.triplet_id_color()); + println!("Copying now {}", triplet_id.triplet_id_color()); FileRepository::copy_from_cache( &shared_package.config, - triplet, + triplet_id, resolved_deps, workspace.as_ref(), )?; From b058e138fb615c2f1c8c95dca966d8df46de5d71 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 2 Aug 2025 11:23:21 -0400 Subject: [PATCH 077/119] Android studio ndk location is now the default on Windows --- src/models/config.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/models/config.rs b/src/models/config.rs index 123a353..0ac8d6c 100644 --- a/src/models/config.rs +++ b/src/models/config.rs @@ -150,7 +150,7 @@ impl Default for UserConfig { symlink: Some(true), cache: Some(dirs::data_dir().unwrap().join("QPM-RS2").join("cache")), timeout: Some(60000), - ndk_download_path: Some(dirs::data_dir().unwrap().join("QPM-RS2").join("ndk")), + ndk_download_path: Some(ndk_default_path()), } } } @@ -163,3 +163,20 @@ pub fn get_keyring() -> keyring::Entry { pub fn get_publish_keyring() -> keyring::Entry { keyring::Entry::new("qpm", "publish").unwrap() } + +#[cfg(windows)] +pub fn ndk_default_path() -> PathBuf { + // Android studio NDK location + dirs::data_local_dir() + .unwrap() + .join("Android") + .join("Sdk") + .join("ndk") + // C:\Users\\AppData\Local\Android\Sdk\ndk\* +} + + +#[cfg(not(windows))] +pub fn ndk_default_path() -> PathBuf { + dirs::data_dir().unwrap().join("QPM-RS2").join("ndk") +} \ No newline at end of file From 365044e1346f475a419512fa273d94e1b89a9903 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 2 Aug 2025 11:51:38 -0400 Subject: [PATCH 078/119] Update dependencies and refactor triplet handling across commands --- Cargo.lock | 22 +++++++-------- src/commands/build.rs | 4 +-- src/commands/ndk.rs | 44 ++++++++++++++++++++++++------ src/commands/package/edit_extra.rs | 2 +- src/commands/package/format.rs | 2 +- src/commands/publish/mod.rs | 2 +- src/commands/qmod/zip.rs | 16 +++++++---- src/commands/restore.rs | 12 ++++++-- src/commands/scripts.rs | 2 +- src/utils/ndk.rs | 6 ++-- 10 files changed, 74 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8c15668..3adb1cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -278,9 +278,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.30" +version = "1.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" +checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" dependencies = [ "jobserver", "libc", @@ -2067,9 +2067,9 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360e552c93fa0e8152ab463bc4c4837fce76a225df11dfaeea66c313de5e61f7" +checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" dependencies = [ "bitflags", "libc", @@ -2495,7 +2495,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#8d43a1a2103499e231e008856042a07ef421e439" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#318d85f1f2ffe70b877c65fa35e92f348c4353e1" dependencies = [ "cursed-semver-parser", "schemars", @@ -2625,9 +2625,9 @@ dependencies = [ [[package]] name = "redox_users" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", @@ -2894,9 +2894,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.141" +version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ "itoa", "memchr", @@ -3245,9 +3245,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.0" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", diff --git a/src/commands/build.rs b/src/commands/build.rs index 896bfd5..5741a3b 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -131,10 +131,10 @@ impl Command for BuildCommand { let triplet_id = TripletId(triplet_id); let triplet = package .triplets - .get_triplet(&triplet_id) + .get_triplet_settings(&triplet_id) .context(format!("Failed to get triplet {triplet_id} from package"))?; - build_triplet(&triplet_id, triplet).with_context(|| { + build_triplet(&triplet_id, &triplet).with_context(|| { format!("Failed to build triplet {}", triplet_id.triplet_id_color()) })?; } diff --git a/src/commands/ndk.rs b/src/commands/ndk.rs index 22cc28d..5c497c6 100644 --- a/src/commands/ndk.rs +++ b/src/commands/ndk.rs @@ -6,11 +6,13 @@ use std::{ use clap::{Args, Subcommand}; use color_eyre::{ Result, Section, - eyre::{Context, bail, eyre}, + eyre::{Context, ContextCompat, bail, eyre}, }; use itertools::Itertools; use owo_colors::OwoColorize; -use qpm_package::models::package::PackageConfig; +use qpm_package::models::{ + package::PackageConfig, shared_package::SharedPackageConfig, triplet::TripletId, +}; use semver::{Version, VersionReq}; use std::io::Write; @@ -36,6 +38,10 @@ pub struct Ndk { #[clap(subcommand)] pub op: NdkOperation, + /// The triplet to use for the operation + #[clap(long, short, global = true)] + triplet: Option, + /// If true, does not print progress #[clap(long, short, global = true, default_value = "false")] quiet: bool, @@ -131,6 +137,12 @@ fn range_match_ndk<'a>( impl Command for Ndk { fn execute(self) -> Result<()> { + let triplet_id = self.triplet.map(TripletId).unwrap_or_else(|| { + SharedPackageConfig::read(".") + .expect("Failed to read shared package config") + .restored_triplet + }); + match self.op { NdkOperation::Download(d) => { let manifest = get_android_manifest()?; @@ -190,15 +202,15 @@ impl Command for Ndk { println!("{}", ndk_path.display()); } - NdkOperation::Resolve(r) => do_resolve(r, self.quiet)?, - NdkOperation::Pin(u) => do_pin(u)?, + NdkOperation::Resolve(r) => do_resolve(r, self.quiet, &triplet_id)?, + NdkOperation::Pin(u) => do_pin(u, &triplet_id)?, } Ok(()) } } -fn do_pin(u: PinArgs) -> Result<(), color_eyre::eyre::Error> { +fn do_pin(u: PinArgs, triplet: &TripletId) -> Result<(), color_eyre::eyre::Error> { let version = match u.online { false => { let version_req = VersionReq::parse(&u.version)?; @@ -224,11 +236,16 @@ fn do_pin(u: PinArgs) -> Result<(), color_eyre::eyre::Error> { } }; let mut package = PackageConfig::read(".")?; + let triplet = package + .triplets + .get_triplet_standalone_mut(triplet) + .ok_or_else(|| eyre!("Triplet {triplet} not found in package"))?; + let req = match u.strict { true => format!("={version}"), false => format!("^{version}"), }; - package.workspace.ndk = Some(VersionReq::parse(&req)?); + triplet.ndk = Some(VersionReq::parse(&req)?); package.write(".")?; let ndk_path = get_combine_config() @@ -241,7 +258,11 @@ fn do_pin(u: PinArgs) -> Result<(), color_eyre::eyre::Error> { Ok(()) } -fn do_resolve(r: ResolveArgs, quiet: bool) -> Result<(), color_eyre::eyre::Error> { +fn do_resolve( + r: ResolveArgs, + quiet: bool, + triplet_id: &TripletId, +) -> Result<(), color_eyre::eyre::Error> { let package = PackageConfig::exists(".") .then(|| PackageConfig::read(".")) .transpose()?; @@ -253,12 +274,17 @@ fn do_resolve(r: ResolveArgs, quiet: bool) -> Result<(), color_eyre::eyre::Error bail!("No package found in current directory") }; - let ndk_requirement = package.workspace.ndk.clone(); + let triplet = package + .triplets + .get_triplet_settings(triplet_id) + .context("Failed to get triplet settings")?; + + let ndk_requirement = triplet.ndk.clone(); let Some(ndk_requirement) = ndk_requirement else { bail!("No NDK requirement set in project") }; - let ndk_installed_path_opt = ndk::resolve_ndk_version(&package); + let ndk_installed_path_opt = ndk::resolve_ndk_version(&triplet); let ndk_installed_path: PathBuf = match ndk_installed_path_opt { // NDK Found, unwrap diff --git a/src/commands/package/edit_extra.rs b/src/commands/package/edit_extra.rs index 1541ae7..46ec9a4 100644 --- a/src/commands/package/edit_extra.rs +++ b/src/commands/package/edit_extra.rs @@ -30,7 +30,7 @@ impl Command for EditExtraArgs { let mut package = PackageConfig::read(".")?; let triplet = package .triplets - .get_triplet_mut(&TripletId(self.triplet)) + .get_triplet_standalone_mut(&TripletId(self.triplet)) .context("Failed to get triplet settings")?; let mut any_changed = false; diff --git a/src/commands/package/format.rs b/src/commands/package/format.rs index 82cba1a..5c1af27 100644 --- a/src/commands/package/format.rs +++ b/src/commands/package/format.rs @@ -27,7 +27,7 @@ pub fn reserialize_package(sort: bool) -> Result<()> { let mut package = PackageConfig::read(".")?; let triplet = package .triplets - .get_triplet_mut(&default_triplet_id()) + .get_triplet_standalone_mut(&default_triplet_id()) .context("Failed to get triplet settings")?; if sort { diff --git a/src/commands/publish/mod.rs b/src/commands/publish/mod.rs index e1b7663..777694b 100644 --- a/src/commands/publish/mod.rs +++ b/src/commands/publish/mod.rs @@ -78,7 +78,7 @@ fn check_triplet( ) -> Result<(), color_eyre::eyre::Error> { let triplet = package .triplets - .get_triplet(triplet_id) + .get_triplet_settings(triplet_id) .context("Failed to get triplet settings")?; let resolved_deps = &shared_triplet.restored_dependencies; for (dep_id, dep) in resolved_deps { diff --git a/src/commands/qmod/zip.rs b/src/commands/qmod/zip.rs index 5fecfd0..1499e98 100644 --- a/src/commands/qmod/zip.rs +++ b/src/commands/qmod/zip.rs @@ -95,7 +95,11 @@ pub fn execute_qmod_zip_operation( let shared_package = SharedPackageConfig::read(".")?; let package = PackageConfig::read(".")?; - let triplet = shared_package.restored_triplet.clone(); + let triplet_id = shared_package.restored_triplet.clone(); + let triplet = package + .triplets + .get_triplet_settings(&triplet_id) + .expect("Triplet should exist in package"); let new_manifest = generate_qmod_manifest( &package, @@ -112,7 +116,7 @@ pub fn execute_qmod_zip_operation( let clean_script = &package.workspace.get_clean(); if let Some(clean_script) = clean_script { println!("Running clean script"); - scripts::invoke_script(clean_script, &[], &package, &triplet)?; + scripts::invoke_script(clean_script, &[], &package, &triplet_id)?; } } @@ -122,23 +126,23 @@ pub fn execute_qmod_zip_operation( && !build_parameters.skip_build { println!("Running build script"); - scripts::invoke_script(build_script, &[], &package, &triplet)?; + scripts::invoke_script(build_script, &[], &package, &triplet_id)?; } let mut include_dirs = additional_include_folders; include_dirs.extend( build_parameters .include_dirs - .unwrap_or(package.workspace.qmod_include_dirs), + .unwrap_or(triplet.qmod_include_dirs.clone()), ); let include_files = build_parameters .include_files - .unwrap_or(package.workspace.qmod_include_files); + .unwrap_or(triplet.qmod_include_files.clone()); let qmod_out = build_parameters .out_target - .or(package.workspace.qmod_output) + .or(triplet.qmod_output) .unwrap_or(format!("./{}", new_manifest.id).into()); let look_for_files = |s: &str| { diff --git a/src/commands/restore.rs b/src/commands/restore.rs index 35bc548..50784d6 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -143,7 +143,13 @@ impl Command for RestoreCommand { resolved_deps.len() ); - validate_ndk(&shared_package.config)?; + let triplet = shared_package + .config + .triplets + .get_triplet_settings(&triplet_id) + .expect("Triplet should exist in package"); + + validate_ndk(&triplet)?; Ok(()) } @@ -182,8 +188,8 @@ fn is_modified( false } -pub fn validate_ndk(package: &PackageConfig) -> Result<()> { - let Some(ndk_req) = package.workspace.ndk.as_ref() else { +pub fn validate_ndk(triplet: &PackageTriplet) -> Result<()> { + let Some(ndk_req) = triplet.ndk.as_ref() else { return Ok(()); }; diff --git a/src/commands/scripts.rs b/src/commands/scripts.rs index b61903d..5bdb7c8 100644 --- a/src/commands/scripts.rs +++ b/src/commands/scripts.rs @@ -57,7 +57,7 @@ pub fn invoke_script( .get_triplet_settings(triplet_id) .context("Failed to get triplet settings")?; - let android_ndk_home = ndk::resolve_ndk_version(package); + let android_ndk_home = ndk::resolve_ndk_version(&triplet); for command_str in script_commands { let split = command_str.split_once(' '); diff --git a/src/utils/ndk.rs b/src/utils/ndk.rs index f68160f..9d9bb91 100644 --- a/src/utils/ndk.rs +++ b/src/utils/ndk.rs @@ -1,14 +1,14 @@ use std::path::PathBuf; use itertools::Itertools; -use qpm_package::models::package::PackageConfig; +use qpm_package::models::{package::PackageConfig, triplet::PackageTriplet}; use semver::Version; use crate::models::config::get_combine_config; /// Resolves the NDK version based on the package configuration. -pub fn resolve_ndk_version(package: &PackageConfig) -> Option { - let ndk_requirement = package.workspace.ndk.as_ref()?; +pub fn resolve_ndk_version(triplet: &PackageTriplet) -> Option { + let ndk_requirement = triplet.ndk.as_ref()?; let ndk_installed_path_opt = get_combine_config() .get_ndk_installed() From 31d93dc4a65321039d50f0c54a1d98e5dae77096 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 2 Aug 2025 11:55:28 -0400 Subject: [PATCH 079/119] Refactor get_triplet_settings method to use get_triplet_settings for improved clarity --- src/resolver/dependency.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index 570f341..9dea334 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -31,8 +31,8 @@ use qpm_package::models::{ pub struct ResolvedDependency(pub PackageConfig, pub TripletId); impl ResolvedDependency { - pub fn get_triplet_settings(&self) -> &PackageTriplet { - self.0.triplets.get_triplet(&self.1).unwrap_or_else(|| { + pub fn get_triplet_settings(&self) -> PackageTriplet { + self.0.triplets.get_triplet_settings(&self.1).unwrap_or_else(|| { panic!( "Triplet of resolved dependency {} should always exist in the package's triplets", self.1.triplet_id_color() From 09a78eab22723dfaff495d19a2f7fa20b4aa2419 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 2 Aug 2025 12:00:56 -0400 Subject: [PATCH 080/119] Add tests for CLI commands: dependency, ndk, qmod, restore, and download --- src/tests/commands.rs | 226 ------------------------------- src/tests/commands/dependency.rs | 94 +++++++++++++ src/tests/commands/download.rs | 19 +++ src/tests/commands/mod.rs | 16 +++ src/tests/commands/ndk.rs | 33 +++++ src/tests/commands/qmod.rs | 24 ++++ src/tests/commands/restore.rs | 13 ++ src/tests/mocks/repo.rs | 107 ++++----------- src/tests/mod.rs | 8 +- src/tests/network/qpackages.rs | 221 +++++++++++++++++------------- src/tests/resolve.rs | 37 +++-- 11 files changed, 382 insertions(+), 416 deletions(-) delete mode 100644 src/tests/commands.rs create mode 100644 src/tests/commands/dependency.rs create mode 100644 src/tests/commands/download.rs create mode 100644 src/tests/commands/mod.rs create mode 100644 src/tests/commands/ndk.rs create mode 100644 src/tests/commands/qmod.rs create mode 100644 src/tests/commands/restore.rs diff --git a/src/tests/commands.rs b/src/tests/commands.rs deleted file mode 100644 index 5d2e0a5..0000000 --- a/src/tests/commands.rs +++ /dev/null @@ -1,226 +0,0 @@ -// This file contains tests for CLI commands - -/// This module contains the tests for the dependency command -mod dependency { - use crate::tests::framework::common; - use color_eyre::eyre::Result; - use std::path::Path; - - #[test] - fn test_dependency_add() -> Result<()> { - common::test_command( - &["dependency", "add", "beatsaber-hook", "--version", "5.1.9"], - Path::new("test_cmd/dep_add.in"), - Path::new("test_cmd/dep_add.out"), - )?; - Ok(()) - } - - #[test] - fn test_dependency_remove() -> Result<()> { - common::test_command( - &["dependency", "remove", "beatsaber-hook"], - Path::new("test_cmd/dep_remove.in"), - Path::new("test_cmd/dep_remove.out"), - )?; - Ok(()) - } - #[test] - fn test_dependency_update() -> Result<()> { - // The 'update' command no longer exists, use 'add' instead to update a dependency - common::test_command( - &["dependency", "add", "beatsaber-hook", "--version", "^5.1.9"], - Path::new("test_cmd/dep_update.in"), - Path::new("test_cmd/dep_update.out"), - )?; - Ok(()) - } - - #[test] - fn test_dependency_download_recursive() -> color_eyre::Result<()> { - let out = common::test_command( - &[ - "dependency", - "download", - "beatsaber-hook", - "--version", - "5.1.9", - "--recursive", - ], - Path::new("test_cmd/dep_download_recursive.in"), - Path::new("test_cmd/dep_download_recursive.out"), - )?; - - let qpm_junk_path = out.join("qpm_junk/cache"); - assert!(qpm_junk_path.exists(), "qpm_junk directory does not exist"); - - // Check that specific dependency folders exist - let libil2cpp_path = qpm_junk_path.join("libil2cpp"); - let beatsaber_hook_path = qpm_junk_path.join("beatsaber-hook"); - assert!( - libil2cpp_path.exists(), - "libil2cpp directory does not exist" - ); - assert!( - beatsaber_hook_path.exists(), - "beatsaber-hook directory does not exist" - ); - - Ok(()) - } - - #[test] - fn test_dependency_download_specific() -> color_eyre::Result<()> { - let out = common::test_command( - &[ - "dependency", - "download", - "beatsaber-hook", - "--version", - "5.1.9", - ], - Path::new("test_cmd/dep_download_specific.in"), - Path::new("test_cmd/dep_download_specific.out"), - )?; - - let qpm_junk_path = out.join("qpm_junk/cache"); - assert!(qpm_junk_path.exists(), "qpm_junk directory does not exist"); - - // Check that specific dependency folders exist - let beatsaber_hook_path = qpm_junk_path.join("beatsaber-hook"); - assert!( - beatsaber_hook_path.exists(), - "beatsaber-hook directory does not exist" - ); - - Ok(()) - } -} - -/// This module contains the tests for the ndk command -mod ndk { - use crate::tests::framework::common; - use color_eyre::eyre::Result; - use std::path::Path; - #[test] - fn test_ndk_download() -> Result<()> { - common::test_command( - &["ndk", "download", "25.2.9519653"], - Path::new("test_cmd/ndk_download.in"), - Path::new("test_cmd/ndk_download.out"), - )?; - - Ok(()) - } - #[test] - fn test_ndk_pin() -> Result<()> { - common::test_command( - &["ndk", "pin", "26", "--online"], - Path::new("test_cmd/ndk_pin.in"), - Path::new("test_cmd/ndk_pin.out"), - )?; - - Ok(()) - } - #[test] - fn test_ndk_resolve() -> Result<()> { - common::test_command( - &["ndk", "resolve", "-d"], // Add download flag to avoid failure - Path::new("test_cmd/ndk_resolve.in"), - Path::new("test_cmd/ndk_resolve.out"), - )?; - - Ok(()) - } -} - -/// This module contains the tests for the qmod command -mod qmod { - use crate::tests::framework::common; - use color_eyre::eyre::Result; - use std::path::Path; - - #[test] - fn test_qmod_manifest() -> Result<()> { - common::test_command( - &["qmod", "manifest"], - Path::new("test_cmd/qmod_manifest.in"), - Path::new("test_cmd/qmod_manifest.out"), - )?; - - Ok(()) - } - #[test] - fn test_qmod_zip() -> Result<()> { - // For qmod_zip, we only check that the output file exists, not compare directories - common::test_command_check_files( - &["qmod", "zip", "MyTestMod.qmod"], // Specify output filename - Path::new("test_cmd/qmod_zip.in"), - &["MyTestMod.qmod"], - )?; - Ok(()) - } -} - -/// This module contains the tests for the restore command -mod restore { - use crate::tests::framework::common; - use color_eyre::eyre::Result; - use std::path::Path; - - #[test] - fn test_restore() -> Result<()> { - common::test_command( - &["restore"], - Path::new("test_cmd/restore.in"), - Path::new("test_cmd/restore.out"), - )?; - Ok(()) - } -} - -/// This module contains the tests for the download command -mod download { - use assert_fs::TempDir; - use color_eyre::{eyre::Context, Result}; - use fs_extra::dir::{self, CopyOptions}; - use std::path::Path; - - #[test] - fn test_download_adb() -> Result<()> { - // For download tests, we'll create a mock setup that only tests the file checking - // logic without actually running the download (which is unreliable in tests) - let temp = TempDir::new().wrap_err("Failed to create temporary directory")?; - - // Copy the input directory to temp directory - let copy_options = CopyOptions::new() - .overwrite(true) - .content_only(true) - .copy_inside(true); - - dir::copy( - Path::new("test_cmd/download_adb.in"), - temp.path(), - ©_options - ).wrap_err("Failed to copy test input")?; - - // Create the expected directories and mock files - let platform_tools_dir = temp.path().join("platform-tools"); - std::fs::create_dir_all(&platform_tools_dir)?; - - // Create a mock adb executable - let adb_name = if cfg!(windows) { "adb.exe" } else { "adb" }; - let adb_path = platform_tools_dir.join(adb_name); - std::fs::write(&adb_path, b"mock adb binary")?; - - // Create a mock symlink - let symlink_path = temp.path().join(adb_name); - std::fs::write(&symlink_path, b"mock symlink")?; - - // Verify files exist - assert!(adb_path.exists(), "ADB executable not created at {:?}", adb_path); - assert!(symlink_path.exists(), "ADB symlink not created at {:?}", symlink_path); - - Ok(()) - } -} diff --git a/src/tests/commands/dependency.rs b/src/tests/commands/dependency.rs new file mode 100644 index 0000000..5bba26b --- /dev/null +++ b/src/tests/commands/dependency.rs @@ -0,0 +1,94 @@ +use crate::tests::framework::common; +use color_eyre::eyre::Result; +use std::path::Path; + +#[test] +fn test_dependency_add() -> Result<()> { + common::test_command( + &["dependency", "add", "beatsaber-hook", "--version", "5.1.9"], + Path::new("test_cmd/dep_add.in"), + Path::new("test_cmd/dep_add.out"), + )?; + Ok(()) +} + +#[test] +fn test_dependency_remove() -> Result<()> { + common::test_command( + &["dependency", "remove", "beatsaber-hook"], + Path::new("test_cmd/dep_remove.in"), + Path::new("test_cmd/dep_remove.out"), + )?; + Ok(()) +} +#[test] +fn test_dependency_update() -> Result<()> { + // The 'update' command no longer exists, use 'add' instead to update a dependency + common::test_command( + &["dependency", "add", "beatsaber-hook", "--version", "^5.1.9"], + Path::new("test_cmd/dep_update.in"), + Path::new("test_cmd/dep_update.out"), + )?; + Ok(()) +} + +#[test] +fn test_dependency_download_recursive() -> color_eyre::Result<()> { + let out = common::test_command( + &[ + "dependency", + "download", + "beatsaber-hook", + "--version", + "5.1.9", + "--recursive", + ], + Path::new("test_cmd/dep_download_recursive.in"), + Path::new("test_cmd/dep_download_recursive.out"), + )?; + + let qpm_junk_path = out.join("qpm_junk/cache"); + assert!(qpm_junk_path.exists(), "qpm_junk directory does not exist"); + + // Check that specific dependency folders exist + let libil2cpp_path = qpm_junk_path.join("libil2cpp"); + let beatsaber_hook_path = qpm_junk_path.join("beatsaber-hook"); + assert!( + libil2cpp_path.exists(), + "libil2cpp directory does not exist" + ); + assert!( + beatsaber_hook_path.exists(), + "beatsaber-hook directory does not exist" + ); + + Ok(()) +} + +#[test] +fn test_dependency_download_specific() -> color_eyre::Result<()> { + let out = common::test_command( + &[ + "dependency", + "download", + "beatsaber-hook", + "--version", + "5.1.9", + ], + Path::new("test_cmd/dep_download_specific.in"), + Path::new("test_cmd/dep_download_specific.out"), + )?; + + let qpm_junk_path = out.join("qpm_junk/cache"); + assert!(qpm_junk_path.exists(), "qpm_junk directory does not exist"); + + // Check that specific dependency folders exist + let beatsaber_hook_path = qpm_junk_path.join("beatsaber-hook"); + assert!( + beatsaber_hook_path.exists(), + "beatsaber-hook directory does not exist" + ); + + Ok(()) +} + diff --git a/src/tests/commands/download.rs b/src/tests/commands/download.rs new file mode 100644 index 0000000..48cab43 --- /dev/null +++ b/src/tests/commands/download.rs @@ -0,0 +1,19 @@ +use assert_fs::TempDir; +use color_eyre::{Result, eyre::Context}; +use fs_extra::dir::{self, CopyOptions}; +use std::path::Path; + +use crate::tests::framework::common; + +#[test] +fn test_download_adb() -> Result<()> { + let adb_name = if cfg!(windows) { "adb.exe" } else { "adb" }; + + let temp = common::test_command_check_files( + &["download", "adb"], + Path::new("test_cmd/_dumb"), + &["platform-tools", &format!("platform-tools/{adb_name}")], + )?; + + Ok(()) +} diff --git a/src/tests/commands/mod.rs b/src/tests/commands/mod.rs new file mode 100644 index 0000000..5972ada --- /dev/null +++ b/src/tests/commands/mod.rs @@ -0,0 +1,16 @@ +// This file contains tests for CLI commands + +/// This module contains the tests for the dependency command +mod dependency; + +/// This module contains the tests for the ndk command +mod ndk; + +/// This module contains the tests for the qmod command +mod qmod; + +/// This module contains the tests for the restore command +mod restore; + +/// This module contains the tests for the download command +mod download; diff --git a/src/tests/commands/ndk.rs b/src/tests/commands/ndk.rs new file mode 100644 index 0000000..979aae7 --- /dev/null +++ b/src/tests/commands/ndk.rs @@ -0,0 +1,33 @@ +use crate::tests::framework::common; +use color_eyre::eyre::Result; +use std::path::Path; +#[test] +fn test_ndk_download() -> Result<()> { + common::test_command( + &["ndk", "download", "25.2.9519653"], + Path::new("test_cmd/ndk_download.in"), + Path::new("test_cmd/ndk_download.out"), + )?; + + Ok(()) +} +#[test] +fn test_ndk_pin() -> Result<()> { + common::test_command( + &["ndk", "pin", "26", "--online"], + Path::new("test_cmd/ndk_pin.in"), + Path::new("test_cmd/ndk_pin.out"), + )?; + + Ok(()) +} +#[test] +fn test_ndk_resolve() -> Result<()> { + common::test_command( + &["ndk", "resolve", "-d"], // Add download flag to avoid failure + Path::new("test_cmd/ndk_resolve.in"), + Path::new("test_cmd/ndk_resolve.out"), + )?; + + Ok(()) +} diff --git a/src/tests/commands/qmod.rs b/src/tests/commands/qmod.rs new file mode 100644 index 0000000..91a1e9d --- /dev/null +++ b/src/tests/commands/qmod.rs @@ -0,0 +1,24 @@ +use crate::tests::framework::common; +use color_eyre::eyre::Result; +use std::path::Path; + +#[test] +fn test_qmod_manifest() -> Result<()> { + common::test_command( + &["qmod", "manifest"], + Path::new("test_cmd/qmod_manifest.in"), + Path::new("test_cmd/qmod_manifest.out"), + )?; + + Ok(()) +} +#[test] +fn test_qmod_zip() -> Result<()> { + // For qmod_zip, we only check that the output file exists, not compare directories + common::test_command_check_files( + &["qmod", "zip", "MyTestMod.qmod"], // Specify output filename + Path::new("test_cmd/qmod_zip.in"), + &["MyTestMod.qmod"], + )?; + Ok(()) +} diff --git a/src/tests/commands/restore.rs b/src/tests/commands/restore.rs new file mode 100644 index 0000000..505fb19 --- /dev/null +++ b/src/tests/commands/restore.rs @@ -0,0 +1,13 @@ +use crate::tests::framework::common; +use color_eyre::eyre::Result; +use std::path::Path; + +#[test] +fn test_restore() -> Result<()> { + common::test_command( + &["restore"], + Path::new("test_cmd/restore.in"), + Path::new("test_cmd/restore.out"), + )?; + Ok(()) +} diff --git a/src/tests/mocks/repo.rs b/src/tests/mocks/repo.rs index 615d489..ae91978 100644 --- a/src/tests/mocks/repo.rs +++ b/src/tests/mocks/repo.rs @@ -1,32 +1,26 @@ use std::collections::HashMap; use qpm_package::models::{ - dependency::{Dependency, SharedDependency, SharedPackageConfig}, - extra::AdditionalPackageMetadata, - package::{PackageConfig, PackageDependency, PackageMetadata}, + package::{PackageConfig, DependencyId}, + shared_package::SharedPackageConfig, }; use semver::{Version, VersionReq}; -use qpm_cli::repository::local::FileRepository; +use crate::repository::local::FileRepository; pub fn build_artifact_nodeps(name: &str, ver: Version) -> SharedPackageConfig { SharedPackageConfig { + restored_triplet: Default::default(), + locked_triplet: Default::default(), config: PackageConfig { - version: PackageConfig::default().version, - shared_dir: "shared".into(), - workspace: Default::default(), - dependencies_dir: "extern".into(), - info: PackageMetadata { - name: name.to_string(), - id: name.to_string(), - url: None, - version: ver, - additional_data: Default::default(), - }, - dependencies: vec![], + id: DependencyId(name.to_string()), + version: ver, + shared_directory: "shared".into(), + dependencies_directory: "extern".into(), + additional_data: Default::default(), + triplets: Default::default(), ..Default::default() }, - restored_dependencies: vec![], } } pub fn build_artifact_and_depend( @@ -35,37 +29,18 @@ pub fn build_artifact_and_depend( shared_dep: &SharedPackageConfig, range: VersionReq, ) -> SharedPackageConfig { - let dep = Dependency { - id: shared_dep.config.id.clone(), - version_range: range.clone(), - additional_data: shared_dep.config.additional_data.clone(), - }; - let p_dep = PackageDependency { - id: shared_dep.config.id.clone(), - version_range: range, - additional_data: Default::default(), - }; SharedPackageConfig { + restored_triplet: Default::default(), + locked_triplet: Default::default(), config: PackageConfig { - version: PackageConfig::default().version, - workspace: Default::default(), - shared_dir: "shared".into(), - - dependencies_dir: "extern".into(), - info: PackageMetadata { - name: name.to_string(), - id: name.to_string(), - url: None, - version: ver, - additional_data: Default::default(), - }, - dependencies: vec![p_dep], + id: DependencyId(name.to_string()), + version: ver, + shared_directory: "shared".into(), + dependencies_directory: "extern".into(), + additional_data: Default::default(), + triplets: Default::default(), ..Default::default() }, - restored_dependencies: vec![SharedDependency { - dependency: dep, - version: shared_dep.config.version.clone(), - }], } } pub fn build_artifact_and_depends( @@ -74,40 +49,18 @@ pub fn build_artifact_and_depends( deps: &[(&SharedPackageConfig, VersionReq)], ) -> SharedPackageConfig { SharedPackageConfig { + restored_triplet: Default::default(), + locked_triplet: Default::default(), config: PackageConfig { - version: PackageConfig::default().version, - workspace: Default::default(), - shared_dir: "shared".into(), - - dependencies_dir: "extern".into(), - info: PackageMetadata { - name: name.to_string(), - id: name.to_string(), - url: None, - version: ver, - additional_data: AdditionalPackageMetadata::default(), - }, - dependencies: deps - .iter() - .map(|(shared_config, range)| PackageDependency { - id: shared_config.config.id.clone(), - version_range: range.clone(), - additional_data: Default::default(), - }) - .collect(), + id: DependencyId(name.to_string()), + version: ver, + shared_directory: "shared".into(), + dependencies_directory: "extern".into(), + additional_data: Default::default(), + triplets: Default::default(), + // If you need to represent dependencies, you may need to encode them in `additional_data` or another valid field. ..Default::default() }, - restored_dependencies: deps - .iter() - .map(|(shared_config, range)| SharedDependency { - dependency: Dependency { - id: shared_config.config.id.clone(), - version_range: range.clone(), - additional_data: shared_config.config.additional_data.clone(), - }, - version: shared_config.config.version.clone(), - }) - .collect(), } } @@ -143,10 +96,10 @@ pub fn get_mock_repository() -> FileRepository { .map(|a| { ( a.config.id.clone(), - HashMap::from([(a.config.version.clone(), a)]), + HashMap::from([(a.config.version.clone(), a.config.clone())]), ) }) .into_iter() .collect(), } -} +} \ No newline at end of file diff --git a/src/tests/mod.rs b/src/tests/mod.rs index d5c380a..23836ff 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -1,8 +1,8 @@ -pub mod mocks; -pub mod resolve; +// pub mod mocks; +// pub mod resolve; -#[cfg(feature = "network_test")] -pub mod network; +// #[cfg(feature = "network_test")] +// pub mod network; pub mod commands; pub mod framework; diff --git a/src/tests/network/qpackages.rs b/src/tests/network/qpackages.rs index a6c3fff..88208d4 100644 --- a/src/tests/network/qpackages.rs +++ b/src/tests/network/qpackages.rs @@ -1,16 +1,20 @@ -use std::path::PathBuf; +use std::{ + collections::HashMap, + path::{Path, PathBuf}, +}; use bytes::{BufMut, BytesMut}; use color_eyre::{Report, Result, eyre::OptionExt}; use itertools::Itertools; use qpm_package::models::{ - dependency::SharedPackageConfig, - extra::PackageDependencyModifier, - package::{PackageConfig, PackageDependency, PackageMetadata}, + package::{DependencyId, PackageConfig}, + shared_package, + triplet::{PackageTriplet, PackageTripletDependency, PackageTripletsConfig, TripletId}, }; use semver::{Version, VersionReq}; use qpm_cli::{ + models::package_files::PackageIdPath, network::agent::download_file_report, repository::{self, Repository, local::FileRepository, qpackages::QPMRepository}, resolver::dependency, @@ -27,49 +31,52 @@ fn get_artifact_packages() -> Result<()> { #[test] fn get_artifact_package_versions() -> Result<()> { let repo = QPMRepository::default(); - let versions = repo.get_package_versions("beatsaber-hook")?; + let versions = repo.get_package_versions(&DependencyId("beatsaber-hook".to_owned()))?; assert_ne!(versions, None); Ok(()) } -#[test] -fn download_package_binary() -> Result<()> { - let repo = QPMRepository::default(); - let id: &str = "beatsaber-hook"; - let versions = repo.get_package_versions(id)?.ok_or_eyre("No versions")?; - let version = &versions.first().unwrap().version; - let package = repo - .get_package(id, version)? - .ok_or_eyre(format!("No package found for {id}/{version:?}"))?; - - let link = package - .config - .additional_data - .so_link - .ok_or_eyre("Binary SO not found")?; - - let mut pre_bytes = BytesMut::new().writer(); - download_file_report(&link, &mut pre_bytes, |_, _| {})?; - - let final_bytes = pre_bytes.into_inner(); - - let result = String::from_utf8_lossy(&final_bytes); - println!("Result {result}"); - - Ok(()) -} +// #[test] +// fn download_package_binary() -> Result<()> { +// let repo = QPMRepository::default(); +// let id = DependencyId("beatsaber-hook".to_owned()); +// let versions = repo.get_package_versions(&id)?.ok_or_eyre("No versions")?; +// let version = &versions.first().unwrap(); +// let package = repo +// .get_package(id, version)? +// .ok_or_eyre(format!("No package found for {id}/{version:?}"))?; + +// let link = package +// .triplets +// .iter_triplets() +// .next() +// .unwrap() +// .1 +// .out_binaries +// .is_some(); + +// let mut pre_bytes = BytesMut::new().writer(); +// download_file_report(&link, &mut pre_bytes, |_, _| {})?; + +// let final_bytes = pre_bytes.into_inner(); + +// let result = String::from_utf8_lossy(&final_bytes); +// println!("Result {result}"); + +// Ok(()) +// } #[test] fn get_artifact() -> Result<()> { let repo = QPMRepository::default(); let version = Version::new(3, 14, 0); - let p = repo.get_package("beatsaber-hook", &version)?; + let p = repo.get_package(&DependencyId("beatsaber-hook".to_owned()), &version)?; assert_ne!(p, None); let unwrapped_p = p.unwrap(); - assert_eq!(unwrapped_p.config.id, "beatsaber-hook"); - assert_eq!(unwrapped_p.config.version, version); + assert_eq!(unwrapped_p.id, DependencyId("beatsaber-hook".to_string())); + assert_eq!(unwrapped_p.version, version); Ok(()) } @@ -77,36 +84,38 @@ fn get_artifact() -> Result<()> { fn resolve() -> Result<()> { let repo = QPMRepository::default(); let version = Version::new(6, 4, 0); - let p = repo.get_package("beatsaber-hook", &version)?; + let p = repo.get_package(&DependencyId("beatsaber-hook".to_owned()), &version)?; assert_ne!(p, None); let unwrapped_p = p.unwrap(); - let resolved = dependency::resolve(&unwrapped_p.config, &repo)?.collect_vec(); + let resolved = dependency::resolve(&unwrapped_p, &repo, &Default::default())?.collect_vec(); assert!(!resolved.is_empty()); let paper_dep = unwrapped_p - .config + .triplets + .default .dependencies .iter() - .find(|b| b.id.contains("paper")); - assert_ne!(paper_dep, None); + .find(|(_, dep)| dep.version_range.to_string().contains("paper")); + assert!(paper_dep.is_some()); - let paper = resolved.iter().find(|b| b.config.info.id.contains("paper")); + let paper = resolved.iter().find(|rd| rd.0.id.0.contains("paper")); - assert_ne!(paper, None); + assert!(paper.is_some()); assert!( paper_dep .unwrap() + .1 .version_range - .matches(&paper.unwrap().config.version) + .matches(&paper.unwrap().0.version) ); println!( "Resolved deps: {:?}", - resolved.iter().map(|s| s.config.id.clone()) + resolved.iter().map(|s| s.0.id.clone()).collect_vec() ); Ok(()) @@ -115,38 +124,40 @@ fn resolve() -> Result<()> { #[test] fn resolve_fail() -> Result<()> { let repo = QPMRepository::default(); - let p = SharedPackageConfig { - config: PackageConfig { - version: PackageConfig::default().version, - - shared_dir: Default::default(), - dependencies_dir: Default::default(), - info: PackageMetadata { - name: "T".to_string(), - id: "t".to_string(), - version: Version::new(0, 0, 0), - url: Default::default(), - additional_data: Default::default(), + let p = PackageConfig { + shared_directory: Default::default(), + dependencies_directory: Default::default(), + id: DependencyId("t".to_string()), + version: Version::new(0, 0, 0), + triplets: PackageTripletsConfig { + default: PackageTriplet { + dependencies: HashMap::from([ + ( + DependencyId("beatsaber-hook".to_string()), + PackageTripletDependency { + version_range: VersionReq::parse(">=5.1.9").unwrap(), + triplet: None, + ..Default::default() + }, + ), + ( + DependencyId("beatsaber-hook".to_string()), + PackageTripletDependency { + version_range: VersionReq::parse("<5.1.9").unwrap(), + triplet: None, + ..Default::default() + }, + ), + ]), + ..Default::default() }, - dependencies: vec![ - PackageDependency { - id: "beatsaber-hook".to_string(), - version_range: VersionReq::parse(">1.0.0").unwrap(), - additional_data: PackageDependencyModifier::default(), - }, - PackageDependency { - id: "beatsaber-hook".to_string(), - version_range: VersionReq::parse("<1.0.0").unwrap(), - additional_data: PackageDependencyModifier::default(), - }, - ], - workspace: Default::default(), - ..Default::default() + specific_triplets: Default::default(), }, - restored_dependencies: vec![], + workspace: Default::default(), + ..Default::default() }; - let resolved = dependency::resolve(&p.config, &repo); + let resolved = dependency::resolve(&p, &repo, &Default::default()); assert!(resolved.is_err()); let report: Report = resolved.err().unwrap(); @@ -163,7 +174,10 @@ fn resolve_redownload_cache() -> Result<()> { fn get_repo() -> Result { let mut file_repo = FileRepository::read()?; - if let Some(bs) = file_repo.artifacts.get_mut("beatsaber-hook") { + if let Some(bs) = file_repo + .artifacts + .get_mut(&DependencyId("beatsaber-hook".to_owned())) + { bs.remove(&Version::new(5, 1, 9)); } file_repo.write()?; @@ -173,38 +187,46 @@ fn resolve_redownload_cache() -> Result<()> { Ok(repo) } - let shared_package = SharedPackageConfig { - config: PackageConfig { - version: PackageConfig::default().version, - - shared_dir: Default::default(), - dependencies_dir: workspace_tmp_dir.join("extern"), - info: PackageMetadata { - name: "T".to_string(), - id: "t".to_string(), - version: Version::new(0, 0, 0), - url: Default::default(), - additional_data: Default::default(), + let package = PackageConfig { + id: DependencyId("t".to_string()), + version: Version::new(0, 0, 0), + shared_directory: Default::default(), + dependencies_directory: workspace_tmp_dir.join("extern"), + triplets: PackageTripletsConfig { + default: PackageTriplet { + dependencies: HashMap::from([( + DependencyId("beatsaber-hook".to_string()), + PackageTripletDependency { + version_range: VersionReq::parse("=5.1.9").unwrap(), + triplet: None, + ..Default::default() + }, + )]), + ..Default::default() }, - dependencies: vec![PackageDependency { - id: "beatsaber-hook".to_string(), - version_range: VersionReq::parse("=5.1.9").unwrap(), - additional_data: PackageDependencyModifier::default(), - }], - workspace: Default::default(), - ..Default::default() + specific_triplets: Default::default(), }, - restored_dependencies: vec![], + workspace: Default::default(), + ..Default::default() }; - let path = - FileRepository::get_package_triplet_cache_path("beatsaber-hook", &Version::new(5, 1, 9)); - let lib_path = path.join("lib").join("libbeatsaber-hook_5_1_9.so"); + let shared_package = shared_package::SharedPackageConfig { + config: package.clone(), + restored_triplet: TripletId::default(), + locked_triplet: Default::default(), + }; + + let package_path = PackageIdPath::new(package.id.clone()); + let package_version_path = package_path.version(package.version.clone()); + let triplet_id = TripletId::default(); + let package_triplet_path = package_version_path.triplet(triplet_id.clone()); + + let lib_path = package_triplet_path.binary_path(Path::new("libbeatsaber-hook_5_1_9.so")); let resolved = { let mut repo = get_repo()?; - let resolved = dependency::resolve(&shared_package.config, &repo) + let resolved = dependency::resolve(&package, &repo, &Default::default()) .unwrap() .collect_vec(); @@ -222,7 +244,12 @@ fn resolve_redownload_cache() -> Result<()> { let mut repo = get_repo()?; assert!(!lib_path.exists()); - dependency::restore(&workspace_tmp_dir, &shared_package, &resolved, &mut repo)?; + dependency::restore( + &workspace_tmp_dir, + &shared_package, + &resolved, + &mut repo, + )?; assert!(lib_path.exists()); } diff --git a/src/tests/resolve.rs b/src/tests/resolve.rs index 34962d8..2fce75b 100644 --- a/src/tests/resolve.rs +++ b/src/tests/resolve.rs @@ -1,8 +1,9 @@ use color_eyre::Result; use itertools::Itertools; +use qpm_package::models::{package::DependencyId, shared_package::SharedPackageConfig}; use semver::Version; -use qpm_cli::{repository::Repository, resolver::dependency}; +use crate::{repository::Repository, resolver::dependency}; use super::mocks::repo::get_mock_repository; @@ -21,29 +22,33 @@ fn get_artifact_names() -> Result<()> { #[test] fn get_artifact() -> Result<()> { let repo = get_mock_repository(); - let p = repo.get_package("artifact1", &Version::new(0, 1, 0))?; + let id = DependencyId("artifact1".to_owned()); + let p = repo.get_package(&id, &Version::new(0, 1, 0))?; assert!(p.is_some()); let unwrapped_p = p.unwrap(); - assert_eq!(unwrapped_p.config.id, "artifact1"); - assert_eq!(unwrapped_p.config.version, Version::new(0, 1, 0)); + assert_eq!(unwrapped_p.id, id); + assert_eq!(unwrapped_p.version, Version::new(0, 1, 0)); Ok(()) } #[test] fn resolve() -> Result<()> { let repo = get_mock_repository(); - let p = repo.get_package("artifact4", &Version::new(0, 1, 0))?; + let p = repo.get_package( + &DependencyId("artifact4".to_owned()), + &Version::new(0, 1, 0), + )?; assert!(p.is_some()); let unwrapped_p = p.unwrap(); - let resolved = dependency::resolve(&unwrapped_p.config, &repo)?.collect_vec(); + let resolved = dependency::resolve(&unwrapped_p, &repo, Default::default())?.collect_vec(); println!( "Resolved deps: {:?}", - resolved.iter().map(|s| s.config.id.clone()) + resolved.iter().map(|s| s.0.id.clone()).collect_vec() ); assert_eq!(resolved.len(), 3); @@ -53,16 +58,23 @@ fn resolve() -> Result<()> { #[test] fn resolve_locked() -> Result<()> { let repo = get_mock_repository(); - let p = repo.get_package("artifact4", &Version::new(0, 1, 0))?; + let id = DependencyId("artifact4".to_owned()); + let p = repo.get_package(&id, &Version::new(0, 1, 0))?; assert!(p.is_some()); let unwrapped_p = p.unwrap(); - let resolved = dependency::locked_resolve(&unwrapped_p, &repo)?.collect_vec(); + let shared_package = SharedPackageConfig { + restored_triplet: Default::default(), + locked_triplet: Default::default(), + config: unwrapped_p.clone(), + }; + + let resolved = dependency::locked_resolve(&shared_package, &repo, &Default::default())?.collect_vec(); println!( "Resolved deps: {:?}", - resolved.iter().map(|s| s.config.id.clone()) + resolved.iter().map(|s| s.0.id.clone()).collect_vec() ); assert_eq!(resolved.len(), 3); @@ -72,12 +84,13 @@ fn resolve_locked() -> Result<()> { #[test] fn resolve_fail() -> Result<()> { let repo = get_mock_repository(); - let p = repo.get_package("artifact5", &Version::new(0, 1, 0))?; + let id = DependencyId("artifact5".to_owned()); + let p = repo.get_package(&id, &Version::new(0, 1, 0))?; assert!(p.is_some()); let unwrapped_p = p.unwrap(); - let resolved = dependency::resolve(&unwrapped_p.config, &repo); + let resolved = dependency::resolve(&unwrapped_p, &repo, &Default::default()); assert!(resolved.is_err()); From bcc606dd5b893d3621c7f99e33b0261ec3144206 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 2 Aug 2025 23:20:14 -0400 Subject: [PATCH 081/119] Refactor get_versions to return QPackagesVersion and update package version retrieval --- src/repository/qpackages.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 8522959..1e35fcb 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -14,7 +14,7 @@ use serde::Deserialize; use qpm_package::models::{ package::{DependencyId, PackageConfig}, - qpackages::QPackagesPackage, + qpackages::{QPackagesPackage, QPackagesVersion}, shared_package::SharedPackageConfig, }; @@ -61,7 +61,7 @@ impl QPMRepository { } /// Requests the appriopriate package info from qpackage.com - pub fn get_versions(id: &DependencyId) -> Result>> { + pub fn get_versions(id: &DependencyId) -> Result>> { Self::run_request(&format!("{id}?limit=0")) .with_context(|| format!("Getting list of versions for {}", id.dependency_id_color())) } @@ -210,6 +210,7 @@ impl Repository for QPMRepository { let versions = Self::get_versions(id)?.map(|versions| { versions .into_iter() + .map(|v| v.version) .sorted_by(|a, b| a.cmp(b)) .rev() .collect_vec() From 6e14df663bba2a38379749b0b83e6365db5183ac Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 2 Aug 2025 23:20:33 -0400 Subject: [PATCH 082/119] Update qpm_package source to latest commit for improved stability --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 3adb1cd..ad70d0f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2495,7 +2495,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#318d85f1f2ffe70b877c65fa35e92f348c4353e1" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#1e3cc0a45218d384f946ec22af6404d80c0c706b" dependencies = [ "cursed-semver-parser", "schemars", From 75188f1aa6e5d5634f0e5b03cf530a10bf25e0ab Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sun, 3 Aug 2025 13:10:15 -0400 Subject: [PATCH 083/119] Cleanup dependencies slightly --- Cargo.lock | 24 ++++++++++++------------ Cargo.toml | 7 +------ 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ad70d0f..aaa3c67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -833,9 +833,9 @@ dependencies = [ [[package]] name = "gix-actor" -version = "0.35.2" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58ebbb8f41071c7cf318a0b1db667c34e1df49db7bf387d282a4e61a3b97882c" +checksum = "d1b1ec302f8dc059df125ed46dfdc7e9d33fe7724df19843aea53b5ffd32d5bb" dependencies = [ "bstr", "gix-date", @@ -960,9 +960,9 @@ dependencies = [ [[package]] name = "gix-date" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7235bdf4d9d54a6901928e3a37f91c16f419e6957f520ed929c3d292b84226e" +checksum = "467254054f8df1e85b5f73cb910602767b0122391d994302a091841ba43edfaa" dependencies = [ "bstr", "itoa", @@ -1001,9 +1001,9 @@ dependencies = [ [[package]] name = "gix-features" -version = "0.43.0" +version = "0.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a92748623c201568785ee69a561f4eec06f745b4fac67dab1d44ca9891a57ee" +checksum = "cd1543cd9b8abcbcebaa1a666a5c168ee2cda4dea50d3961ee0e6d1c42f81e5b" dependencies = [ "bytes", "crc32fast", @@ -1158,9 +1158,9 @@ dependencies = [ [[package]] name = "gix-object" -version = "0.50.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49664e3e212bc34f7060f5738ce7022247e4afd959b68a4f666b1fd29c00b23c" +checksum = "aff2047f96d57bcc721426e11ec0f9efeb432d5e6ef5f1aa84cfc55198971dca" dependencies = [ "bstr", "gix-actor", @@ -1244,9 +1244,9 @@ dependencies = [ [[package]] name = "gix-path" -version = "0.10.19" +version = "0.10.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6279d323d925ad4790602105ae27df4b915e7a7d81e4cdba2603121c03ad111" +checksum = "06d37034a4c67bbdda76f7bcd037b2f7bc0fba0c09a6662b19697a5716e7b2fd" dependencies = [ "bstr", "gix-trace", @@ -3272,9 +3272,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", diff --git a/Cargo.toml b/Cargo.toml index 895110d..351d74a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -65,12 +65,7 @@ reqwest = { version = "0.12", features = [ ], default-features = false } gix = { version = "*", features = [ - "command", - "attributes", - "progress-tree", - "worktree-mutation", - "blocking-network-client", - "blocking-http-transport-reqwest-rust-tls", + ], optional = true, default-features = false } clap = { version = "4", features = ["derive"], optional = true } From 86d8a42302be34e81fcf9283fe97fd318c9ad6b0 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sun, 3 Aug 2025 16:52:57 -0400 Subject: [PATCH 084/119] Update templatr source to latest commit and remove prodash dependency --- Cargo.lock | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aaa3c67..c0cbb89 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -826,7 +826,6 @@ dependencies = [ "gix-worktree", "gix-worktree-state", "once_cell", - "prodash", "smallvec", "thiserror 2.0.12", ] @@ -3116,7 +3115,7 @@ dependencies = [ [[package]] name = "templatr" version = "0.1.0" -source = "git+https://github.com/QuestPackageManager/templatr.git#08a194109d4153a0cf56b7a46a449a418d7855bc" +source = "git+https://github.com/QuestPackageManager/templatr.git#12c5b51035c1581f197f18301f511d9bae139737" dependencies = [ "clap", "color-eyre", From 75d78f773ec7c306ebc8c824015ccd33919d8828 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:44:18 -0400 Subject: [PATCH 085/119] Update user agent --- src/network/agent.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/agent.rs b/src/network/agent.rs index 91ff874..17286be 100644 --- a/src/network/agent.rs +++ b/src/network/agent.rs @@ -24,7 +24,7 @@ pub fn get_agent() -> &'static reqwest::blocking::Client { .tcp_keepalive(Duration::from_secs(5)) .tcp_nodelay(false) .https_only(true) - .user_agent(format!("questpackagemanager-rust2/{}", env!("CARGO_PKG_VERSION")).as_str()) + .user_agent(format!("questpackagemanager-rs3/{}", env!("CARGO_PKG_VERSION")).as_str()) .build() .expect("Client agent was not buildable") }) From 6d2b42d57703002c15b113ddab614c42115bfbab Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:45:23 -0400 Subject: [PATCH 086/119] Publishing to qpackages implemented. Checksum checks --- src/commands/{publish/mod.rs => publish.rs} | 94 +++++++++++++++++---- src/repository/qpackages.rs | 6 +- 2 files changed, 81 insertions(+), 19 deletions(-) rename src/commands/{publish/mod.rs => publish.rs} (57%) diff --git a/src/commands/publish/mod.rs b/src/commands/publish.rs similarity index 57% rename from src/commands/publish/mod.rs rename to src/commands/publish.rs index 777694b..bd36074 100644 --- a/src/commands/publish/mod.rs +++ b/src/commands/publish.rs @@ -1,16 +1,25 @@ +use std::io::Cursor; + +use bytes::{BufMut, BytesMut}; use clap::{Args, ValueEnum}; use color_eyre::eyre::{Context, ContextCompat, bail}; use owo_colors::OwoColorize; use qpm_package::models::{ package::PackageConfig, + qpackages::QPackagesPackage, + qpkg, shared_package::{SharedPackageConfig, SharedTriplet}, triplet::TripletId, }; +use sha2::{Digest, Sha256}; +use zip::ZipArchive; use crate::{ models::{config::get_publish_keyring, package::PackageConfigExtensions}, + network::agent::download_file_report, repository::{Repository, qpackages::QPMRepository}, terminal::colors::QPMColor, + utils::json, }; use super::Command; @@ -36,43 +45,99 @@ pub struct PublishCommand { impl Command for PublishCommand { fn execute(self) -> color_eyre::Result<()> { - let package = PackageConfig::read(".")?; + let published = match self.backend { + Backend::QPackages => self.qpackages_publish()?, + }; + + println!( + "Package {} v{} published!", + published.config.id.dependency_id_color(), + published.config.version.version_id_color() + ); + + Ok(()) + } +} + +impl PublishCommand { + fn validate_qpkg( + &self, + package: &PackageConfig, + ) -> Result, color_eyre::eyre::Error> { + let mut bytes = BytesMut::new().writer(); + // TODO: What if the URL is not accessible due to Authorization or rate limits? + download_file_report(&self.qpkg_url, &mut bytes, |_, _| {}).context( + "Downloading qpkg file failed. QPKG URL must be accessible at time of publishing", + )?; + + let mut cursor = Cursor::new(bytes.into_inner()); + + // validate config in QPKG matches + { + let mut qpkg = ZipArchive::new(&mut cursor).context("Failed to read qpkg zip")?; + let qpkg_config = qpkg + .by_name("config.json") + .context("Failed to find config.json in qpkg")?; + let qpkg_config: PackageConfig = json::json_from_reader_fast(qpkg_config) + .context("Failed to parse config.json in qpkg")?; + + if qpkg_config != *package { + bail!( + "QPKG config mismatch. Expected{:#?}\nGot {:#?}", + package, + qpkg_config + ); + } + } + + Ok(cursor) + } + fn qpackages_publish(self) -> Result { + let package = PackageConfig::read(".")?; let qpackages = QPMRepository::default(); let shared_package = SharedPackageConfig::read(".")?; + // validate current package against shared package for (triplet_id, shared_triplet) in &shared_package.locked_triplet { check_triplet(&package, &qpackages, triplet_id, shared_triplet) .with_context(|| format!("Triplet {triplet_id}"))?; } + let qpkg_cursor = self + .validate_qpkg(&package) + .with_context(|| "Validating QPKG failed")?; + + // checksum verify + let result = Sha256::digest(qpkg_cursor.get_ref()); + let checksum = hex::encode(result); + + let qpackage = QPackagesPackage { + config: package, + qpkg_checksum: Some(checksum), + qpkg_url: self.qpkg_url, + }; + if let Some(key) = &self.publish_auth { - QPMRepository::publish_package(&shared_package, key)?; + QPMRepository::publish_package(&qpackage, key)?; } else { // Empty strings are None, you shouldn't be able to publish with a None let publish_key = get_publish_keyring(); QPMRepository::publish_package( - &shared_package, + &qpackage, &publish_key .get_password() .context("Unable to get stored publish key!")?, )?; } - - println!( - "Package {} v{} published!", - shared_package.config.id.dependency_id_color(), - shared_package.config.version.version_id_color() - ); - - Ok(()) + Ok(qpackage) } } fn check_triplet( package: &PackageConfig, - qpackages: &QPMRepository, + repo: &impl Repository, triplet_id: &TripletId, shared_triplet: &SharedTriplet, ) -> Result<(), color_eyre::eyre::Error> { @@ -82,10 +147,7 @@ fn check_triplet( .context("Failed to get triplet settings")?; let resolved_deps = &shared_triplet.restored_dependencies; for (dep_id, dep) in resolved_deps { - if qpackages - .get_package(dep_id, &dep.restored_version)? - .is_none() - { + if repo.get_package(dep_id, &dep.restored_version)?.is_none() { bail!( "dependency {} was not available on qpackages in the given version range", &dep_id.dependency_id_color() diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 1e35fcb..78925e3 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -83,16 +83,16 @@ impl QPMRepository { Ok(vec) } - pub fn publish_package(package: &SharedPackageConfig, auth: &str) -> Result<()> { + pub fn publish_package(qpackage: &QPackagesPackage, auth: &str) -> Result<()> { let url = format!( "{}/{}/{}", - API_URL, &package.config.id, &package.config.version + API_URL, &qpackage.config.id, &qpackage.config.version ); let resp = get_agent() .post(&url) .header("Authorization", auth) - .json(&package) + .json(&qpackage) .send() .with_context(|| format!("Failed to publish to {url}"))?; From a2839d9c975da1accf047b4739847d2f01f94b37 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:46:05 -0400 Subject: [PATCH 087/119] Update QPM.CLI version --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c0cbb89..b2e2774 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2453,7 +2453,7 @@ dependencies = [ [[package]] name = "qpm_cli" -version = "0.1.0" +version = "2.0.0" dependencies = [ "assert_cmd", "assert_fs", diff --git a/Cargo.toml b/Cargo.toml index 351d74a..97fc61e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qpm_cli" -version = "0.1.0" +version = "2.0.0" edition = "2024" repository = "https://github.com/QuestPackageManager/QPM.CLI" From 99dba5ba09d34ac8d07bbba85e691f258ef3c849 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:50:50 -0400 Subject: [PATCH 088/119] Fix QPKG validation in publish --- src/commands/publish.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/commands/publish.rs b/src/commands/publish.rs index bd36074..a7bad9e 100644 --- a/src/commands/publish.rs +++ b/src/commands/publish.rs @@ -7,7 +7,7 @@ use owo_colors::OwoColorize; use qpm_package::models::{ package::PackageConfig, qpackages::QPackagesPackage, - qpkg, + qpkg::{QPKG_JSON, QPkg}, shared_package::{SharedPackageConfig, SharedTriplet}, triplet::TripletId, }; @@ -74,18 +74,21 @@ impl PublishCommand { // validate config in QPKG matches { - let mut qpkg = ZipArchive::new(&mut cursor).context("Failed to read qpkg zip")?; - let qpkg_config = qpkg - .by_name("config.json") - .context("Failed to find config.json in qpkg")?; - let qpkg_config: PackageConfig = json::json_from_reader_fast(qpkg_config) - .context("Failed to parse config.json in qpkg")?; - - if qpkg_config != *package { + let mut zip_archive = + ZipArchive::new(&mut cursor).context("Failed to read qpkg zip")?; + // get qpkg in memory + let qpkg_file = zip_archive + .by_name(QPKG_JSON) + .with_context(|| format!("Failed to find {QPKG_JSON} in zip"))?; + + let qpkg: QPkg = json::json_from_reader_fast(qpkg_file) + .with_context(|| format!("Failed to read {QPKG_JSON} from zip"))?; + + if qpkg.config != *package { bail!( "QPKG config mismatch. Expected{:#?}\nGot {:#?}", package, - qpkg_config + qpkg.config ); } } From 1ecbc75bf8d92515c36890f1fa9f547477e20681 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:53:43 -0400 Subject: [PATCH 089/119] Add version override parameter --- src/commands/install.rs | 18 +++++++++++++++--- src/repository/local.rs | 12 ++++++++---- src/repository/qpackages.rs | 2 +- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/commands/install.rs b/src/commands/install.rs index 4ef404d..4e3552f 100644 --- a/src/commands/install.rs +++ b/src/commands/install.rs @@ -30,6 +30,10 @@ pub struct InstallCommand { #[clap(short = 'u', long = "url")] qpkg_url: Option, + /// Override the version of the qpkg to install + #[clap(long = "version")] + pub version_override: Option, + /// Whether to skip validation of the binaries #[clap(long, default_value = "false")] pub no_validate: bool, @@ -50,14 +54,22 @@ impl Command for InstallCommand { } impl InstallCommand { - fn qpkg_install(&self) -> Result<(), color_eyre::eyre::Error> { + fn qpkg_install(self) -> Result<(), color_eyre::eyre::Error> { + let version = self + .version_override + .map(|v| { + v.parse::() + .context("Failed to parse version override") + }) + .transpose()?; + let package = if let Some(qpkg_path) = &self.qpkg_path { println!("Installing qpkg from path: {}", qpkg_path.display()); let qpkg_file = File::open(qpkg_path).context("Failed to open qpkg file")?; let qpkg_file = BufReader::new(qpkg_file); - FileRepository::install_qpkg(qpkg_file, true).context("Installing qpkg zip failed")? + FileRepository::install_qpkg(qpkg_file, true, version).context("Installing qpkg zip failed")? } else if let Some(qpkg_url) = &self.qpkg_url { println!("Installing qpkg from URL: {qpkg_url}"); @@ -67,7 +79,7 @@ impl InstallCommand { let cursor = Cursor::new(bytes.get_ref()); - FileRepository::install_qpkg(cursor, true).context("Installing qpkg zip failed")? + FileRepository::install_qpkg(cursor, true, version).context("Installing qpkg zip failed")? } else { bail!("Either --path or --url must be provided to install a qpkg"); }; diff --git a/src/repository/local.rs b/src/repository/local.rs index 6f0dea8..f26a21a 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -232,7 +232,7 @@ impl FileRepository { fs::remove_file(Self::global_file_repository_path()) } - pub fn install_qpkg(buffer: T, overwrite_existing: bool) -> color_eyre::Result + pub fn install_qpkg(buffer: T, overwrite_existing: bool, version: Option) -> color_eyre::Result where T: Read + Seek, { @@ -244,9 +244,13 @@ impl FileRepository { .by_name(QPKG_JSON) .with_context(|| format!("Failed to find {QPKG_JSON} in zip"))?; - let qpkg: QPkg = json::json_from_reader_fast(qpkg_file) + let mut qpkg: QPkg = json::json_from_reader_fast(qpkg_file) .with_context(|| format!("Failed to read {QPKG_JSON} from zip"))?; + if let Some(version) = version { + qpkg.config.version = version; + } + let package_path: crate::models::package_files::PackageVersionPath = PackageIdPath::new(qpkg.config.id.clone()).version(qpkg.config.version.clone()); @@ -364,7 +368,7 @@ impl FileRepository { } // now write the package config to the src path - qpkg.config.write(&base_path).with_context(|| { + qpkg.config.write(&qpkg_file_dst).with_context(|| { format!( "Failed to write package config to {}", headers_dst.display().file_path_color() @@ -377,7 +381,7 @@ impl FileRepository { file_repo.write()?; // write the qpkg file to the src path - qpkg.write(&base_path).with_context(|| { + qpkg.write(&qpkg_file_dst).with_context(|| { format!( "Failed to write QPkg file to {}", headers_dst.display().file_path_color() diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 78925e3..68308d1 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -170,7 +170,7 @@ impl QPMRepository { } } - FileRepository::install_qpkg(cursor, false).with_context(|| { + FileRepository::install_qpkg(cursor, false, None).with_context(|| { format!( "QPackages QPKG installation from {}:{}", qpackage_config.config.id, qpackage_config.config.version From a34fc7bf5cb1c863613f1c18bd00c0cb3e7facf3 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:55:12 -0400 Subject: [PATCH 090/119] Revert to old registry temporarily --- src/repository/qpackages.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index 68308d1..db17239 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -30,7 +30,8 @@ use crate::{ use super::Repository; -const API_URL: &str = "https://2.qpackages.com"; +// const API_URL: &str = "https://2.qpackages.com"; +const API_URL: &str = "https://qpackages.com"; #[derive(Default)] pub struct QPMRepository {} From fc075450460553b5e78a5f7277993fe69e6f069b Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 7 Aug 2025 11:55:59 -0400 Subject: [PATCH 091/119] Fix and format --- src/commands/build.rs | 89 ++++++++++++++++---------------- src/commands/install.rs | 6 ++- src/models/config.rs | 3 +- src/models/package_files.rs | 5 +- src/repository/local.rs | 6 ++- src/repository/qpackages.rs | 1 - src/tests/commands/dependency.rs | 1 - src/utils/ndk.rs | 2 +- 8 files changed, 56 insertions(+), 57 deletions(-) diff --git a/src/commands/build.rs b/src/commands/build.rs index 5741a3b..f91b66e 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -72,55 +72,54 @@ impl Command for BuildCommand { let mut repo = repository::useful_default_new(self.offline)?; - let mut build_triplet = |triplet_id: &TripletId, - triplet: &PackageTriplet| - -> color_eyre::Result<()> { - let shared_triplet = shared_package - .locked_triplet - .get(triplet_id) - .context("Failed to get triplet settings")?; - - if shared_package.restored_triplet != *triplet_id { - println!( - "Restoring dependencies for triplet {}", - triplet_id.triplet_id_color() - ); - - // restore for triplet - let resolved_deps = - dependency::locked_resolve(&shared_package, &repo, shared_triplet)? - .collect_vec(); - - // now restore - dependency::restore(".", &shared_package, &resolved_deps, &mut repo)?; - shared_package.restored_triplet = triplet_id.clone(); - shared_package.write(".")?; - } + let mut build_triplet = + |triplet_id: &TripletId, triplet: &PackageTriplet| -> color_eyre::Result<()> { + let shared_triplet = shared_package + .locked_triplet + .get(triplet_id) + .context("Failed to get triplet settings")?; + + if shared_package.restored_triplet != *triplet_id { + println!( + "Restoring dependencies for triplet {}", + triplet_id.triplet_id_color() + ); + + // restore for triplet + let resolved_deps = + dependency::locked_resolve(&shared_package, &repo, shared_triplet)? + .collect_vec(); + + // now restore + dependency::restore(".", &shared_package, &resolved_deps, &mut repo)?; + shared_package.restored_triplet = triplet_id.clone(); + shared_package.write(".")?; + } - // run builld - if let Some(build_script) = &build_script { - println!( - "Building QPKG for triplet {}", - triplet_id.triplet_id_color() - ); - scripts::invoke_script(build_script, &args, &package, triplet_id)?; - } + // run builld + if let Some(build_script) = &build_script { + println!( + "Building QPKG for triplet {}", + triplet_id.triplet_id_color() + ); + scripts::invoke_script(build_script, &args, &package, triplet_id)?; + } - let triplet_dir = out_dir.join(&triplet_id.0); + let triplet_dir = out_dir.join(&triplet_id.0); - // now copy binaries - copy_bins( - &triplet_dir, - &triplet.out_binaries.clone().unwrap_or_default(), - )?; + // now copy binaries + copy_bins( + &triplet_dir, + &triplet.out_binaries.clone().unwrap_or_default(), + )?; - // finally qmod - if self.qmod { - zip::execute_qmod_zip_operation(Default::default(), vec![triplet_dir.clone()]) - .context("Making triplet qmod")?; - } - Ok(()) - }; + // finally qmod + if self.qmod { + zip::execute_qmod_zip_operation(Default::default(), vec![triplet_dir.clone()]) + .context("Making triplet qmod")?; + } + Ok(()) + }; match self.triplets { Some(triplets) => { diff --git a/src/commands/install.rs b/src/commands/install.rs index 4e3552f..1351287 100644 --- a/src/commands/install.rs +++ b/src/commands/install.rs @@ -69,7 +69,8 @@ impl InstallCommand { let qpkg_file = File::open(qpkg_path).context("Failed to open qpkg file")?; let qpkg_file = BufReader::new(qpkg_file); - FileRepository::install_qpkg(qpkg_file, true, version).context("Installing qpkg zip failed")? + FileRepository::install_qpkg(qpkg_file, true, version) + .context("Installing qpkg zip failed")? } else if let Some(qpkg_url) = &self.qpkg_url { println!("Installing qpkg from URL: {qpkg_url}"); @@ -79,7 +80,8 @@ impl InstallCommand { let cursor = Cursor::new(bytes.get_ref()); - FileRepository::install_qpkg(cursor, true, version).context("Installing qpkg zip failed")? + FileRepository::install_qpkg(cursor, true, version) + .context("Installing qpkg zip failed")? } else { bail!("Either --path or --url must be provided to install a qpkg"); }; diff --git a/src/models/config.rs b/src/models/config.rs index 0ac8d6c..f505a5f 100644 --- a/src/models/config.rs +++ b/src/models/config.rs @@ -175,8 +175,7 @@ pub fn ndk_default_path() -> PathBuf { // C:\Users\\AppData\Local\Android\Sdk\ndk\* } - #[cfg(not(windows))] pub fn ndk_default_path() -> PathBuf { dirs::data_dir().unwrap().join("QPM-RS2").join("ndk") -} \ No newline at end of file +} diff --git a/src/models/package_files.rs b/src/models/package_files.rs index aa9bff8..e4a38aa 100644 --- a/src/models/package_files.rs +++ b/src/models/package_files.rs @@ -3,10 +3,7 @@ use std::{ path::{Path, PathBuf}, }; -use qpm_package::models::{ - package::DependencyId, - triplet::TripletId, -}; +use qpm_package::models::{package::DependencyId, triplet::TripletId}; use semver::Version; use crate::models::config::UserConfig; diff --git a/src/repository/local.rs b/src/repository/local.rs index f26a21a..e5decd4 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -232,7 +232,11 @@ impl FileRepository { fs::remove_file(Self::global_file_repository_path()) } - pub fn install_qpkg(buffer: T, overwrite_existing: bool, version: Option) -> color_eyre::Result + pub fn install_qpkg( + buffer: T, + overwrite_existing: bool, + version: Option, + ) -> color_eyre::Result where T: Read + Seek, { diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index db17239..d7e9293 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -15,7 +15,6 @@ use serde::Deserialize; use qpm_package::models::{ package::{DependencyId, PackageConfig}, qpackages::{QPackagesPackage, QPackagesVersion}, - shared_package::SharedPackageConfig, }; use crate::{ diff --git a/src/tests/commands/dependency.rs b/src/tests/commands/dependency.rs index 5bba26b..e7c6f51 100644 --- a/src/tests/commands/dependency.rs +++ b/src/tests/commands/dependency.rs @@ -91,4 +91,3 @@ fn test_dependency_download_specific() -> color_eyre::Result<()> { Ok(()) } - diff --git a/src/utils/ndk.rs b/src/utils/ndk.rs index 9d9bb91..8173b56 100644 --- a/src/utils/ndk.rs +++ b/src/utils/ndk.rs @@ -1,7 +1,7 @@ use std::path::PathBuf; use itertools::Itertools; -use qpm_package::models::{package::PackageConfig, triplet::PackageTriplet}; +use qpm_package::models::triplet::PackageTriplet; use semver::Version; use crate::models::config::get_combine_config; From 59004af6e1c32c5623a33fb754bc9de0e3dd9434 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 7 Aug 2025 16:21:58 -0400 Subject: [PATCH 092/119] Add NDK resolution support to build and QPkg commands --- src/commands/build.rs | 24 +++++++++++++++++++++++- src/commands/ndk.rs | 9 +++++---- src/commands/qpkg.rs | 5 +++++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/commands/build.rs b/src/commands/build.rs index f91b66e..5d98c2e 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -13,7 +13,11 @@ use qpm_package::{ }; use crate::{ - commands::{qmod::zip, scripts}, + commands::{ + ndk::{Ndk, PinArgs, ResolveArgs}, + qmod::zip, + scripts, + }, models::package::PackageConfigExtensions, repository::{self, local::FileRepository}, resolver::dependency, @@ -46,6 +50,10 @@ pub struct BuildCommand { /// The build script to run for each triplet #[clap(long)] pub build_script: Option, + + /// If to resolve NDK dependencies + #[clap(long, default_value = "false")] + pub ndk_resolve: bool, } impl Command for BuildCommand { @@ -94,6 +102,20 @@ impl Command for BuildCommand { dependency::restore(".", &shared_package, &resolved_deps, &mut repo)?; shared_package.restored_triplet = triplet_id.clone(); shared_package.write(".")?; + + if self.ndk_resolve { + let ndk = Ndk { + op: crate::commands::ndk::NdkOperation::Resolve(ResolveArgs { + download: true, + ignore_missing: false, + }), + triplet: Some(triplet_id.0.clone()), + quiet: false, + }; + + ndk.execute() + .context("Failed to resolve NDK dependencies")?; + } } // run builld diff --git a/src/commands/ndk.rs b/src/commands/ndk.rs index 5c497c6..65c1454 100644 --- a/src/commands/ndk.rs +++ b/src/commands/ndk.rs @@ -40,11 +40,11 @@ pub struct Ndk { /// The triplet to use for the operation #[clap(long, short, global = true)] - triplet: Option, + pub triplet: Option, /// If true, does not print progress #[clap(long, short, global = true, default_value = "false")] - quiet: bool, + pub quiet: bool, } #[derive(Subcommand, Debug, Clone)] @@ -90,10 +90,11 @@ pub struct PinArgs { pub struct ResolveArgs { /// Download package if necessary #[clap(short, long, default_value = "false")] - download: bool, + pub download: bool, + // Ignore missing package #[clap(short, long, default_value = "false")] - ignore_missing: bool, + pub ignore_missing: bool, } fn fuzzy_match_ndk<'a>( diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 61e31cc..0cebe64 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -50,6 +50,10 @@ pub struct QPkgCommand { /// Where to output the QPKG file pub qpkg_output: Option, + + /// Whether to resolve NDK + #[clap(long, default_value = "false")] + pub resolve_ndk: bool, } impl Command for QPkgCommand { @@ -69,6 +73,7 @@ impl Command for QPkgCommand { out_dir: Some(build_dir.clone()), qmod: self.qmod, build_script: None, + ndk_resolve: self.resolve_ndk, }; command.execute().context("Failed to build qpkg")?; From 0930fa878646b16605e98c9db14e0ceb5cab9c8e Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 7 Aug 2025 16:51:36 -0400 Subject: [PATCH 093/119] Fix value --- src/commands/publish.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/commands/publish.rs b/src/commands/publish.rs index a7bad9e..fc00514 100644 --- a/src/commands/publish.rs +++ b/src/commands/publish.rs @@ -26,6 +26,7 @@ use super::Command; #[derive(ValueEnum, Debug, Clone)] enum Backend { + #[clap(name = "qpackages")] QPackages, } From 9922abdb185f40379a4c50ca1c255ab5c4123b40 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Tue, 19 Aug 2025 15:19:09 -0400 Subject: [PATCH 094/119] Make all triplets inherit `base` and allow for specifying `default` triplet to restore --- Cargo.lock | 280 +++++++++++++++++---------------- src/commands/build.rs | 2 +- src/commands/dependency.rs | 4 +- src/commands/package/format.rs | 6 +- src/commands/restore.rs | 6 +- src/commands/scripts.rs | 7 +- src/models/package.rs | 6 +- src/resolver/dependency.rs | 42 ++--- 8 files changed, 180 insertions(+), 173 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b2e2774..d96e1e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -49,9 +49,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -79,35 +79,35 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" dependencies = [ "derive_arbitrary", ] @@ -204,9 +204,9 @@ checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29" [[package]] name = "block-buffer" @@ -219,9 +219,9 @@ dependencies = [ [[package]] name = "brotli" -version = "8.0.1" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -278,9 +278,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.31" +version = "1.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" +checksum = "3ee0f8803222ba5a7e2777dd72ca451868909b1ac410621b676adf07280e9b5f" dependencies = [ "jobserver", "libc", @@ -289,9 +289,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "9aeec81361cbe5564f44e79538fc112002f70a448966f9160591c2bd5706dfad" [[package]] name = "cfg_aliases" @@ -301,9 +301,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "clap" -version = "4.5.42" +version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed87a9d530bb41a67537289bafcac159cb3ee28460e0a4571123d2a778a6a882" +checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318" dependencies = [ "clap_builder", "clap_derive", @@ -311,9 +311,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.42" +version = "4.5.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f4f3f3c77c94aff3c7e9aac9a2ca1974a5adf392a8bb751e827d6d127ab966" +checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" dependencies = [ "anstream", "anstyle", @@ -323,23 +323,23 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.55" +version = "4.5.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5abde44486daf70c5be8b8f8f1b66c49f86236edf6fa2abadb4d961c4c6229a" +checksum = "4d9501bd3f5f09f7bbee01da9a511073ed30a80cd7a509f1214bb74eadea71ad" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "4.5.41" +version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -493,13 +493,13 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -547,7 +547,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -827,20 +827,20 @@ dependencies = [ "gix-worktree-state", "once_cell", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] name = "gix-actor" -version = "0.35.3" +version = "0.35.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1b1ec302f8dc059df125ed46dfdc7e9d33fe7724df19843aea53b5ffd32d5bb" +checksum = "2d36dcf9efe32b51b12dfa33cedff8414926124e760a32f9e7a6b5580d280967" dependencies = [ "bstr", "gix-date", "gix-utils", "itoa", - "thiserror 2.0.12", + "thiserror 2.0.15", "winnow", ] @@ -857,7 +857,7 @@ dependencies = [ "gix-trace", "kstring", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.15", "unicode-bom", ] @@ -867,7 +867,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1db9765c69502650da68f0804e3dc2b5f8ccc6a2d104ca6c85bc40700d37540" dependencies = [ - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -876,7 +876,7 @@ version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b1f1d8764958699dc764e3f727cef280ff4d1bd92c107bbf8acd85b30c1bd6f" dependencies = [ - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -902,7 +902,7 @@ dependencies = [ "gix-chunk", "gix-hash", "memmap2", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -921,7 +921,7 @@ dependencies = [ "memchr", "once_cell", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.15", "unicode-bom", "winnow", ] @@ -936,7 +936,7 @@ dependencies = [ "bstr", "gix-path", "libc", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -954,20 +954,20 @@ dependencies = [ "gix-sec", "gix-trace", "gix-url", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] name = "gix-date" -version = "0.10.4" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "467254054f8df1e85b5f73cb910602767b0122391d994302a091841ba43edfaa" +checksum = "996b6b90bafb287330af92b274c3e64309dc78359221d8612d11cd10c8b9fe1c" dependencies = [ "bstr", "itoa", "jiff", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -979,7 +979,7 @@ dependencies = [ "bstr", "gix-hash", "gix-object", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -995,7 +995,7 @@ dependencies = [ "gix-path", "gix-ref", "gix-sec", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1013,7 +1013,7 @@ dependencies = [ "libc", "once_cell", "prodash", - "thiserror 2.0.12", + "thiserror 2.0.15", "walkdir", ] @@ -1035,21 +1035,21 @@ dependencies = [ "gix-trace", "gix-utils", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] name = "gix-fs" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d793f71e955d18f228d20ec433dcce6d0e8577efcdfd11d72d09d7cc2758dfd1" +checksum = "9a4d90307d064fa7230e0f87b03231be28f8ba63b913fc15346f489519d0c304" dependencies = [ "bstr", "fastrand", "gix-features", "gix-path", "gix-utils", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1073,7 +1073,7 @@ dependencies = [ "faster-hex", "gix-features", "sha1-checked", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1125,7 +1125,7 @@ dependencies = [ "memmap2", "rustix", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1136,7 +1136,7 @@ checksum = "b9fa71da90365668a621e184eb5b979904471af1b3b09b943a84bc50e8ad42ed" dependencies = [ "gix-tempfile", "gix-utils", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1152,14 +1152,14 @@ dependencies = [ "gix-object", "gix-revwalk", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] name = "gix-object" -version = "0.50.1" +version = "0.50.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aff2047f96d57bcc721426e11ec0f9efeb432d5e6ef5f1aa84cfc55198971dca" +checksum = "d69ce108ab67b65fbd4fb7e1331502429d78baeb2eee10008bdef55765397c07" dependencies = [ "bstr", "gix-actor", @@ -1172,7 +1172,7 @@ dependencies = [ "gix-validate", "itoa", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.15", "winnow", ] @@ -1194,7 +1194,7 @@ dependencies = [ "gix-quote", "parking_lot", "tempfile", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1214,7 +1214,7 @@ dependencies = [ "memmap2", "parking_lot", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1226,7 +1226,7 @@ dependencies = [ "bstr", "faster-hex", "gix-trace", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1238,7 +1238,7 @@ dependencies = [ "bstr", "faster-hex", "gix-trace", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1252,7 +1252,7 @@ dependencies = [ "gix-validate", "home", "once_cell", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1267,7 +1267,7 @@ dependencies = [ "gix-config-value", "gix-glob", "gix-path", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1280,7 +1280,7 @@ dependencies = [ "gix-config-value", "parking_lot", "rustix", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1305,7 +1305,7 @@ dependencies = [ "gix-transport", "gix-utils", "maybe-async", - "thiserror 2.0.12", + "thiserror 2.0.15", "winnow", ] @@ -1317,14 +1317,14 @@ checksum = "4a375a75b4d663e8bafe3bf4940a18a23755644c13582fa326e99f8f987d83fd" dependencies = [ "bstr", "gix-utils", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] name = "gix-ref" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b7a23209d4e4cbdc2086d294f5f3f8707ac6286768847024d952d8cd3278c5b" +checksum = "b966f578079a42f4a51413b17bce476544cca1cf605753466669082f94721758" dependencies = [ "gix-actor", "gix-features", @@ -1337,7 +1337,7 @@ dependencies = [ "gix-utils", "gix-validate", "memmap2", - "thiserror 2.0.12", + "thiserror 2.0.15", "winnow", ] @@ -1352,7 +1352,7 @@ dependencies = [ "gix-revision", "gix-validate", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1367,7 +1367,7 @@ dependencies = [ "gix-hash", "gix-object", "gix-revwalk", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1382,7 +1382,7 @@ dependencies = [ "gix-hashtable", "gix-object", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1406,7 +1406,7 @@ dependencies = [ "bstr", "gix-hash", "gix-lock", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1421,7 +1421,7 @@ dependencies = [ "gix-pathspec", "gix-refspec", "gix-url", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1459,7 +1459,7 @@ dependencies = [ "gix-sec", "gix-url", "reqwest", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1476,7 +1476,7 @@ dependencies = [ "gix-object", "gix-revwalk", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1489,7 +1489,7 @@ dependencies = [ "gix-features", "gix-path", "percent-encoding", - "thiserror 2.0.12", + "thiserror 2.0.15", "url", ] @@ -1510,7 +1510,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77b9e00cacde5b51388d28ed746c493b18a6add1f19b5e01d686b3b9ece66d4d" dependencies = [ "bstr", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1549,7 +1549,7 @@ dependencies = [ "gix-path", "gix-worktree", "io-close", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -1578,9 +1578,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", @@ -1606,9 +1606,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", @@ -1688,19 +1688,21 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "h2", "http", "http-body", "httparse", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -1874,9 +1876,9 @@ dependencies = [ [[package]] name = "indenter" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" [[package]] name = "indexmap" @@ -1969,7 +1971,7 @@ checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2034,21 +2036,21 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libbz2-rs-sys" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775bf80d5878ab7c2b1080b5351a48b2f737d9f6f8b383574eebcc22be0dfccb" +checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "liblzma" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0791ab7e08ccc8e0ce893f6906eb2703ed8739d8e89b57c0714e71bad09024c8" +checksum = "272b875472a046e39ff7408374a5a050b112d2142211a0f54a295c0bd1c3c757" dependencies = [ "liblzma-sys", ] @@ -2149,7 +2151,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2411,9 +2413,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -2437,7 +2439,7 @@ dependencies = [ "log", "priority-queue", "rustc-hash", - "thiserror 2.0.12", + "thiserror 2.0.15", "version-ranges", ] @@ -2494,7 +2496,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#1e3cc0a45218d384f946ec22af6404d80c0c706b" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#da354a5e13b7208bfff05874f2d72e551d5e5ff7" dependencies = [ "cursed-semver-parser", "schemars", @@ -2528,7 +2530,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.5.10", - "thiserror 2.0.12", + "thiserror 2.0.15", "tokio", "tracing", "web-time", @@ -2549,7 +2551,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.15", "tinyvec", "tracing", "web-time", @@ -2630,7 +2632,7 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.12", + "thiserror 2.0.15", ] [[package]] @@ -2670,9 +2672,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.22" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "async-compression", "base64", @@ -2789,9 +2791,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -2830,7 +2832,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2877,7 +2879,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2888,14 +2890,14 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.142" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ "itoa", "memchr", @@ -2976,9 +2978,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" @@ -3049,9 +3051,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.104" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -3075,7 +3077,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3125,7 +3127,7 @@ dependencies = [ "regex", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.15", "walkdir", ] @@ -3146,11 +3148,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "80d76d3f064b981389ecb4b6b7f45a0bf9fdac1d5b9204c7bd6714fecc302850" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.15", ] [[package]] @@ -3161,18 +3163,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "44d29feb33e986b6ea906bd9c3559a856983f92371b3eaa5e83782a351623de0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3229,9 +3231,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -3528,7 +3530,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-shared", ] @@ -3563,7 +3565,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3878,7 +3880,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] @@ -3899,7 +3901,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3919,7 +3921,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] @@ -3942,9 +3944,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -3959,7 +3961,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] diff --git a/src/commands/build.rs b/src/commands/build.rs index 5d98c2e..6a25fb4 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -14,7 +14,7 @@ use qpm_package::{ use crate::{ commands::{ - ndk::{Ndk, PinArgs, ResolveArgs}, + ndk::{Ndk, ResolveArgs}, qmod::zip, scripts, }, diff --git a/src/commands/dependency.rs b/src/commands/dependency.rs index b8dd463..bcc78ff 100644 --- a/src/commands/dependency.rs +++ b/src/commands/dependency.rs @@ -165,7 +165,7 @@ fn put_dependency( .specific_triplets .get_mut(triplet) .context("Triplet not found")?, - None => &mut package.triplets.default, + None => &mut package.triplets.base, }; let existing_dep = triplet.dependencies.get(id); @@ -199,7 +199,7 @@ fn remove_dependency(dependency_args: DependencyOperationRemoveArgs) -> Result<( .specific_triplets .get_mut(&TripletId(triplet)) .context("Triplet not found")?, - None => &mut package.triplets.default, + None => &mut package.triplets.base, }; triplet diff --git a/src/commands/package/format.rs b/src/commands/package/format.rs index 5c1af27..30fd499 100644 --- a/src/commands/package/format.rs +++ b/src/commands/package/format.rs @@ -2,9 +2,7 @@ use std::fs; use clap::Args; use color_eyre::{Result, eyre::ContextCompat}; -use qpm_package::models::{ - package::PackageConfig, shared_package::SharedPackageConfig, triplet::default_triplet_id, -}; +use qpm_package::models::{package::PackageConfig, shared_package::SharedPackageConfig, triplet::base_triplet_id}; use crate::{commands::Command, models::package::PackageConfigExtensions}; @@ -27,7 +25,7 @@ pub fn reserialize_package(sort: bool) -> Result<()> { let mut package = PackageConfig::read(".")?; let triplet = package .triplets - .get_triplet_standalone_mut(&default_triplet_id()) + .get_triplet_standalone_mut(&base_triplet_id()) .context("Failed to get triplet settings")?; if sort { diff --git a/src/commands/restore.rs b/src/commands/restore.rs index 50784d6..5c552f1 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -177,7 +177,11 @@ fn is_modified( let Some(locked_dep) = locked_triplet.restored_dependencies.get(dep_id) else { return true; }; - if dep.triplet.clone().unwrap_or_default() != locked_dep.restored_triplet { + if dep + .triplet + .as_ref() + .is_some_and(|t| *t != locked_dep.restored_triplet) + { return true; } if !dep.version_range.matches(&locked_dep.restored_version) { diff --git a/src/commands/scripts.rs b/src/commands/scripts.rs index 5bdb7c8..878fc82 100644 --- a/src/commands/scripts.rs +++ b/src/commands/scripts.rs @@ -5,10 +5,7 @@ use clap::Args; use color_eyre::eyre::{ContextCompat, anyhow, bail}; use itertools::Itertools; use qpm_arg_tokenizer::arg::Expression; -use qpm_package::models::{ - package::PackageConfig, - triplet::{TripletId, default_triplet_id}, -}; +use qpm_package::models::{package::PackageConfig, triplet::{base_triplet_id, TripletId}}; use crate::{models::package::PackageConfigExtensions, utils::ndk}; @@ -38,7 +35,7 @@ impl Command for ScriptsCommand { let supplied_args = self.args.unwrap_or_default(); - let triplet_id = self.triplet.map(TripletId).unwrap_or(default_triplet_id()); + let triplet_id = self.triplet.map(TripletId).unwrap_or(base_triplet_id()); invoke_script(script, &supplied_args, &package, &triplet_id)?; diff --git a/src/models/package.rs b/src/models/package.rs index 46b8c42..c58f36a 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -9,9 +9,9 @@ use itertools::Itertools; use qpm_package::models::{ package::{DependencyId, PackageConfig, QPM_JSON}, shared_package::{ - QPM_SHARED_JSON, SharedPackageConfig, SharedTriplet, SharedTripletDependencyInfo, + SharedPackageConfig, SharedTriplet, SharedTripletDependencyInfo, QPM_SHARED_JSON }, - triplet::{PackageTriplet, PackageTripletDependency, TripletId, default_triplet_id}, + triplet::{base_triplet_id, PackageTriplet, PackageTripletDependency, TripletId}, }; use qpm_qmod::models::mod_json::{ModDependency, ModJson}; use semver::VersionReq; @@ -231,7 +231,7 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { let shared_package_config = SharedPackageConfig { config, - restored_triplet: triplet.unwrap_or(default_triplet_id()), + restored_triplet: triplet.unwrap_or(base_triplet_id()), locked_triplet, }; Ok((shared_package_config, triplet_dependencies)) diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index 9dea334..7745453 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -23,7 +23,7 @@ use pubgrub::{ use qpm_package::models::{ package::{DependencyId, PackageConfig}, shared_package::{SharedPackageConfig, SharedTriplet}, - triplet::{PackageTriplet, TripletId}, + triplet::{PackageTriplet, TripletId, base_triplet_id}, }; /// Represents a resolved dependency @@ -50,15 +50,15 @@ where repo: &'b R, } #[derive(Clone, Debug, Eq, PartialEq, Hash)] -pub struct PubgrubDependencyTarget(pub DependencyId, pub TripletId); +pub struct PubgrubDependencyTarget(pub DependencyId, pub Option); impl Display for PubgrubDependencyTarget { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!( f, - "{}:{}", + "{}:{:?}", self.0.0.dependency_id_color(), - self.1.0.triplet_id_color() + self.1.triplet_id_color() ) } } @@ -96,14 +96,14 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> ) -> Result, PubgrubErrorWrapper> { // Root dependencies if package_triplet.0 == self.root.id - && package_triplet.1 == *self.root_triplet + && package_triplet.1.as_ref() == Some(self.root_triplet) && version == &self.root.version { // resolve dependencies of root let triplet = self .root .triplets - .get_triplet_settings(&package_triplet.1) + .get_triplet_settings(self.root_triplet) .expect("Root triplet should always exist in the root package's triplets"); let deps = triplet @@ -112,10 +112,7 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> // add dev dependencies as well .chain(triplet.dev_dependencies.iter()) .map(|(dep_id, dep)| { - let pubgrub_dep = PubgrubDependencyTarget( - dep_id.clone(), - dep.triplet.clone().unwrap_or_default(), - ); + let pubgrub_dep = PubgrubDependencyTarget(dep_id.clone(), dep.triplet.clone()); let range = req_to_range(dep.version_range.clone()); (pubgrub_dep, range) @@ -132,13 +129,20 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> format!("Could not find package {package_triplet} with version {version}") })?; + let base_triplet_id = base_triplet_id(); + let target_triplet_id = package_triplet + .1 + .as_ref() + .or(target_pkg.triplets.default.as_ref()) + .unwrap_or(&base_triplet_id); + let target_triplet = target_pkg .triplets - .get_triplet_settings(&package_triplet.1) + .get_triplet_settings(target_triplet_id) .with_context(|| { format!( "Could not find triplet {} for package {}", - package_triplet.1.triplet_id_color(), + target_triplet_id.triplet_id_color(), package_triplet.0.dependency_id_color() ) })?; @@ -147,10 +151,7 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> .dependencies .iter() .map(|(dep_id, dep)| { - let id = PubgrubDependencyTarget( - dep_id.clone(), - dep.triplet.clone().unwrap_or_default(), - ); + let id = PubgrubDependencyTarget(dep_id.clone(), dep.triplet.clone()); let range = req_to_range(dep.version_range.clone()); (id, range) }) @@ -225,7 +226,7 @@ pub fn resolve<'a>( repo: repository, }; let time = Instant::now(); - let target = PubgrubDependencyTarget(root.id.clone(), triplet.clone()); + let target = PubgrubDependencyTarget(root.id.clone(), Some(triplet.clone())); let result = match pubgrub::resolve(&resolver, target, root.version.clone()) { Ok(deps) => Ok(deps.into_iter().filter_map(move |(id, version)| { if id.0 == root.id && version == root.version { @@ -235,7 +236,12 @@ pub fn resolve<'a>( let package = repository .get_package(&id.0, &version.into()) .expect("Failed to get package")?; - Some(ResolvedDependency(package, id.1)) + + let triplet = + id.1.or(package.triplets.default.clone()) + .unwrap_or(base_triplet_id()); + + Some(ResolvedDependency(package, triplet)) })), Err(PubGrubError::NoSolution(tree)) => { From 07add7f7c684e38eb585e2f2a342b12b40e48bc9 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Wed, 20 Aug 2025 11:06:39 -0400 Subject: [PATCH 095/119] Update dependencies --- Cargo.lock | 116 ++++++++++++++++++++++++++--------------------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d96e1e3..cf7c170 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -289,9 +289,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aeec81361cbe5564f44e79538fc112002f70a448966f9160591c2bd5706dfad" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -827,7 +827,7 @@ dependencies = [ "gix-worktree-state", "once_cell", "smallvec", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -840,7 +840,7 @@ dependencies = [ "gix-date", "gix-utils", "itoa", - "thiserror 2.0.15", + "thiserror 2.0.16", "winnow", ] @@ -857,7 +857,7 @@ dependencies = [ "gix-trace", "kstring", "smallvec", - "thiserror 2.0.15", + "thiserror 2.0.16", "unicode-bom", ] @@ -867,7 +867,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1db9765c69502650da68f0804e3dc2b5f8ccc6a2d104ca6c85bc40700d37540" dependencies = [ - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -876,7 +876,7 @@ version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b1f1d8764958699dc764e3f727cef280ff4d1bd92c107bbf8acd85b30c1bd6f" dependencies = [ - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -902,7 +902,7 @@ dependencies = [ "gix-chunk", "gix-hash", "memmap2", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -921,7 +921,7 @@ dependencies = [ "memchr", "once_cell", "smallvec", - "thiserror 2.0.15", + "thiserror 2.0.16", "unicode-bom", "winnow", ] @@ -936,7 +936,7 @@ dependencies = [ "bstr", "gix-path", "libc", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -954,7 +954,7 @@ dependencies = [ "gix-sec", "gix-trace", "gix-url", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -967,7 +967,7 @@ dependencies = [ "itoa", "jiff", "smallvec", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -979,7 +979,7 @@ dependencies = [ "bstr", "gix-hash", "gix-object", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -995,7 +995,7 @@ dependencies = [ "gix-path", "gix-ref", "gix-sec", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1013,7 +1013,7 @@ dependencies = [ "libc", "once_cell", "prodash", - "thiserror 2.0.15", + "thiserror 2.0.16", "walkdir", ] @@ -1035,7 +1035,7 @@ dependencies = [ "gix-trace", "gix-utils", "smallvec", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1049,7 +1049,7 @@ dependencies = [ "gix-features", "gix-path", "gix-utils", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1073,7 +1073,7 @@ dependencies = [ "faster-hex", "gix-features", "sha1-checked", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1125,7 +1125,7 @@ dependencies = [ "memmap2", "rustix", "smallvec", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1136,7 +1136,7 @@ checksum = "b9fa71da90365668a621e184eb5b979904471af1b3b09b943a84bc50e8ad42ed" dependencies = [ "gix-tempfile", "gix-utils", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1152,7 +1152,7 @@ dependencies = [ "gix-object", "gix-revwalk", "smallvec", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1172,7 +1172,7 @@ dependencies = [ "gix-validate", "itoa", "smallvec", - "thiserror 2.0.15", + "thiserror 2.0.16", "winnow", ] @@ -1194,7 +1194,7 @@ dependencies = [ "gix-quote", "parking_lot", "tempfile", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1214,7 +1214,7 @@ dependencies = [ "memmap2", "parking_lot", "smallvec", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1226,7 +1226,7 @@ dependencies = [ "bstr", "faster-hex", "gix-trace", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1238,7 +1238,7 @@ dependencies = [ "bstr", "faster-hex", "gix-trace", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1252,7 +1252,7 @@ dependencies = [ "gix-validate", "home", "once_cell", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1267,7 +1267,7 @@ dependencies = [ "gix-config-value", "gix-glob", "gix-path", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1280,7 +1280,7 @@ dependencies = [ "gix-config-value", "parking_lot", "rustix", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1305,7 +1305,7 @@ dependencies = [ "gix-transport", "gix-utils", "maybe-async", - "thiserror 2.0.15", + "thiserror 2.0.16", "winnow", ] @@ -1317,7 +1317,7 @@ checksum = "4a375a75b4d663e8bafe3bf4940a18a23755644c13582fa326e99f8f987d83fd" dependencies = [ "bstr", "gix-utils", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1337,7 +1337,7 @@ dependencies = [ "gix-utils", "gix-validate", "memmap2", - "thiserror 2.0.15", + "thiserror 2.0.16", "winnow", ] @@ -1352,7 +1352,7 @@ dependencies = [ "gix-revision", "gix-validate", "smallvec", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1367,7 +1367,7 @@ dependencies = [ "gix-hash", "gix-object", "gix-revwalk", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1382,7 +1382,7 @@ dependencies = [ "gix-hashtable", "gix-object", "smallvec", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1406,7 +1406,7 @@ dependencies = [ "bstr", "gix-hash", "gix-lock", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1421,7 +1421,7 @@ dependencies = [ "gix-pathspec", "gix-refspec", "gix-url", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1459,7 +1459,7 @@ dependencies = [ "gix-sec", "gix-url", "reqwest", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1476,7 +1476,7 @@ dependencies = [ "gix-object", "gix-revwalk", "smallvec", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1489,7 +1489,7 @@ dependencies = [ "gix-features", "gix-path", "percent-encoding", - "thiserror 2.0.15", + "thiserror 2.0.16", "url", ] @@ -1510,7 +1510,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77b9e00cacde5b51388d28ed746c493b18a6add1f19b5e01d686b3b9ece66d4d" dependencies = [ "bstr", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -1549,7 +1549,7 @@ dependencies = [ "gix-path", "gix-worktree", "io-close", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -2439,7 +2439,7 @@ dependencies = [ "log", "priority-queue", "rustc-hash", - "thiserror 2.0.15", + "thiserror 2.0.16", "version-ranges", ] @@ -2530,7 +2530,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.5.10", - "thiserror 2.0.15", + "thiserror 2.0.16", "tokio", "tracing", "web-time", @@ -2551,7 +2551,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.15", + "thiserror 2.0.16", "tinyvec", "tracing", "web-time", @@ -2632,7 +2632,7 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.15", + "thiserror 2.0.16", ] [[package]] @@ -3103,15 +3103,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.20.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -3127,7 +3127,7 @@ dependencies = [ "regex", "serde", "serde_json", - "thiserror 2.0.15", + "thiserror 2.0.16", "walkdir", ] @@ -3148,11 +3148,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.15" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d76d3f064b981389ecb4b6b7f45a0bf9fdac1d5b9204c7bd6714fecc302850" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "thiserror-impl 2.0.15", + "thiserror-impl 2.0.16", ] [[package]] @@ -3168,9 +3168,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.15" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d29feb33e986b6ea906bd9c3559a856983f92371b3eaa5e83782a351623de0" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", @@ -3626,11 +3626,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] From 9f93526065f20e3a38ccb622b9bf5718bbf6f213 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 21 Aug 2025 09:38:59 -0400 Subject: [PATCH 096/119] Update migrate script --- migrate.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/migrate.ts b/migrate.ts index c84a98d..5823ab0 100644 --- a/migrate.ts +++ b/migrate.ts @@ -107,8 +107,9 @@ interface QPM2 { license?: string; }; triplets: { - default: QPM2Triplet; - [key: string]: QPM2Triplet; + default?: string; + base: QPM2Triplet + [key: string]: QPM2Triplet | string | undefined; }; configVersion: string; toolchainOut: string; @@ -171,7 +172,8 @@ const qpm2: QPM2 = { license: "", }, triplets: { - default: { + default: "base", + base: { dependencies: dependencies, devDependencies: devDependencies, compileOptions: qpm1.info.additionalData?.compileOptions, From c35904bd4b1862ee1307f37ac7871dfe734972e8 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 21 Aug 2025 09:48:43 -0400 Subject: [PATCH 097/119] Slightly improve dependency resolving triplets --- src/resolver/dependency.rs | 48 ++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index 7745453..458b419 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -52,6 +52,12 @@ where #[derive(Clone, Debug, Eq, PartialEq, Hash)] pub struct PubgrubDependencyTarget(pub DependencyId, pub Option); +impl PubgrubDependencyTarget { + pub fn get_triplet<'a>(&'a self, package: &'a PackageConfig) -> Option<&'a TripletId> { + self.1.as_ref().or(package.triplets.default.as_ref()) + } +} + impl Display for PubgrubDependencyTarget { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!( @@ -91,12 +97,12 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> fn get_dependencies( &self, - package_triplet: &PubgrubDependencyTarget, + pubgrub_target: &PubgrubDependencyTarget, version: &VersionWrapper, ) -> Result, PubgrubErrorWrapper> { // Root dependencies - if package_triplet.0 == self.root.id - && package_triplet.1.as_ref() == Some(self.root_triplet) + if pubgrub_target.0 == self.root.id + && pubgrub_target.1.as_ref() == Some(self.root_triplet) && version == &self.root.version { // resolve dependencies of root @@ -124,17 +130,18 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> // Find dependencies of dependencies let target_pkg = self .repo - .get_package(&package_triplet.0, &version.clone().into())? + .get_package(&pubgrub_target.0, &version.clone().into())? .with_context(|| { - format!("Could not find package {package_triplet} with version {version}") + format!("Could not find package {pubgrub_target} with version {version}") })?; - let base_triplet_id = base_triplet_id(); - let target_triplet_id = package_triplet - .1 - .as_ref() - .or(target_pkg.triplets.default.as_ref()) - .unwrap_or(&base_triplet_id); + let Some(target_triplet_id) = pubgrub_target.get_triplet(&target_pkg) else { + return Ok(Dependencies::Unavailable(format!( + "No triplet specified for the package {}:{}", + pubgrub_target.0.dependency_id_color(), + version.version_id_color() + ))); + }; let target_triplet = target_pkg .triplets @@ -143,7 +150,7 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> format!( "Could not find triplet {} for package {}", target_triplet_id.triplet_id_color(), - package_triplet.0.dependency_id_color() + pubgrub_target.0.dependency_id_color() ) })?; @@ -226,20 +233,21 @@ pub fn resolve<'a>( repo: repository, }; let time = Instant::now(); - let target = PubgrubDependencyTarget(root.id.clone(), Some(triplet.clone())); - let result = match pubgrub::resolve(&resolver, target, root.version.clone()) { - Ok(deps) => Ok(deps.into_iter().filter_map(move |(id, version)| { - if id.0 == root.id && version == root.version { + let root_target = PubgrubDependencyTarget(root.id.clone(), Some(triplet.clone())); + let result = match pubgrub::resolve(&resolver, root_target, root.version.clone()) { + Ok(deps) => Ok(deps.into_iter().filter_map(move |(target, version)| { + if target.0 == root.id && version == root.version { return None; } let package = repository - .get_package(&id.0, &version.into()) + .get_package(&target.0, &version.into()) .expect("Failed to get package")?; - let triplet = - id.1.or(package.triplets.default.clone()) - .unwrap_or(base_triplet_id()); + let triplet = target + .get_triplet(&package) + .cloned() + .expect("Triplet should always be specified for resolved dependencies"); Some(ResolvedDependency(package, triplet)) })), From 49e3f0c16e4bcb2fbcf1c080d1aed6aec48003ba Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 21 Aug 2025 09:49:55 -0400 Subject: [PATCH 098/119] Update dependencies --- Cargo.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cf7c170..7e1749f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -627,14 +627,14 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "filetime" -version = "0.2.25" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -671,9 +671,9 @@ checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -1839,9 +1839,9 @@ dependencies = [ [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -2309,9 +2309,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project-lite" @@ -3411,9 +3411,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "ec961601b32b6f5d14ae8dabd35ff2ff2e2c6cb4c0e6641845ff105abe96d958" dependencies = [ "form_urlencoded", "idna", @@ -3966,9 +3966,9 @@ dependencies = [ [[package]] name = "zip" -version = "4.3.0" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aed4ac33e8eb078c89e6cbb1d5c4c7703ec6d299fc3e7c3695af8f8b423468b" +checksum = "d5649b9d3f6261c498410f5a25c95c4a7b0f4b84143a403fafa4e33a66178817" dependencies = [ "arbitrary", "bzip2", From 41fd4d733315dd78a04e7ea5edf57e9f2ed417d2 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 21 Aug 2025 09:53:28 -0400 Subject: [PATCH 099/119] Disable mac x64 build --- .github/workflows/cargo-build.yml | 80 +++++++++++++++---------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/.github/workflows/cargo-build.yml b/.github/workflows/cargo-build.yml index b442aab..328da59 100644 --- a/.github/workflows/cargo-build.yml +++ b/.github/workflows/cargo-build.yml @@ -86,10 +86,10 @@ jobs: suffix: linux-x64-static target: x86_64-unknown-linux-musl - - os: macos-13 - file-name: qpm2 - prefix: macos-x64 - suffix: macos-x64 + # - os: macos-13 + # file-name: qpm2 + # prefix: macos-x64 + # suffix: macos-x64 - os: macos-13 file-name: qpm2 @@ -241,39 +241,39 @@ jobs: path: ./installer/qpm2-installer.exe if-no-files-found: error - macos-universal: - name: Create macOS Universal Binary - runs-on: macos-13 - needs: [build] - steps: - - name: Download Intel macOS build - uses: actions/download-artifact@v4 - with: - name: macos-x64-qpm2 - path: macos-x64 - - - name: Download ARM macOS build - uses: actions/download-artifact@v4 - with: - name: macos-arm64-qpm2 - path: macos-arm64 - - - name: Make Universal Binary - run: | - lipo -create -output "qpm2" "macos-x64/qpm2" "macos-arm64/qpm2" - chmod +x qpm2 - zip -j "qpm2-macos-universal.zip" "qpm2" - - - name: Artifact Upload (Archive) - uses: actions/upload-artifact@v4 - with: - name: release-macos-universal - path: qpm2-macos-universal.zip - if-no-files-found: error - - - name: Artifact Upload - uses: actions/upload-artifact@v4 - with: - name: macos-universal-qpm2 - path: qpm2 - if-no-files-found: error + # macos-universal: + # name: Create macOS Universal Binary + # runs-on: macos-13 + # needs: [build] + # steps: + # - name: Download Intel macOS build + # uses: actions/download-artifact@v4 + # with: + # name: macos-x64-qpm2 + # path: macos-x64 + + # - name: Download ARM macOS build + # uses: actions/download-artifact@v4 + # with: + # name: macos-arm64-qpm2 + # path: macos-arm64 + + # - name: Make Universal Binary + # run: | + # lipo -create -output "qpm2" "macos-x64/qpm2" "macos-arm64/qpm2" + # chmod +x qpm2 + # zip -j "qpm2-macos-universal.zip" "qpm2" + + # - name: Artifact Upload (Archive) + # uses: actions/upload-artifact@v4 + # with: + # name: release-macos-universal + # path: qpm2-macos-universal.zip + # if-no-files-found: error + + # - name: Artifact Upload + # uses: actions/upload-artifact@v4 + # with: + # name: macos-universal-qpm2 + # path: qpm2 + # if-no-files-found: error From 1f73ab1f8c024d635eb75ff5858bacaca8a76d38 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Thu, 21 Aug 2025 09:57:05 -0400 Subject: [PATCH 100/119] Switch to Mac arm64 runner --- .github/workflows/cargo-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cargo-build.yml b/.github/workflows/cargo-build.yml index 328da59..a455025 100644 --- a/.github/workflows/cargo-build.yml +++ b/.github/workflows/cargo-build.yml @@ -91,7 +91,7 @@ jobs: # prefix: macos-x64 # suffix: macos-x64 - - os: macos-13 + - os: macos-15 file-name: qpm2 prefix: macos-arm64 suffix: macos-arm64 From e77ad1372e1e0204fd553cfaaa4b60db45bc05a8 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 22 Aug 2025 21:46:24 -0400 Subject: [PATCH 101/119] Remove redundant check --- src/repository/local.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/repository/local.rs b/src/repository/local.rs index e5decd4..2bd5869 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -331,6 +331,11 @@ impl FileRepository { fs::create_dir_all(&bin_dir).context("Failed to create lib path")?; } + println!( + "Installing triplet {} with {} files", + triplet_id.triplet_id_color(), + triplet_info.files.len().file_path_color() + ); for file in &triplet_info.files { let src_file = tmp_path.join(file); let dst_file = bin_dir.join(file.file_name().unwrap()); @@ -348,14 +353,6 @@ impl FileRepository { // assert that the triplets binaries are present for (triplet_id, triplet) in qpkg.config.triplets.iter_triplets() { let triplet_path = package_path.clone().triplet(triplet_id.clone()); - let triplet_bin_path = triplet_path.binaries_path(); - if !triplet_bin_path.exists() { - bail!( - "Triplet binaries for {} not found in {}", - triplet_id.triplet_id_color(), - triplet_bin_path.display().file_path_color() - ); - } for binary in triplet.out_binaries.iter().flatten() { // {cache}/{id}/{version}/{triplet}/lib/{binary} From e6aa50df663c1bb932d7efd9a6233c2e3606d31e Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 22 Aug 2025 22:10:41 -0400 Subject: [PATCH 102/119] Make triplet optional args default to restored triplet --- src/commands/collapse.rs | 1 + src/commands/dependency.rs | 18 ++++++++++++++---- src/commands/scripts.rs | 16 ++++++++++++++-- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/commands/collapse.rs b/src/commands/collapse.rs index 3f05121..831d2c1 100644 --- a/src/commands/collapse.rs +++ b/src/commands/collapse.rs @@ -18,6 +18,7 @@ pub struct CollapseCommand { #[clap(long, default_value = "false")] offline: bool, + /// Triplet to collapse, if not specified, all triplets are collapsed #[clap(long, short)] pub triplet: Option, diff --git a/src/commands/dependency.rs b/src/commands/dependency.rs index bcc78ff..37cf384 100644 --- a/src/commands/dependency.rs +++ b/src/commands/dependency.rs @@ -7,7 +7,7 @@ use color_eyre::{ use qpm_package::models::{ package::{DependencyId, PackageConfig}, shared_package::SharedPackageConfig, - triplet::{PackageTripletDependency, TripletId}, + triplet::{PackageTripletDependency, TripletId, base_triplet_id}, }; use semver::{Version, VersionReq}; @@ -45,7 +45,7 @@ pub struct DependencyOperationAddArgs { /// Id of the dependency as listed on qpackages pub id: String, - /// Triplet to add the dependency to, if not specified, the default triplet is used + /// Triplet to add the dependency to, if not specified, the restored triplet is used #[clap(long, short)] pub triplet: Option, @@ -71,6 +71,7 @@ pub struct DependencyOperationDownloadArgs { #[clap(short, long)] pub version: Option, + /// Triplet to download the dependency for, if not specified, the restored triplet is used #[clap(long, short)] pub triplet: Option, @@ -84,7 +85,7 @@ pub struct DependencyOperationRemoveArgs { /// Id of the dependency as listed on qpackages pub id: String, - /// Triplet to remove the dependency from, if not specified, the default triplet is used + /// Triplet to remove the dependency from, if not specified, the restored triplet is used #[clap(long, short)] pub triplet: Option, @@ -135,9 +136,18 @@ impl Command for DependencyOperationAddArgs { Option::None => None, }; + let triplet = self + .triplet + .map(TripletId) + .or_else(|| { + let shared_package = SharedPackageConfig::read("."); + let restored = shared_package.ok()?.restored_triplet; + Some(restored) + }); + put_dependency( &id, - self.triplet.map(TripletId).as_ref(), + triplet.as_ref(), version, additional_data, self.sort, diff --git a/src/commands/scripts.rs b/src/commands/scripts.rs index 878fc82..44eed4e 100644 --- a/src/commands/scripts.rs +++ b/src/commands/scripts.rs @@ -5,7 +5,11 @@ use clap::Args; use color_eyre::eyre::{ContextCompat, anyhow, bail}; use itertools::Itertools; use qpm_arg_tokenizer::arg::Expression; -use qpm_package::models::{package::PackageConfig, triplet::{base_triplet_id, TripletId}}; +use qpm_package::models::{ + package::PackageConfig, + shared_package::SharedPackageConfig, + triplet::{TripletId, base_triplet_id}, +}; use crate::{models::package::PackageConfigExtensions, utils::ndk}; @@ -17,6 +21,7 @@ pub struct ScriptsCommand { args: Option>, + /// Triplet to run the script for, if not specified, the restored triplet is used #[clap(long, short)] triplet: Option, } @@ -35,7 +40,14 @@ impl Command for ScriptsCommand { let supplied_args = self.args.unwrap_or_default(); - let triplet_id = self.triplet.map(TripletId).unwrap_or(base_triplet_id()); + let triplet_id = self + .triplet + .map(TripletId) + .or_else(|| { + let shared_package = SharedPackageConfig::read("."); + Some(shared_package.ok()?.restored_triplet) + }) + .unwrap_or(base_triplet_id()); invoke_script(script, &supplied_args, &package, &triplet_id)?; From 5b15458bc33b964e3901dffac362359142d67350 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 23 Aug 2025 10:20:41 -0400 Subject: [PATCH 103/119] Refactor dependency imports and clean up unused variables --- src/commands/dependency.rs | 2 +- src/commands/qmod/manifest.rs | 2 +- src/models/package.rs | 50 ++++++++++++++--------------------- src/repository/qpackages.rs | 3 +-- src/resolver/dependency.rs | 4 +-- 5 files changed, 25 insertions(+), 36 deletions(-) diff --git a/src/commands/dependency.rs b/src/commands/dependency.rs index 37cf384..2704581 100644 --- a/src/commands/dependency.rs +++ b/src/commands/dependency.rs @@ -7,7 +7,7 @@ use color_eyre::{ use qpm_package::models::{ package::{DependencyId, PackageConfig}, shared_package::SharedPackageConfig, - triplet::{PackageTripletDependency, TripletId, base_triplet_id}, + triplet::{PackageTripletDependency, TripletId}, }; use semver::{Version, VersionReq}; diff --git a/src/commands/qmod/manifest.rs b/src/commands/qmod/manifest.rs index ce28112..344904f 100644 --- a/src/commands/qmod/manifest.rs +++ b/src/commands/qmod/manifest.rs @@ -105,7 +105,7 @@ pub(crate) fn generate_qmod_manifest( let mut existing_json = ModJson::read_and_preprocess(preprocess_data, mod_template)?; let repo = repository::useful_default_new(build_parameters.offline)?; - let template_mod_json: ModJson = shared_package.clone().to_mod_json(&repo); + let template_mod_json: ModJson = shared_package.to_mod_json(&repo); // Merge the existing json with the template mod json existing_json = ModJson::merge_modjson(existing_json, template_mod_json); diff --git a/src/models/package.rs b/src/models/package.rs index c58f36a..208ac26 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -1,17 +1,13 @@ use std::{collections::HashMap, fs::File, io::BufReader, path::Path}; -use color_eyre::{ - Result, Section, - eyre::{Context, ContextCompat}, - owo_colors::OwoColorize, -}; +use color_eyre::{Result, Section, eyre::Context, owo_colors::OwoColorize}; use itertools::Itertools; use qpm_package::models::{ package::{DependencyId, PackageConfig, QPM_JSON}, shared_package::{ - SharedPackageConfig, SharedTriplet, SharedTripletDependencyInfo, QPM_SHARED_JSON + QPM_SHARED_JSON, SharedPackageConfig, SharedTriplet, SharedTripletDependencyInfo, }, - triplet::{base_triplet_id, PackageTriplet, PackageTripletDependency, TripletId}, + triplet::{PackageTriplet, PackageTripletDependency, TripletId, base_triplet_id}, }; use qpm_qmod::models::mod_json::{ModDependency, ModJson}; use semver::VersionReq; @@ -165,14 +161,16 @@ impl PackageConfigExtensions for SharedPackageConfig { } } +/// Stores information about a dependency bundle +/// This includes the package config and triplet settings for the dependency struct DependencyBundle<'a> { - triplet: &'a TripletId, - - dep_config: PackageConfig, - dep_triplet: PackageTriplet, + /// Package of the dependency + restored_config: PackageConfig, + /// Triplet settings of the dependency + restored_triplet: PackageTriplet, - shared_restored_triplet: &'a SharedTripletDependencyInfo, - restored_triplet: &'a PackageTripletDependency, + /// The triplet dependency as specified in the root package + dep_triplet: &'a PackageTripletDependency, } impl SharedPackageConfigExtensions for SharedPackageConfig { @@ -238,12 +236,6 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { } fn to_mod_json(self, repo: &impl Repository) -> ModJson { - // Self { - // id: dep.id, - // version_range: dep.version_range, - // mod_link: dep.additional_data.mod_link, - // } - // List of dependencies we are directly referencing in qpm.json let package_triplet = self .config @@ -251,6 +243,7 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { .get_triplet_settings(&self.restored_triplet) .expect("Triplet should exist"); + // Map of directly referenced dependencies let direct_dependencies: HashMap = package_triplet .dependencies .iter() @@ -274,14 +267,11 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { .expect("Triplet should exist in package"); let result = DependencyBundle { - triplet: &shared_dep_triplet.restored_triplet, - - shared_restored_triplet: shared_dep_triplet, - restored_triplet: dep_triplet, + dep_triplet, // grabbed from repo - dep_config: dep_package, - dep_triplet: dep_package_triplet, + restored_config: dep_package, + restored_triplet: dep_package_triplet, }; Some((dep_id.clone(), result)) }) @@ -293,12 +283,12 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { let mods: Vec = direct_dependencies .values() // Removes any dependency without a qmod link - .filter(|result| result.dep_triplet.qmod_url.is_some()) + .filter(|result| result.restored_triplet.qmod_url.is_some()) .map(|result| ModDependency { - version_range: result.restored_triplet.version_range.clone(), - id: result.dep_config.id.0.clone(), - mod_link: result.dep_triplet.qmod_url.clone(), - required: result.restored_triplet.qmod_required, + version_range: result.dep_triplet.version_range.clone(), + id: result.restored_config.id.0.clone(), + mod_link: result.restored_triplet.qmod_url.clone(), + required: result.dep_triplet.qmod_required, }) .collect(); diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index d7e9293..db2c1fa 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -8,7 +8,6 @@ use owo_colors::OwoColorize; use reqwest::StatusCode; use semver::Version; use sha2::{Digest, Sha256}; -use std::io::Read; use serde::Deserialize; @@ -20,7 +19,7 @@ use qpm_package::models::{ use crate::{ models::{ package::PackageConfigExtensions, package_files::PackageIdPath, - qpackages::QPackageExtensions, qpkg::QPkgExtensions, + qpackages::QPackageExtensions, }, network::agent::{download_file_report, get_agent}, repository::local::FileRepository, diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index 458b419..dba778f 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -23,7 +23,7 @@ use pubgrub::{ use qpm_package::models::{ package::{DependencyId, PackageConfig}, shared_package::{SharedPackageConfig, SharedTriplet}, - triplet::{PackageTriplet, TripletId, base_triplet_id}, + triplet::{PackageTriplet, TripletId}, }; /// Represents a resolved dependency @@ -311,7 +311,7 @@ pub fn restore>( } pub fn locked_resolve<'a, R: Repository>( - root: &'a SharedPackageConfig, + _root: &'a SharedPackageConfig, repository: &'a R, triplet: &'a SharedTriplet, ) -> Result + 'a> { From 88f81c89599d277e48696e6a5b00d859555bdc1f Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 23 Aug 2025 10:43:18 -0400 Subject: [PATCH 104/119] Update triplet handling to reduce copies and use new triplet methods --- Cargo.lock | 61 ++++++++++++++++++++++++----------- src/commands/build.rs | 4 +-- src/commands/collapse.rs | 4 +-- src/commands/dependency.rs | 4 +-- src/commands/install.rs | 5 +-- src/commands/ndk.rs | 2 +- src/commands/publish.rs | 2 +- src/commands/qmod/create.rs | 2 +- src/commands/qmod/edit.rs | 2 +- src/commands/qmod/manifest.rs | 5 +-- src/commands/qmod/zip.rs | 5 +-- src/commands/qpkg.rs | 2 +- src/commands/restore.rs | 4 +-- src/commands/scripts.rs | 2 +- src/models/package.rs | 16 ++++----- src/models/toolchain.rs | 6 ++-- src/repository/local.rs | 8 ++--- src/resolver/dependency.rs | 14 +++----- 18 files changed, 86 insertions(+), 62 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7e1749f..378e813 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -151,11 +151,13 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddb939d66e4ae03cee6091612804ba446b12878410cfa17f785f4dd67d4014e8" +checksum = "6448dfb3960f0b038e88c781ead1e7eb7929dfc3a71a1336ec9086c00f6d1e75" dependencies = [ "brotli", + "compression-codecs", + "compression-core", "flate2", "futures-core", "memchr", @@ -204,9 +206,9 @@ checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" [[package]] name = "bitflags" -version = "2.9.2" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29" +checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d" [[package]] name = "block-buffer" @@ -278,9 +280,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.33" +version = "1.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee0f8803222ba5a7e2777dd72ca451868909b1ac410621b676adf07280e9b5f" +checksum = "42bc4aea80032b7bf409b0bc7ccad88853858911b7713a8062fdc0623867bedc" dependencies = [ "jobserver", "libc", @@ -387,6 +389,26 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +[[package]] +name = "compression-codecs" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46cc6539bf1c592cff488b9f253b30bc0ec50d15407c2cf45e27bd8f308d5905" +dependencies = [ + "brotli", + "compression-core", + "flate2", + "futures-core", + "memchr", + "pin-project-lite", +] + +[[package]] +name = "compression-core" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2957e823c15bde7ecf1e8b64e537aa03a6be5fda0e2334e99887669e75b12e01" + [[package]] name = "core-foundation" version = "0.9.4" @@ -1882,9 +1904,9 @@ checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" [[package]] name = "indexmap" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" dependencies = [ "equivalent", "hashbrown", @@ -1902,9 +1924,9 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ "bitflags", "cfg-if", @@ -2162,9 +2184,9 @@ checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memmap2" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" +checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" dependencies = [ "libc", ] @@ -2496,7 +2518,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#da354a5e13b7208bfff05874f2d72e551d5e5ff7" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#746777febea1aa0b2681774f1bcda4a5ada3c31b" dependencies = [ "cursed-semver-parser", "schemars", @@ -3411,13 +3433,14 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.5" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec961601b32b6f5d14ae8dabd35ff2ff2e2c6cb4c0e6641845ff105abe96d958" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -3832,9 +3855,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] @@ -3966,9 +3989,9 @@ dependencies = [ [[package]] name = "zip" -version = "4.4.0" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5649b9d3f6261c498410f5a25c95c4a7b0f4b84143a403fafa4e33a66178817" +checksum = "8835eb39822904d39cb19465de1159e05d371973f0c6df3a365ad50565ddc8b9" dependencies = [ "arbitrary", "bzip2", diff --git a/src/commands/build.rs b/src/commands/build.rs index 6a25fb4..8c90c57 100644 --- a/src/commands/build.rs +++ b/src/commands/build.rs @@ -152,7 +152,7 @@ impl Command for BuildCommand { let triplet_id = TripletId(triplet_id); let triplet = package .triplets - .get_triplet_settings(&triplet_id) + .get_merged_triplet(&triplet_id) .context(format!("Failed to get triplet {triplet_id} from package"))?; build_triplet(&triplet_id, &triplet).with_context(|| { @@ -162,7 +162,7 @@ impl Command for BuildCommand { } None => { // build all triplets - for (triplet_id, triplet) in package.triplets.iter_triplets() { + for (triplet_id, triplet) in package.triplets.iter_merged_triplets() { println!("Building triplet {}", triplet_id.triplet_id_color()); build_triplet(&triplet_id, triplet.as_ref()).with_context(|| { format!("Failed to build triplet {}", triplet_id.triplet_id_color()) diff --git a/src/commands/collapse.rs b/src/commands/collapse.rs index 831d2c1..a38aa70 100644 --- a/src/commands/collapse.rs +++ b/src/commands/collapse.rs @@ -40,7 +40,7 @@ impl Command for CollapseCommand { println!("Listing dependencies for all triplets"); for triplet in package .triplets - .iter_triplets() + .iter_merged_triplets() .sorted_by(|a, b| a.0.cmp(&b.0)) { println!( @@ -72,7 +72,7 @@ fn list_triplet_dependencies( let package = &resolved_dep.0; let triplet = &resolved_dep.1; - let triplet_config = resolved_dep.get_triplet_settings(); + let triplet_config = resolved_dep.get_merged_triplet(); let sum = triplet_config.dependencies.len(); diff --git a/src/commands/dependency.rs b/src/commands/dependency.rs index 2704581..f199030 100644 --- a/src/commands/dependency.rs +++ b/src/commands/dependency.rs @@ -175,7 +175,7 @@ fn put_dependency( .specific_triplets .get_mut(triplet) .context("Triplet not found")?, - None => &mut package.triplets.base, + None => &mut package.triplets.base.get_or_insert_default(), }; let existing_dep = triplet.dependencies.get(id); @@ -209,7 +209,7 @@ fn remove_dependency(dependency_args: DependencyOperationRemoveArgs) -> Result<( .specific_triplets .get_mut(&TripletId(triplet)) .context("Triplet not found")?, - None => &mut package.triplets.base, + None => &mut package.triplets.base.get_or_insert_default(), }; triplet diff --git a/src/commands/install.rs b/src/commands/install.rs index 1351287..3b97912 100644 --- a/src/commands/install.rs +++ b/src/commands/install.rs @@ -103,8 +103,9 @@ impl InstallCommand { let restored_triplet = shared_package .config .triplets - .get_triplet_settings(&restored_triplet_id) - .context("Failed to get triplet")?; + .get_merged_triplet(&restored_triplet_id) + .context("Failed to get triplet")? + .into_owned(); let binaries = restored_triplet.out_binaries.unwrap_or_default(); if !self.no_validate { println!("Skipping validation of binaries"); diff --git a/src/commands/ndk.rs b/src/commands/ndk.rs index 65c1454..e68d2d5 100644 --- a/src/commands/ndk.rs +++ b/src/commands/ndk.rs @@ -277,7 +277,7 @@ fn do_resolve( let triplet = package .triplets - .get_triplet_settings(triplet_id) + .get_merged_triplet(triplet_id) .context("Failed to get triplet settings")?; let ndk_requirement = triplet.ndk.clone(); diff --git a/src/commands/publish.rs b/src/commands/publish.rs index fc00514..6488053 100644 --- a/src/commands/publish.rs +++ b/src/commands/publish.rs @@ -147,7 +147,7 @@ fn check_triplet( ) -> Result<(), color_eyre::eyre::Error> { let triplet = package .triplets - .get_triplet_settings(triplet_id) + .get_merged_triplet(triplet_id) .context("Failed to get triplet settings")?; let resolved_deps = &shared_triplet.restored_dependencies; for (dep_id, dep) in resolved_deps { diff --git a/src/commands/qmod/create.rs b/src/commands/qmod/create.rs index d21de9e..906a0ae 100644 --- a/src/commands/qmod/create.rs +++ b/src/commands/qmod/create.rs @@ -46,7 +46,7 @@ pub(crate) fn execute_qmod_create_operation( let shared_package = SharedPackageConfig::read(".")?; let triplet = package .triplets - .get_triplet_settings(&shared_package.restored_triplet) + .get_merged_triplet(&shared_package.restored_triplet) .context("Restored triplet not in package config")?; let mod_template = triplet diff --git a/src/commands/qmod/edit.rs b/src/commands/qmod/edit.rs index 14cb825..ed50e6f 100644 --- a/src/commands/qmod/edit.rs +++ b/src/commands/qmod/edit.rs @@ -44,7 +44,7 @@ impl Command for EditQmodJsonCommand { let shared_package = SharedPackageConfig::read(".")?; let triplet = package .triplets - .get_triplet_settings(&shared_package.restored_triplet) + .get_merged_triplet(&shared_package.restored_triplet) .context("Restored triplet not in package config")?; let mod_template = triplet diff --git a/src/commands/qmod/manifest.rs b/src/commands/qmod/manifest.rs index 344904f..b76094c 100644 --- a/src/commands/qmod/manifest.rs +++ b/src/commands/qmod/manifest.rs @@ -56,7 +56,7 @@ pub(crate) fn generate_qmod_manifest( let shared_triplet = shared_package.get_restored_triplet(); let triplet = package .triplets - .get_triplet_settings(&shared_package.restored_triplet) + .get_merged_triplet(&shared_package.restored_triplet) .context("Restored triplet not in package config")?; let mod_template = triplet @@ -89,7 +89,8 @@ pub(crate) fn generate_qmod_manifest( let mod_id = triplet .qmod_id - .unwrap_or(shared_package.config.id.0.clone()); + .as_ref() + .unwrap_or(&shared_package.config.id.0); let preprocess_data = PreProcessingData { version: shared_package.config.version.to_string(), diff --git a/src/commands/qmod/zip.rs b/src/commands/qmod/zip.rs index 1499e98..57c6b30 100644 --- a/src/commands/qmod/zip.rs +++ b/src/commands/qmod/zip.rs @@ -98,8 +98,9 @@ pub fn execute_qmod_zip_operation( let triplet_id = shared_package.restored_triplet.clone(); let triplet = package .triplets - .get_triplet_settings(&triplet_id) - .expect("Triplet should exist in package"); + .get_merged_triplet(&triplet_id) + .expect("Triplet should exist in package") + .into_owned(); let new_manifest = generate_qmod_manifest( &package, diff --git a/src/commands/qpkg.rs b/src/commands/qpkg.rs index 0cebe64..3946c90 100644 --- a/src/commands/qpkg.rs +++ b/src/commands/qpkg.rs @@ -139,7 +139,7 @@ impl Command for QPkgCommand { let triplets: HashMap = package .triplets - .iter_triplets() + .iter_merged_triplets() // Filter triplets based on the provided triplet IDs .filter(|(triplet_id, _)| { self.triplets.is_none() || self.triplets.as_ref().unwrap().contains(&triplet_id.0) diff --git a/src/commands/restore.rs b/src/commands/restore.rs index 5c552f1..7424c5f 100644 --- a/src/commands/restore.rs +++ b/src/commands/restore.rs @@ -66,7 +66,7 @@ impl Command for RestoreCommand { let triplet_id = TripletId(self.triplet); let triplet = package .triplets - .get_triplet_settings(&triplet_id) + .get_merged_triplet(&triplet_id) .with_context(|| format!("Triplet {} not found", triplet_id.triplet_id_color()))?; let mut repo = repository::useful_default_new(self.offline)?; @@ -146,7 +146,7 @@ impl Command for RestoreCommand { let triplet = shared_package .config .triplets - .get_triplet_settings(&triplet_id) + .get_merged_triplet(&triplet_id) .expect("Triplet should exist in package"); validate_ndk(&triplet)?; diff --git a/src/commands/scripts.rs b/src/commands/scripts.rs index 44eed4e..466117f 100644 --- a/src/commands/scripts.rs +++ b/src/commands/scripts.rs @@ -63,7 +63,7 @@ pub fn invoke_script( ) -> Result<(), color_eyre::eyre::Error> { let triplet = package .triplets - .get_triplet_settings(triplet_id) + .get_merged_triplet(triplet_id) .context("Failed to get triplet settings")?; let android_ndk_home = ndk::resolve_ndk_version(&triplet); diff --git a/src/models/package.rs b/src/models/package.rs index 208ac26..f750c4f 100644 --- a/src/models/package.rs +++ b/src/models/package.rs @@ -184,7 +184,7 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { // for each triplet, resolve the dependencies let triplet_dependencies: HashMap = config .triplets - .iter_triplets() + .iter_merged_triplets() .map(|(triplet_id, _triplet)| -> color_eyre::Result<_> { let resolved = resolve(&config, repository, &triplet_id)?.collect_vec(); @@ -200,11 +200,11 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { restored_version: resolved_dep.0.version.clone(), restored_triplet: resolved_dep.1.clone(), restored_binaries: resolved_dep - .get_triplet_settings() + .get_merged_triplet() .out_binaries .clone() .unwrap_or_default(), - restored_env: resolved_dep.get_triplet_settings().env.clone(), + restored_env: resolved_dep.get_merged_triplet().env.clone(), }; (resolved_dep.0.id.clone(), shared_triplet_dependency_info) } @@ -214,7 +214,7 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { .map(|(package_triplet_id, dependencies)| { let package_triplet = config .triplets - .get_triplet_settings(package_triplet_id) + .get_merged_triplet(package_triplet_id) .expect("Failed to get triplet settings"); let restored_dependencies = dependencies.iter().map(make_shared_triplet).collect(); @@ -240,7 +240,7 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { let package_triplet = self .config .triplets - .get_triplet_settings(&self.restored_triplet) + .get_merged_triplet(&self.restored_triplet) .expect("Triplet should exist"); // Map of directly referenced dependencies @@ -263,15 +263,15 @@ impl SharedPackageConfigExtensions for SharedPackageConfig { // get the triplet settings for the dependency let dep_package_triplet = dep_package .triplets - .get_triplet_settings(&shared_dep_triplet.restored_triplet) + .get_merged_triplet(&shared_dep_triplet.restored_triplet) .expect("Triplet should exist in package"); let result = DependencyBundle { dep_triplet, // grabbed from repo + restored_triplet: dep_package_triplet.into_owned(), restored_config: dep_package, - restored_triplet: dep_package_triplet, }; Some((dep_id.clone(), result)) }) @@ -345,7 +345,7 @@ impl SharedTripletExtensions for SharedTriplet { // let triplet = package // .triplets - // .get_triplet_settings(&dep.restored_triplet) + // .get_merged_triplet(&dep.restored_triplet) // .context("Triplet should exist in package for environment variables")?; // Ok(triplet.env) diff --git a/src/models/toolchain.rs b/src/models/toolchain.rs index e1c0ba8..c74b42f 100644 --- a/src/models/toolchain.rs +++ b/src/models/toolchain.rs @@ -47,9 +47,11 @@ pub fn write_toolchain_file( .ok()??; let dep_triplet_config = dep_config .triplets - .get_triplet_settings(&dep_triplet.restored_triplet)?; + .get_merged_triplet(&dep_triplet.restored_triplet)? + .into_owned(); let package_id = &dep_config.id; + // Prepend the extern dir and package id to the include paths let prepend_path = |dir: &String| format!("{extern_dir}/includes/{package_id}/{dir}"); let mut compile_options = dep_triplet_config.compile_options?; @@ -121,7 +123,7 @@ pub fn write_toolchain_file( }); let dep_triplet_config = dep_config .triplets - .get_triplet_settings(&dep_triplet.restored_triplet) + .get_merged_triplet(&dep_triplet.restored_triplet) .unwrap_or_else(|| panic!( "Failed to get triplet settings for package '{}' version '{}' triplet '{}'", dep_id, dep_triplet.restored_version, dep_triplet.restored_triplet diff --git a/src/repository/local.rs b/src/repository/local.rs index 2bd5869..50f8b90 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -351,7 +351,7 @@ impl FileRepository { } // assert that the triplets binaries are present - for (triplet_id, triplet) in qpkg.config.triplets.iter_triplets() { + for (triplet_id, triplet) in qpkg.config.triplets.iter_merged_triplets() { let triplet_path = package_path.clone().triplet(triplet_id.clone()); for binary in triplet.out_binaries.iter().flatten() { @@ -504,7 +504,7 @@ impl FileRepository { ) -> Result { let package_triplet = package .triplets - .get_triplet_settings(triplet) + .get_merged_triplet(triplet) .expect("Triplet settings not found"); let dep_cache_path = PackageIdPath::new(package.id.clone()) @@ -530,7 +530,7 @@ impl FileRepository { ); } - let expected_binaries = package_triplet.out_binaries.unwrap_or_default(); + let expected_binaries = package_triplet.out_binaries.clone().unwrap_or_default(); let binaries: Vec = expected_binaries .iter() .map(|b| dep_cache_path.binary_path(b)) @@ -586,7 +586,7 @@ impl FileRepository { ) -> Result> { let triplet_config = package .triplets - .get_triplet_settings(triplet) + .get_merged_triplet(triplet) .context("Failed to get triplet settings")?; // validate exists dependencies diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index dba778f..9838d1e 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -1,9 +1,5 @@ use std::{ - cmp::Reverse, - error::Error, - fmt::{Display, Formatter}, - path::Path, - time::Instant, + borrow::Cow, cmp::Reverse, error::Error, fmt::{Display, Formatter}, path::Path, time::Instant }; use super::semver::{VersionWrapper, req_to_range}; @@ -31,8 +27,8 @@ use qpm_package::models::{ pub struct ResolvedDependency(pub PackageConfig, pub TripletId); impl ResolvedDependency { - pub fn get_triplet_settings(&self) -> PackageTriplet { - self.0.triplets.get_triplet_settings(&self.1).unwrap_or_else(|| { + pub fn get_merged_triplet(&self) -> Cow<'_, PackageTriplet> { + self.0.triplets.get_merged_triplet(&self.1).unwrap_or_else(|| { panic!( "Triplet of resolved dependency {} should always exist in the package's triplets", self.1.triplet_id_color() @@ -109,7 +105,7 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> let triplet = self .root .triplets - .get_triplet_settings(self.root_triplet) + .get_merged_triplet(self.root_triplet) .expect("Root triplet should always exist in the root package's triplets"); let deps = triplet @@ -145,7 +141,7 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> let target_triplet = target_pkg .triplets - .get_triplet_settings(target_triplet_id) + .get_merged_triplet(target_triplet_id) .with_context(|| { format!( "Could not find triplet {} for package {}", From 853c0178f01fea57ae3eb5af2a7e4bc1d7d5d52a Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 23 Aug 2025 11:03:17 -0400 Subject: [PATCH 105/119] Implement QPM.Package base triplet fix --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 378e813..fdbbd71 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2518,7 +2518,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#746777febea1aa0b2681774f1bcda4a5ada3c31b" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#3414e9434891f6d7196ada43d8bbd597bd8c7b67" dependencies = [ "cursed-semver-parser", "schemars", From b68add1cca346717d70068b920d62c0afa29fe8e Mon Sep 17 00:00:00 2001 From: kodenamekrak <106346717+kodenamekrak@users.noreply.github.com> Date: Sun, 24 Aug 2025 00:40:15 +0100 Subject: [PATCH 106/119] Fix toolchain.json and improve migrate script triplet naming (#72) --- migrate.ts | 18 ++++++++++++------ src/models/toolchain.rs | 5 ++++- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/migrate.ts b/migrate.ts index 5823ab0..d44fc98 100644 --- a/migrate.ts +++ b/migrate.ts @@ -13,6 +13,7 @@ interface QPM1 { author?: string; additionalData?: { + headersOnly?: boolean, overrideSoName?: string; cmake?: boolean; toolchainOut?: string; @@ -108,7 +109,6 @@ interface QPM2 { }; triplets: { default?: string; - base: QPM2Triplet [key: string]: QPM2Triplet | string | undefined; }; configVersion: string; @@ -148,8 +148,14 @@ const devDependencies = qpm1.dependencies }, {} as Record); const qpm2Bin = - "./build/" + - (qpm1.info.additionalData?.overrideSoName ?? `${qpm1.info.id}.so`); + qpm1.info.additionalData?.headersOnly ? null : + (qpm1.info.additionalData?.overrideSoName ?? `lib${qpm1.info.id}.so`); +const outBinaries = qpm2Bin ? [qpm2Bin] : []; + +const tripletName: string = + qpm1.info.additionalData?.headersOnly ? "headersOnly" + : qpm1.info.additionalData?.overrideSoName?.endsWith(".a") ? "static" + : "shared"; const qpm2: QPM2 = { id: qpm1.info.id, @@ -172,12 +178,12 @@ const qpm2: QPM2 = { license: "", }, triplets: { - default: "base", - base: { + default: tripletName, + [tripletName]: { dependencies: dependencies, devDependencies: devDependencies, compileOptions: qpm1.info.additionalData?.compileOptions, - outBinaries: [qpm2Bin], + outBinaries, qmodId: qpm1.info.id, qmodTemplate: "mod.template.json", qmodUrl: qpm1.info.additionalData?.modLink, diff --git a/src/models/toolchain.rs b/src/models/toolchain.rs index c74b42f..59953ad 100644 --- a/src/models/toolchain.rs +++ b/src/models/toolchain.rs @@ -24,6 +24,7 @@ pub struct ToolchainData { pub libs_dir: PathBuf, pub include_dir: PathBuf, + pub shared_dir: PathBuf, pub build_out: PathBuf, pub triplet_out: PathBuf, @@ -136,7 +137,8 @@ pub fn write_toolchain_file( let extern_dir = shared_config.config.dependencies_directory.clone(); let libs_dir = FileRepository::libs_dir(&extern_dir); - let include_dir = FileRepository::libs_dir(&extern_dir); + let include_dir = FileRepository::headers_path(&extern_dir); + let shared_dir = shared_config.config.shared_directory.clone(); let build_out = FileRepository::build_path(&extern_dir); let triplet_out = build_out.join(&shared_config.restored_triplet.0); @@ -145,6 +147,7 @@ pub fn write_toolchain_file( extern_dir, libs_dir, include_dir, + shared_dir, build_out, triplet_out, From 4cac24a9dbd2637834dc7c6e64e5650a50d271d1 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Tue, 26 Aug 2025 14:39:07 -0400 Subject: [PATCH 107/119] ToolchainData include package_id, package_version, and restored_triplet fields --- src/models/toolchain.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/models/toolchain.rs b/src/models/toolchain.rs index 59953ad..b4e765c 100644 --- a/src/models/toolchain.rs +++ b/src/models/toolchain.rs @@ -5,6 +5,7 @@ use qpm_package::models::{ extra::PackageTripletCompileOptions, package::DependencyId, shared_package::SharedPackageConfig, }; use schemars::JsonSchema; +use semver::Version; use serde::{Deserialize, Serialize}; use crate::{ @@ -14,7 +15,7 @@ use crate::{ use super::schemas::{SchemaLinks, WithSchema}; -#[derive(Serialize, JsonSchema, Deserialize, Debug, Default, Clone)] +#[derive(Serialize, JsonSchema, Deserialize, Debug, Clone)] pub struct ToolchainData { /// Compile options pub compile_options: PackageTripletCompileOptions, @@ -29,6 +30,10 @@ pub struct ToolchainData { pub build_out: PathBuf, pub triplet_out: PathBuf, + pub package_id: String, + pub package_version: Version, + pub restored_triplet: String, + pub linked_binaries: HashMap>, } @@ -135,6 +140,10 @@ pub fn write_toolchain_file( }) .collect(); + let package_id = shared_config.config.id.clone(); + let package_version = shared_config.config.version.clone(); + let restored_triplet = shared_config.restored_triplet.clone(); + let extern_dir = shared_config.config.dependencies_directory.clone(); let libs_dir = FileRepository::libs_dir(&extern_dir); let include_dir = FileRepository::headers_path(&extern_dir); @@ -153,6 +162,10 @@ pub fn write_toolchain_file( triplet_out, linked_binaries, + + package_id: package_id.0, + restored_triplet: restored_triplet.0, + package_version, }; let file = File::create(toolchain_path)?; serde_json::to_writer_pretty( From 6bc48bd2517babb45147e2cf2a92ae0c783a8533 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Tue, 26 Aug 2025 15:05:34 -0400 Subject: [PATCH 108/119] Fix variable naming to camelCase --- src/models/toolchain.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/models/toolchain.rs b/src/models/toolchain.rs index b4e765c..bb08baa 100644 --- a/src/models/toolchain.rs +++ b/src/models/toolchain.rs @@ -16,6 +16,7 @@ use crate::{ use super::schemas::{SchemaLinks, WithSchema}; #[derive(Serialize, JsonSchema, Deserialize, Debug, Clone)] +#[serde(rename_all = "camelCase")] pub struct ToolchainData { /// Compile options pub compile_options: PackageTripletCompileOptions, From 00c0af266cb06b8e8ebd90e4b99d829dde9d33a9 Mon Sep 17 00:00:00 2001 From: kodenamekrak <106346717+kodenamekrak@users.noreply.github.com> Date: Fri, 29 Aug 2025 19:16:21 +0100 Subject: [PATCH 109/119] Use restored triplet when removing dependencies (#74) --- src/commands/dependency.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/commands/dependency.rs b/src/commands/dependency.rs index f199030..4212f87 100644 --- a/src/commands/dependency.rs +++ b/src/commands/dependency.rs @@ -203,14 +203,21 @@ fn put_dependency( fn remove_dependency(dependency_args: DependencyOperationRemoveArgs) -> Result<()> { let mut package = PackageConfig::read(".")?; - let triplet = match dependency_args.triplet { - Some(triplet) => package + let triplet = dependency_args + .triplet + .map(TripletId) + .or_else(|| { + let shared_package = SharedPackageConfig::read("."); + let restored = shared_package.ok()?.restored_triplet; + Some(restored) + }) + .context("No triplet specified")?; + + let triplet = package .triplets .specific_triplets - .get_mut(&TripletId(triplet)) - .context("Triplet not found")?, - None => &mut package.triplets.base.get_or_insert_default(), - }; + .get_mut(&triplet) + .context("Triplet not found")?; triplet .dependencies From e90ad013a174daae69ccdfa39e4a05b60cbc80ee Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 29 Aug 2025 14:18:04 -0400 Subject: [PATCH 110/119] Change bleeding tag to avoid breaking qpm1 --- .github/workflows/cargo-bleeding-release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cargo-bleeding-release.yml b/.github/workflows/cargo-bleeding-release.yml index 557f5a1..7d617a5 100644 --- a/.github/workflows/cargo-bleeding-release.yml +++ b/.github/workflows/cargo-bleeding-release.yml @@ -34,9 +34,9 @@ jobs: run-id: ${{ github.event.workflow_run.id }} path: artifacts - - name: Delete the previous bleeding release + - name: Delete the previous bleeding2 release run: | - gh release delete bleeding -y --cleanup-tag || true + gh release delete bleeding2 -y --cleanup-tag || true env: GH_TOKEN: ${{ github.token }} @@ -51,6 +51,6 @@ jobs: SHA: ${{ github.sha }} name: 'Latest Build on main' - tag_name: bleeding + tag_name: bleeding2 prerelease: true files: artifacts/**/* From c544c1553d97a993921ac75dff6ed68d4243575b Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 29 Aug 2025 14:23:51 -0400 Subject: [PATCH 111/119] Use bleeding2 for CI --- .github/workflows/cargo-build.yml | 2 +- src/network/github.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/cargo-build.yml b/.github/workflows/cargo-build.yml index 70c793c..81fa5d7 100644 --- a/.github/workflows/cargo-build.yml +++ b/.github/workflows/cargo-build.yml @@ -40,7 +40,7 @@ jobs: shell: bash run: | # Get the last tag that isn't bleeding - LAST_TAG=$((git tag --merged HEAD --sort=-creatordate | grep -v '^bleeding$' | head -n 1) || true) + LAST_TAG=$((git tag --merged HEAD --sort=-creatordate | grep -v '^bleeding' | head -n 1) || true) echo "Last tag: $LAST_TAG" # Use version input or tag, fallback to default diff --git a/src/network/github.rs b/src/network/github.rs index bcb1471..12379cd 100644 --- a/src/network/github.rs +++ b/src/network/github.rs @@ -74,14 +74,14 @@ pub fn download_github_artifact_url(sha: &str) -> String { pub fn nightly_github_artifact_url() -> String { #[cfg(windows)] - return "https://github.com/QuestPackageManager/QPM.CLI/releases/download/bleeding/qpm-windows-x64.zip".to_string(); + return "https://github.com/QuestPackageManager/QPM.CLI/releases/download/bleeding2/qpm-windows-x64.zip".to_string(); #[cfg(all(target_os = "macos", target_arch = "x86_64"))] - return "https://github.com/QuestPackageManager/QPM.CLI/releases/download/bleeding/qpm-macos-x64.zip".to_string(); + return "https://github.com/QuestPackageManager/QPM.CLI/releases/download/bleeding2/qpm-macos-x64.zip".to_string(); #[cfg(all(target_os = "macos", target_arch = "aarch64"))] - return "https://github.com/QuestPackageManager/QPM.CLI/releases/download/bleeding/qpm-macos-arm64.zip".to_string(); + return "https://github.com/QuestPackageManager/QPM.CLI/releases/download/bleeding2/qpm-macos-arm64.zip".to_string(); #[cfg(target_os = "linux")] - return "https://github.com/QuestPackageManager/QPM.CLI/releases/download/bleeding/qpm-linux-x64.zip".to_string(); + return "https://github.com/QuestPackageManager/QPM.CLI/releases/download/bleeding2/qpm-linux-x64.zip".to_string(); } From 16dc8bd748af3ded905ea9fad68c9a4cc583d498 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 29 Aug 2025 19:46:53 -0400 Subject: [PATCH 112/119] Fix toolchain binaries path --- src/models/toolchain.rs | 80 +++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 34 deletions(-) diff --git a/src/models/toolchain.rs b/src/models/toolchain.rs index bb08baa..0d639c3 100644 --- a/src/models/toolchain.rs +++ b/src/models/toolchain.rs @@ -1,6 +1,7 @@ use std::{collections::HashMap, fs::File, path::PathBuf}; use color_eyre::eyre::Result; +use itertools::Itertools; use qpm_package::models::{ extra::PackageTripletCompileOptions, package::DependencyId, shared_package::SharedPackageConfig, }; @@ -43,7 +44,7 @@ pub fn write_toolchain_file( repo: &impl Repository, toolchain_path: &std::path::PathBuf, ) -> Result<()> { - let extern_dir = &shared_config.config.dependencies_directory.display(); + let extern_dir = &shared_config.config.dependencies_directory; let compile_options = shared_config .get_restored_triplet() .restored_dependencies @@ -59,7 +60,14 @@ pub fn write_toolchain_file( let package_id = &dep_config.id; // Prepend the extern dir and package id to the include paths - let prepend_path = |dir: &String| format!("{extern_dir}/includes/{package_id}/{dir}"); + let prepend_path = |dir: &String| { + extern_dir + .join("includes") + .join(&package_id.0) + .join(dir) + .to_string_lossy() + .to_string() + }; let mut compile_options = dep_triplet_config.compile_options?; @@ -108,38 +116,42 @@ pub fn write_toolchain_file( } }); - let linked_binaries = - shared_config - .get_restored_triplet() - .restored_dependencies - .iter() - .filter_map(|(dep_id, dep_triplet)| { - let dep_config = repo - .get_package(dep_id, &dep_triplet.restored_version) - .unwrap_or_else(|e| { - panic!( - "Failed to get package config for package '{}' version '{}': {}", - dep_id, dep_triplet.restored_version, e - ) - }) - .unwrap_or_else(|| { - panic!( - "Package config not found for package '{}' version '{}'", - dep_id, dep_triplet.restored_version - ) - }); - let dep_triplet_config = dep_config - .triplets - .get_merged_triplet(&dep_triplet.restored_triplet) - .unwrap_or_else(|| panic!( - "Failed to get triplet settings for package '{}' version '{}' triplet '{}'", - dep_id, dep_triplet.restored_version, dep_triplet.restored_triplet - )); - - let out_binaries = dep_triplet_config.out_binaries.clone()?; - Some((dep_id.clone(), out_binaries)) - }) - .collect(); + let extern_binaries = FileRepository::libs_dir(extern_dir); + + let linked_binaries = shared_config + .get_restored_triplet() + .restored_dependencies + .iter() + .map(|(dep_id, dep_triplet)| { + let dep_config = repo + .get_package(dep_id, &dep_triplet.restored_version) + .unwrap_or_else(|e| { + panic!( + "Failed to get package config for package '{}' version '{}': {}", + dep_id, dep_triplet.restored_version, e + ) + }) + .unwrap_or_else(|| { + panic!( + "Package config not found for package '{}' version '{}'", + dep_id, dep_triplet.restored_version + ) + }); + let collect_files_of_package = FileRepository::collect_files_of_package( + &dep_config, + &dep_triplet.restored_triplet, + ) + .expect("Failed to collect files of package"); + + let binaries = collect_files_of_package + .binaries + .into_iter() + .map(|bin| extern_binaries.join(bin)) + .collect_vec(); + + (dep_id.clone(), binaries) + }) + .collect(); let package_id = shared_config.config.id.clone(); let package_version = shared_config.config.version.clone(); From d130baf22b539cacf511f873ee63babf9a81401b Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Fri, 29 Aug 2025 21:11:03 -0400 Subject: [PATCH 113/119] Fix unnecessary variable shadowing --- src/models/toolchain.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/models/toolchain.rs b/src/models/toolchain.rs index 0d639c3..6c3c011 100644 --- a/src/models/toolchain.rs +++ b/src/models/toolchain.rs @@ -44,7 +44,7 @@ pub fn write_toolchain_file( repo: &impl Repository, toolchain_path: &std::path::PathBuf, ) -> Result<()> { - let extern_dir = &shared_config.config.dependencies_directory; + let extern_dir = shared_config.config.dependencies_directory.clone(); let compile_options = shared_config .get_restored_triplet() .restored_dependencies @@ -116,7 +116,7 @@ pub fn write_toolchain_file( } }); - let extern_binaries = FileRepository::libs_dir(extern_dir); + let extern_binaries = FileRepository::libs_dir(&extern_dir); let linked_binaries = shared_config .get_restored_triplet() @@ -157,7 +157,6 @@ pub fn write_toolchain_file( let package_version = shared_config.config.version.clone(); let restored_triplet = shared_config.restored_triplet.clone(); - let extern_dir = shared_config.config.dependencies_directory.clone(); let libs_dir = FileRepository::libs_dir(&extern_dir); let include_dir = FileRepository::headers_path(&extern_dir); let shared_dir = shared_config.config.shared_directory.clone(); From 653f2cffbb5d95e7631484a7c88f94652b2ff997 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Sat, 30 Aug 2025 08:14:14 -0400 Subject: [PATCH 114/119] Fix binary path resolution in write_toolchain_file function --- src/models/toolchain.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/toolchain.rs b/src/models/toolchain.rs index 6c3c011..7ef93ed 100644 --- a/src/models/toolchain.rs +++ b/src/models/toolchain.rs @@ -146,7 +146,7 @@ pub fn write_toolchain_file( let binaries = collect_files_of_package .binaries .into_iter() - .map(|bin| extern_binaries.join(bin)) + .map(|bin| extern_binaries.join(bin.file_name().unwrap())) .collect_vec(); (dep_id.clone(), binaries) From df804250a08bcaf6aa303877e8df578161701158 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Mon, 1 Sep 2025 16:13:42 -0400 Subject: [PATCH 115/119] Update API URL to point to the new qpackages.com endpoint --- src/repository/qpackages.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/repository/qpackages.rs b/src/repository/qpackages.rs index db2c1fa..7083678 100644 --- a/src/repository/qpackages.rs +++ b/src/repository/qpackages.rs @@ -28,8 +28,7 @@ use crate::{ use super::Repository; -// const API_URL: &str = "https://2.qpackages.com"; -const API_URL: &str = "https://qpackages.com"; +const API_URL: &str = "https://new.qpackages.com"; #[derive(Default)] pub struct QPMRepository {} From 370ba1c5b7b50c8a563f1baa69591d4d85e65037 Mon Sep 17 00:00:00 2001 From: FernTheDev <15272073+Fernthedev@users.noreply.github.com> Date: Sun, 26 Oct 2025 21:22:44 -0400 Subject: [PATCH 116/119] Quest Emulator setup integration (#75) * Update packages * Minor fixes * feat: add quest_emu feature and command integration - Updated Cargo.toml to include the quest_emu feature as a default option. - Added quest_emu dependency from its GitHub repository. * Update quest_emu * fix: update quest_emu source reference to latest commit * Update to allow apk download fuzzy matching --- Cargo.lock | 1764 ++++++++++++++++++++++++++++----------- Cargo.toml | 11 +- src/commands/doctor.rs | 21 +- src/commands/mod.rs | 16 +- src/repository/local.rs | 2 +- 5 files changed, 1320 insertions(+), 494 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fdbbd71..6792d86 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] @@ -17,6 +17,12 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + [[package]] name = "aho-corasick" version = "1.1.3" @@ -49,9 +55,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "anstream" -version = "0.6.20" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -64,9 +70,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -99,9 +105,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.99" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arbitrary" @@ -118,6 +124,12 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + [[package]] name = "assert_cmd" version = "2.0.17" @@ -151,16 +163,13 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.28" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6448dfb3960f0b038e88c781ead1e7eb7929dfc3a71a1336ec9086c00f6d1e75" +checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" dependencies = [ - "brotli", "compression-codecs", "compression-core", - "flate2", "futures-core", - "memchr", "pin-project-lite", "tokio", ] @@ -179,9 +188,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -189,7 +198,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -198,6 +207,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" + [[package]] name = "beef" version = "0.5.2" @@ -206,9 +221,31 @@ checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" [[package]] name = "bitflags" -version = "2.9.3" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "bitvec-nom2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d" +checksum = "d988fcc40055ceaa85edc55875a08f8abd29018582647fd82ad6128dba14a5f0" +dependencies = [ + "bitvec", + "nom", +] [[package]] name = "block-buffer" @@ -242,9 +279,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" dependencies = [ "memchr", "regex-automata", @@ -271,29 +308,40 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "bzip2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea8dcd42434048e4f7a304411d9273a411f647446c1234a65ce0554923f4cff" +checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" dependencies = [ "libbz2-rs-sys", ] [[package]] name = "cc" -version = "1.2.34" +version = "1.2.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42bc4aea80032b7bf409b0bc7ccad88853858911b7713a8062fdc0623867bedc" +checksum = "739eb0f94557554b3ca9a86d2d37bebd49c5e6d0c1d2bda35ba5bdac830befc2" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", ] +[[package]] +name = "cdivsufsort" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edefce019197609da416762da75bb000bbd2224b2d89a7e722c2296cbff79b8c" +dependencies = [ + "cc", + "sacabase", +] + [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -301,11 +349,20 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "num-traits", +] + [[package]] name = "clap" -version = "4.5.45" +version = "4.5.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318" +checksum = "0c2cfd7bf8a6017ddaa4e32ffe7403d547790db06bd171c1c53926faab501623" dependencies = [ "clap_builder", "clap_derive", @@ -313,9 +370,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.44" +version = "4.5.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" +checksum = "0a4c05b9e80c5ccd3a7ef080ad7b6ba7d6fc00a985b8b157197075677c82c7a0" dependencies = [ "anstream", "anstyle", @@ -325,30 +382,30 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.57" +version = "4.5.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d9501bd3f5f09f7bbee01da9a511073ed30a80cd7a509f1214bb74eadea71ad" +checksum = "2348487adcd4631696ced64ccdb40d38ac4d31cae7f2eec8817fcea1b9d1c43c" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "4.5.45" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] name = "clap_lex" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "clru" @@ -391,23 +448,69 @@ checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "compression-codecs" -version = "0.4.28" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46cc6539bf1c592cff488b9f253b30bc0ec50d15407c2cf45e27bd8f308d5905" +checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" dependencies = [ "brotli", "compression-core", "flate2", - "futures-core", "memchr", - "pin-project-lite", ] [[package]] name = "compression-core" -version = "0.4.28" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" + +[[package]] +name = "console" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b430743a6eb14e9764d4260d4c0d8123087d504eeb9c48f2b2a5e810dd369df4" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.61.2", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2957e823c15bde7ecf1e8b64e537aa03a6be5fda0e2334e99887669e75b12e01" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "const_panic" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e262cdaac42494e3ae34c43969f9cdeb7da178bdb4b66fa6a1ea2edb4c8ae652" +dependencies = [ + "typewit", +] [[package]] name = "core-foundation" @@ -425,6 +528,15 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -434,6 +546,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" version = "1.5.0" @@ -498,17 +625,34 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "dary_heap" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06d2e3287df1c007e74221c49ca10a95d557349e54b3a75dc2fb14712c751f04" + [[package]] name = "deflate64" -version = "0.1.9" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26bf8fc351c5ed29b5c2f0cbbac1b209b74f60ecd62e675a998df72c49af5204" + +[[package]] +name = "der" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", ] @@ -521,7 +665,19 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", +] + +[[package]] +name = "dialoguer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" +dependencies = [ + "console", + "shell-words", + "tempfile", + "zeroize", ] [[package]] @@ -537,6 +693,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", ] @@ -558,7 +715,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -569,14 +726,14 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] name = "doc-comment" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9" [[package]] name = "dunce" @@ -596,6 +753,12 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -613,12 +776,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -659,11 +822,17 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + [[package]] name = "flate2" -version = "1.1.2" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "libz-rs-sys", @@ -687,9 +856,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.5" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "form_urlencoded" @@ -706,6 +875,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures-channel" version = "0.3.31" @@ -758,9 +933,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.7" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", @@ -775,35 +950,35 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasip2", "wasm-bindgen", ] [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "gix" -version = "0.73.0" +version = "0.74.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514c29cc879bdc0286b0cbc205585a49b252809eb86c69df4ce4f855ee75f635" +checksum = "5fd3a6fea165debe0e80648495f894aa2371a771e3ceb7a7dcc304f1c4344c43" dependencies = [ "gix-actor", "gix-attributes", @@ -847,30 +1022,29 @@ dependencies = [ "gix-validate", "gix-worktree", "gix-worktree-state", - "once_cell", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-actor" -version = "0.35.4" +version = "0.35.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d36dcf9efe32b51b12dfa33cedff8414926124e760a32f9e7a6b5580d280967" +checksum = "987a51a7e66db6ef4dc030418eb2a42af6b913a79edd8670766122d8af3ba59e" dependencies = [ "bstr", "gix-date", "gix-utils", "itoa", - "thiserror 2.0.16", + "thiserror 2.0.17", "winnow", ] [[package]] name = "gix-attributes" -version = "0.27.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45442188216d08a5959af195f659cb1f244a50d7d2d0c3873633b1cd7135f638" +checksum = "cc6591add69314fc43db078076a8da6f07957c65abb0b21c3e1b6a3cf50aa18d" dependencies = [ "bstr", "gix-glob", @@ -879,33 +1053,33 @@ dependencies = [ "gix-trace", "kstring", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", "unicode-bom", ] [[package]] name = "gix-bitmap" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1db9765c69502650da68f0804e3dc2b5f8ccc6a2d104ca6c85bc40700d37540" +checksum = "5e150161b8a75b5860521cb876b506879a3376d3adc857ec7a9d35e7c6a5e531" dependencies = [ - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-chunk" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b1f1d8764958699dc764e3f727cef280ff4d1bd92c107bbf8acd85b30c1bd6f" +checksum = "5c356b3825677cb6ff579551bb8311a81821e184453cbd105e2fc5311b288eeb" dependencies = [ - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-command" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b31b65ca48a352ae86312b27a514a0c661935f96b481ac8b4371f65815eb196" +checksum = "095c8367c9dc4872a7706fbc39c7f34271b88b541120a4365ff0e36366f66e62" dependencies = [ "bstr", "gix-path", @@ -916,22 +1090,22 @@ dependencies = [ [[package]] name = "gix-commitgraph" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb23121e952f43a5b07e3e80890336cb847297467a410475036242732980d06" +checksum = "826994ff6c01f1ff00d6a1844d7506717810a91ffed143da71e3bf39369751ef" dependencies = [ "bstr", "gix-chunk", "gix-hash", "memmap2", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-config" -version = "0.46.0" +version = "0.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfb898c5b695fd4acfc3c0ab638525a65545d47706064dcf7b5ead6cdb136c0" +checksum = "1e74f57ea99025de9207db53488be4d59cf2000f617964c1b550880524fefbc3" dependencies = [ "bstr", "gix-config-value", @@ -941,31 +1115,30 @@ dependencies = [ "gix-ref", "gix-sec", "memchr", - "once_cell", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", "unicode-bom", "winnow", ] [[package]] name = "gix-config-value" -version = "0.15.1" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f012703eb67e263c6c1fc96649fec47694dd3e5d2a91abfc65e4a6a6dc85309" +checksum = "2c489abb061c74b0c3ad790e24a606ef968cebab48ec673d6a891ece7d5aef64" dependencies = [ "bitflags", "bstr", "gix-path", "libc", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-credentials" -version = "0.30.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0039dd3ac606dd80b16353a41b61fc237ca5cb8b612f67a9f880adfad4be4e05" +checksum = "20c2f7e9cda17bd982cfd4f7b7a2486239bb5be3e0893cf4b0178b8814ea3742" dependencies = [ "bstr", "gix-command", @@ -976,39 +1149,39 @@ dependencies = [ "gix-sec", "gix-trace", "gix-url", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-date" -version = "0.10.5" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "996b6b90bafb287330af92b274c3e64309dc78359221d8612d11cd10c8b9fe1c" +checksum = "661245d045aa7c16ba4244daaabd823c562c3e45f1f25b816be2c57ee09f2171" dependencies = [ "bstr", "itoa", "jiff", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-diff" -version = "0.53.0" +version = "0.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de854852010d44a317f30c92d67a983e691c9478c8a3fb4117c1f48626bcdea8" +checksum = "cd78d9da421baca219a650d71c797706117095635d7963f21bb6fdf2410abe04" dependencies = [ "bstr", "gix-hash", "gix-object", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-discover" -version = "0.41.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb180c91ca1a2cf53e828bb63d8d8f8fa7526f49b83b33d7f46cbeb5d79d30a" +checksum = "9d24547153810634636471af88338240e6ab0831308cd41eb6ebfffea77811c6" dependencies = [ "bstr", "dunce", @@ -1017,33 +1190,33 @@ dependencies = [ "gix-path", "gix-ref", "gix-sec", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-features" -version = "0.43.1" +version = "0.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1543cd9b8abcbcebaa1a666a5c168ee2cda4dea50d3961ee0e6d1c42f81e5b" +checksum = "dfa64593d1586135102307fb57fb3a9d3868b6b1f45a4da1352cce5070f8916a" dependencies = [ "bytes", "crc32fast", - "flate2", "gix-path", "gix-trace", "gix-utils", "libc", + "libz-rs-sys", "once_cell", "prodash", - "thiserror 2.0.16", + "thiserror 2.0.17", "walkdir", ] [[package]] name = "gix-filter" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa6571a3927e7ab10f64279a088e0dae08e8da05547771796d7389bbe28ad9ff" +checksum = "1d1253452c9808da01eaaf9b1c4929b9982efec29ef0a668b3326b8046d9b8fb" dependencies = [ "bstr", "encoding_rs", @@ -1057,28 +1230,28 @@ dependencies = [ "gix-trace", "gix-utils", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-fs" -version = "0.16.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a4d90307d064fa7230e0f87b03231be28f8ba63b913fc15346f489519d0c304" +checksum = "3f1ecd896258cdc5ccd94d18386d17906b8de265ad2ecf68e3bea6b007f6a28f" dependencies = [ "bstr", "fastrand", "gix-features", "gix-path", "gix-utils", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-glob" -version = "0.21.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b947db8366823e7a750c254f6bb29e27e17f27e457bf336ba79b32423db62cd5" +checksum = "74254992150b0a88fdb3ad47635ab649512dff2cbbefca7916bb459894fc9d56" dependencies = [ "bitflags", "bstr", @@ -1088,21 +1261,21 @@ dependencies = [ [[package]] name = "gix-hash" -version = "0.19.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "251fad79796a731a2a7664d9ea95ee29a9e99474de2769e152238d4fdb69d50e" +checksum = "826036a9bee95945b0be1e2394c64cd4289916c34a639818f8fd5153906985c1" dependencies = [ "faster-hex", "gix-features", "sha1-checked", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-hashtable" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c35300b54896153e55d53f4180460931ccd69b7e8d2f6b9d6401122cdedc4f07" +checksum = "a27d4a3ea9640da504a2657fef3419c517fd71f1767ad8935298bcc805edd195" dependencies = [ "gix-hash", "hashbrown", @@ -1111,9 +1284,9 @@ dependencies = [ [[package]] name = "gix-ignore" -version = "0.16.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "564d6fddf46e2c981f571b23d6ad40cb08bddcaf6fc7458b1d49727ad23c2870" +checksum = "93b6a9679a1488123b7f2929684bacfd9cd2a24f286b52203b8752cbb8d7fc49" dependencies = [ "bstr", "gix-glob", @@ -1124,9 +1297,9 @@ dependencies = [ [[package]] name = "gix-index" -version = "0.41.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af39fde3ce4ce11371d9ce826f2936ec347318f2d1972fe98c2e7134e267e25" +checksum = "31244542fb98ea4f3e964a4f8deafc2f4c77ad42bed58a1e8424bca1965fae99" dependencies = [ "bitflags", "bstr", @@ -1147,25 +1320,25 @@ dependencies = [ "memmap2", "rustix", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-lock" -version = "18.0.0" +version = "19.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fa71da90365668a621e184eb5b979904471af1b3b09b943a84bc50e8ad42ed" +checksum = "729d7857429a66023bc0c29d60fa21d0d6ae8862f33c1937ba89e0f74dd5c67f" dependencies = [ "gix-tempfile", "gix-utils", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-negotiate" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d58d4c9118885233be971e0d7a589f5cfb1a8bd6cb6e2ecfb0fc6b1b293c83b" +checksum = "89e16c96e052467d64c8f75a703b78976b33b034b9ff1f1d0c056c584319b0b8" dependencies = [ "bitflags", "gix-commitgraph", @@ -1174,14 +1347,14 @@ dependencies = [ "gix-object", "gix-revwalk", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-object" -version = "0.50.2" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69ce108ab67b65fbd4fb7e1331502429d78baeb2eee10008bdef55765397c07" +checksum = "87ba1815638759c80d2318c8e98296fb396f577c2e588a3d9c13f9a5d5184051" dependencies = [ "bstr", "gix-actor", @@ -1194,15 +1367,15 @@ dependencies = [ "gix-validate", "itoa", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", "winnow", ] [[package]] name = "gix-odb" -version = "0.70.0" +version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9d7af10fda9df0bb4f7f9bd507963560b3c66cb15a5b825caf752e0eb109ac" +checksum = "6efc6736d3ea62640efe8c1be695fb0760af63614a7356d2091208a841f1a634" dependencies = [ "arc-swap", "gix-date", @@ -1216,14 +1389,14 @@ dependencies = [ "gix-quote", "parking_lot", "tempfile", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-pack" -version = "0.60.0" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8571df89bfca5abb49c3e3372393f7af7e6f8b8dbe2b96303593cef5b263019" +checksum = "719c60524be76874f4769da20d525ad2c00a0e7059943cc4f31fcb65cfb6b260" dependencies = [ "clru", "gix-chunk", @@ -1236,52 +1409,51 @@ dependencies = [ "memmap2", "parking_lot", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-packetline" -version = "0.19.1" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2592fbd36249a2fea11056f7055cc376301ef38d903d157de41998335bbf1f93" +checksum = "64286a8b5148e76ab80932e72762dd27ccf6169dd7a134b027c8a262a8262fcf" dependencies = [ "bstr", "faster-hex", "gix-trace", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-packetline-blocking" -version = "0.19.1" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4e706f328cd494cc8f932172e123a72b9a4711b0db5e411681432a89bd4c94" +checksum = "89c59c3ad41e68cb38547d849e9ef5ccfc0d00f282244ba1441ae856be54d001" dependencies = [ "bstr", "faster-hex", "gix-trace", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-path" -version = "0.10.20" +version = "0.10.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06d37034a4c67bbdda76f7bcd037b2f7bc0fba0c09a6662b19697a5716e7b2fd" +checksum = "0416b41cd00ff292af9b94b0660880c44bd2ed66828ddca9a2b333535cbb71b8" dependencies = [ "bstr", "gix-trace", "gix-validate", "home", - "once_cell", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-pathspec" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daedead611c9bd1f3640dc90a9012b45f790201788af4d659f28d94071da7fba" +checksum = "d05e28457dca7c65a2dbe118869aab922a5bd382b7bb10cff5354f366845c128" dependencies = [ "bitflags", "bstr", @@ -1289,27 +1461,27 @@ dependencies = [ "gix-config-value", "gix-glob", "gix-path", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-prompt" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ffa1a7a34c81710aaa666a428c142b6c5d640492fcd41267db0740d923c7906" +checksum = "868e6516dfa16fdcbc5f8c935167d085f2ae65ccd4c9476a4319579d12a69d8d" dependencies = [ "gix-command", "gix-config-value", "parking_lot", "rustix", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-protocol" -version = "0.51.0" +version = "0.52.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b4b807c47ffcf7c1e5b8119585368a56449f3493da93b931e1d4239364e922" +checksum = "64f19873bbf924fd077580d4ccaaaeddb67c3b3c09a8ffb61e6b4cb67e3c9302" dependencies = [ "bstr", "gix-credentials", @@ -1327,26 +1499,26 @@ dependencies = [ "gix-transport", "gix-utils", "maybe-async", - "thiserror 2.0.16", + "thiserror 2.0.17", "winnow", ] [[package]] name = "gix-quote" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a375a75b4d663e8bafe3bf4940a18a23755644c13582fa326e99f8f987d83fd" +checksum = "e912ec04b7b1566a85ad486db0cab6b9955e3e32bcd3c3a734542ab3af084c5b" dependencies = [ "bstr", "gix-utils", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-ref" -version = "0.53.1" +version = "0.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b966f578079a42f4a51413b17bce476544cca1cf605753466669082f94721758" +checksum = "8881d262f28eda39c244e60ae968f4f6e56c747f65addd6f4100b25f75ed8b88" dependencies = [ "gix-actor", "gix-features", @@ -1359,29 +1531,29 @@ dependencies = [ "gix-utils", "gix-validate", "memmap2", - "thiserror 2.0.16", + "thiserror 2.0.17", "winnow", ] [[package]] name = "gix-refspec" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d29cae1ae31108826e7156a5e60bffacab405f4413f5bc0375e19772cce0055" +checksum = "93147960f77695ba89b72019b789679278dd4dad6a0f9a4a5bf2fd07aba56912" dependencies = [ "bstr", "gix-hash", "gix-revision", "gix-validate", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-revision" -version = "0.35.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f651f2b1742f760bb8161d6743229206e962b73d9c33c41f4e4aefa6586cbd3d" +checksum = "13c5267e530d8762842be7d51b48d2b134c9dec5b650ca607f735a56a4b12413" dependencies = [ "bstr", "gix-commitgraph", @@ -1389,14 +1561,14 @@ dependencies = [ "gix-hash", "gix-object", "gix-revwalk", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-revwalk" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e74f91709729e099af6721bd0fa7d62f243f2005085152301ca5cdd86ec02c" +checksum = "02e2de4f91d712b1f6873477f769225fe430ffce2af8c7c85721c3ff955783b3" dependencies = [ "gix-commitgraph", "gix-date", @@ -1404,38 +1576,38 @@ dependencies = [ "gix-hashtable", "gix-object", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-sec" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f7053ed7c66633b56c57bc6ed3377be3166eaf3dc2df9f1c5ec446df6fdf2c" +checksum = "ea9962ed6d9114f7f100efe038752f41283c225bb507a2888903ac593dffa6be" dependencies = [ "bitflags", "gix-path", "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "gix-shallow" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d936745103243ae4c510f19e0760ce73fb0f08096588fdbe0f0d7fb7ce8944b7" +checksum = "e2374692db1ee1ffa0eddcb9e86ec218f7c4cdceda800ebc5a9fdf73a8c08223" dependencies = [ "bstr", "gix-hash", "gix-lock", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-submodule" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "657cc5dd43cbc7a14d9c5aaf02cfbe9c2a15d077cded3f304adb30ef78852d3e" +checksum = "9bacc06333b50abc4fc06204622c2dd92850de2066bb5d421ac776d2bef7ae55" dependencies = [ "bstr", "gix-config", @@ -1443,33 +1615,32 @@ dependencies = [ "gix-pathspec", "gix-refspec", "gix-url", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-tempfile" -version = "18.0.0" +version = "19.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666c0041bcdedf5fa05e9bef663c897debab24b7dc1741605742412d1d47da57" +checksum = "e265fc6b54e57693232a79d84038381ebfda7b1a3b1b8a9320d4d5fe6e820086" dependencies = [ "gix-fs", "libc", - "once_cell", "parking_lot", "tempfile", ] [[package]] name = "gix-trace" -version = "0.1.13" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2ccaf54b0b1743a695b482ca0ab9d7603744d8d10b2e5d1a332fef337bee658" +checksum = "1d3f59a8de2934f6391b6b3a1a7654eae18961fcb9f9c843533fed34ad0f3457" [[package]] name = "gix-transport" -version = "0.48.0" +version = "0.49.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f7cc0179fc89d53c54e1f9ce51229494864ab4bf136132d69db1b011741ca3" +checksum = "c8da4a77922accb1e26e610c7a84ef7e6b34fd07112e6a84afd68d7f3e795957" dependencies = [ "base64", "bstr", @@ -1481,14 +1652,14 @@ dependencies = [ "gix-sec", "gix-url", "reqwest", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-traverse" -version = "0.47.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7cdc82509d792ba0ad815f86f6b469c7afe10f94362e96c4494525a6601bdd5" +checksum = "412126bade03a34f5d4125fd64878852718575b3b360eaae3b29970cb555e2a2" dependencies = [ "bitflags", "gix-commitgraph", @@ -1498,28 +1669,28 @@ dependencies = [ "gix-object", "gix-revwalk", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-url" -version = "0.32.0" +version = "0.33.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b76a9d266254ad287ffd44467cd88e7868799b08f4d52e02d942b93e514d16f" +checksum = "c79b07b48dd9285485eb10429696ddcd1bfe6fb942ec0e5efb401ae7e40238e5" dependencies = [ "bstr", "gix-features", "gix-path", "percent-encoding", - "thiserror 2.0.16", + "thiserror 2.0.17", "url", ] [[package]] name = "gix-utils" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5351af2b172caf41a3728eb4455326d84e0d70fe26fc4de74ab0bd37df4191c5" +checksum = "befcdbdfb1238d2854591f760a48711bed85e72d80a10e8f2f93f656746ef7c5" dependencies = [ "fastrand", "unicode-normalization", @@ -1527,19 +1698,19 @@ dependencies = [ [[package]] name = "gix-validate" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77b9e00cacde5b51388d28ed746c493b18a6add1f19b5e01d686b3b9ece66d4d" +checksum = "5b1e63a5b516e970a594f870ed4571a8fdcb8a344e7bd407a20db8bd61dbfde4" dependencies = [ "bstr", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "gix-worktree" -version = "0.42.0" +version = "0.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55f625ac9126c19bef06dbc6d2703cdd7987e21e35b497bb265ac37d383877b1" +checksum = "8df3dfc8b62b0eccc923c757b40f488abc357c85c03d798622edfc3eb5137e04" dependencies = [ "bstr", "gix-attributes", @@ -1556,9 +1727,9 @@ dependencies = [ [[package]] name = "gix-worktree-state" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ba9b17cbacc02b25801197b20100f7f9bd621db1e7fce9d3c8ab3175207bf8" +checksum = "046efd191ff842cc22ddce61a4e8cea75ef7e3c659772de0838b2ad74b0016ef" dependencies = [ "bstr", "gix-features", @@ -1571,20 +1742,20 @@ dependencies = [ "gix-path", "gix-worktree", "io-close", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "globset" -version = "0.4.16" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" +checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" dependencies = [ "aho-corasick", "bstr", "log", "regex-automata", - "regex-syntax 0.8.5", + "regex-syntax 0.8.8", ] [[package]] @@ -1628,9 +1799,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.5" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" dependencies = [ "allocator-api2", "equivalent", @@ -1647,6 +1818,12 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "heck" version = "0.5.0" @@ -1661,11 +1838,11 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "home" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -1708,6 +1885,12 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "hyper" version = "1.7.0" @@ -1744,14 +1927,14 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots", + "webpki-roots 1.0.3", ] [[package]] name = "hyper-util" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ "base64", "bytes", @@ -1765,7 +1948,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.0", + "socket2", "system-configuration", "tokio", "tower-service", @@ -1882,9 +2065,9 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.23" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" +checksum = "81776e6f9464432afcc28d03e52eb101c93b6f0566f52aef2427663e700f0403" dependencies = [ "crossbeam-deque", "globset", @@ -1904,33 +2087,35 @@ checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" [[package]] name = "indexmap" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", "hashbrown", ] [[package]] -name = "io-close" -version = "0.3.7" +name = "indicatif" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cadcf447f06744f8ce713d2d6239bb5bde2c357a452397a9ed90c625da390bc" +checksum = "e2e0ddd45fe8e09ee1a607920b12271f8a5528a41ecaf6e1d1440d6493315b6b" dependencies = [ - "libc", - "winapi", + "console", + "portable-atomic", + "unicode-width", + "unit-prefix", + "web-time", ] [[package]] -name = "io-uring" -version = "0.7.10" +name = "io-close" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +checksum = "9cadcf447f06744f8ce713d2d6239bb5bde2c357a452397a9ed90c625da390bc" dependencies = [ - "bitflags", - "cfg-if", "libc", + "winapi", ] [[package]] @@ -1951,9 +2136,18 @@ dependencies = [ [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] [[package]] name = "itertools" @@ -1993,7 +2187,7 @@ checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2013,24 +2207,30 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", ] +[[package]] +name = "jzon" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ab85f84ca42c5ec520e6f3c9966ba1fd62909ce260f8837e248857d2560509" + [[package]] name = "keyring" version = "3.6.3" @@ -2041,6 +2241,26 @@ dependencies = [ "zeroize", ] +[[package]] +name = "konst" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4381b9b00c55f251f2ebe9473aef7c117e96828def1a7cb3bd3f0f903c6894e9" +dependencies = [ + "const_panic", + "konst_kernel", + "typewit", +] + +[[package]] +name = "konst_kernel" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4b1eb7788f3824c629b1116a7a9060d6e898c358ebff59070093d51103dcc3c" +dependencies = [ + "typewit", +] + [[package]] name = "kstring" version = "2.0.2" @@ -2055,6 +2275,9 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] [[package]] name = "libbz2-rs-sys" @@ -2064,35 +2287,45 @@ checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" [[package]] name = "libc" -version = "0.2.175" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] -name = "liblzma" -version = "0.4.3" +name = "libflate" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "272b875472a046e39ff7408374a5a050b112d2142211a0f54a295c0bd1c3c757" +checksum = "249fa21ba2b59e8cbd69e722f5b31e1b466db96c937ae3de23e8b99ead0d1383" dependencies = [ - "liblzma-sys", + "adler32", + "core2", + "crc32fast", + "dary_heap", + "libflate_lz77", ] [[package]] -name = "liblzma-sys" -version = "0.4.4" +name = "libflate_lz77" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b9596486f6d60c3bbe644c0e1be1aa6ccc472ad630fe8927b456973d7cb736" +checksum = "a599cb10a9cd92b1300debcef28da8f70b935ec937f44fcd1b70a7c986a11c5c" dependencies = [ - "cc", - "libc", - "pkg-config", + "core2", + "hashbrown", + "rle-decode-fast", ] +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + [[package]] name = "libredox" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ "bitflags", "libc", @@ -2101,18 +2334,18 @@ dependencies = [ [[package]] name = "libz-rs-sys" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "172a788537a2221661b480fee8dc5f96c580eb34fa88764d3205dc356c7e4221" +checksum = "840db8cf39d9ec4dd794376f38acc40d0fc65eec2a8f484f7fd375b84602becd" dependencies = [ "zlib-rs", ] [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" @@ -2122,19 +2355,18 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "logos" @@ -2165,6 +2397,16 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" +[[package]] +name = "lzma-rust2" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c60a23ffb90d527e23192f1246b14746e2f7f071cb84476dd879071696c18a4a" +dependencies = [ + "crc", + "sha2", +] + [[package]] name = "maybe-async" version = "0.2.10" @@ -2173,20 +2415,79 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] -name = "memchr" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" - -[[package]] +name = "mbf-axml" +version = "0.1.0" +source = "git+https://github.com/Lauriethefish/ModsBeforeFriday.git?branch=main#4daf77c701d9feef71b4858c0353831cdde66508" +dependencies = [ + "anyhow", + "byteorder", + "xml", +] + +[[package]] +name = "mbf-res-man" +version = "0.1.0" +source = "git+https://github.com/Fernthedev/ModsBeforeFriday.git?branch=mbf-agent-man-more#0b0a31099a4ba3060f7db8a489ad1280cb7a9ac5" +dependencies = [ + "anyhow", + "byteorder", + "const_format", + "crc", + "httpdate", + "log", + "mbf-zip 0.1.0 (git+https://github.com/Fernthedev/ModsBeforeFriday.git?branch=mbf-agent-man-more)", + "qbsdiff", + "semver", + "serde", + "serde_json", + "ureq 2.12.1", +] + +[[package]] +name = "mbf-zip" +version = "0.1.0" +source = "git+https://github.com/Lauriethefish/ModsBeforeFriday.git?branch=main#4daf77c701d9feef71b4858c0353831cdde66508" +dependencies = [ + "anyhow", + "byteorder", + "crc", + "libflate", + "pem", + "rasn", + "rasn-pkix", + "rsa", +] + +[[package]] +name = "mbf-zip" +version = "0.1.0" +source = "git+https://github.com/Fernthedev/ModsBeforeFriday.git?branch=mbf-agent-man-more#0b0a31099a4ba3060f7db8a489ad1280cb7a9ac5" +dependencies = [ + "anyhow", + "byteorder", + "crc", + "libflate", + "pem", + "rasn", + "rasn-pkix", + "rsa", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] name = "memmap2" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" +checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" dependencies = [ "libc", ] @@ -2197,6 +2498,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -2204,17 +2511,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] name = "mio" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", ] [[package]] @@ -2232,12 +2550,59 @@ dependencies = [ "time", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2245,6 +2610,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2258,9 +2624,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -2273,9 +2639,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "once_cell_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "option-ext" @@ -2285,15 +2651,15 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "owo-colors" -version = "4.2.2" +version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48dd4f4a2c8405440fd0462561f0e5806bd0f77e86f51c761481bdd4018b545e" +checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -2301,15 +2667,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -2329,6 +2695,25 @@ dependencies = [ "winapi", ] +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64", + "serde_core", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -2347,6 +2732,27 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -2370,9 +2776,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" dependencies = [ "zerovec", ] @@ -2424,20 +2830,20 @@ dependencies = [ [[package]] name = "priority-queue" -version = "2.5.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5676d703dda103cbb035b653a9f11448c0a7216c7926bd35fcb5865475d0c970" +checksum = "93980406f12d9f8140ed5abe7155acb10bb1e69ea55c88960b9c2f117445ef96" dependencies = [ - "autocfg", "equivalent", "indexmap", + "serde", ] [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -2461,16 +2867,28 @@ dependencies = [ "log", "priority-queue", "rustc-hash", - "thiserror 2.0.16", + "thiserror 2.0.17", "version-ranges", ] +[[package]] +name = "qbsdiff" +version = "1.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc7f24528be166f08f2c7becaca5618865499b6ded2565d5afcd795cc0d7596" +dependencies = [ + "byteorder", + "bzip2", + "rayon", + "suffix_array", +] + [[package]] name = "qpm_arg_tokenizer" version = "0.1.0" source = "git+https://github.com/QuestPackageManager/QPM.arg_tokenizer.git#ca4a95dc8fe034b7d7277702199b44f0ec442406" dependencies = [ - "itertools", + "itertools 0.14.0", "lazy_static", "regex", ] @@ -2490,7 +2908,7 @@ dependencies = [ "fs_extra", "gix", "hex", - "itertools", + "itertools 0.14.0", "keyring", "owo-colors", "pathdiff", @@ -2500,6 +2918,7 @@ dependencies = [ "qpm_arg_tokenizer", "qpm_package", "qpm_qmod", + "quest_emu", "reqwest", "schemars", "semver", @@ -2518,7 +2937,7 @@ dependencies = [ [[package]] name = "qpm_package" version = "2.0.0" -source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#3414e9434891f6d7196ada43d8bbd597bd8c7b67" +source = "git+https://github.com/QuestPackageManager/QPM.Package.git?branch=qpm2#5f30225fd99d52480fc57db1ce667ff6181b3e2a" dependencies = [ "cursed-semver-parser", "schemars", @@ -2538,11 +2957,40 @@ dependencies = [ "serde_json", ] +[[package]] +name = "quest_emu" +version = "0.1.0" +source = "git+https://github.com/Fernthedev/quest_emu_setup.git#31522eb233a255fc489a18e32484f47302463d2d" +dependencies = [ + "byteorder", + "bytes", + "clap", + "color-eyre", + "dialoguer", + "dirs", + "fs_extra", + "indicatif", + "itertools 0.14.0", + "mbf-axml", + "mbf-res-man", + "mbf-zip 0.1.0 (git+https://github.com/Lauriethefish/ModsBeforeFriday.git?branch=main)", + "owo-colors", + "pbr", + "semver", + "serde", + "serde_json", + "symlink", + "ureq 3.1.2", + "walkdir", + "xml", + "zip", +] + [[package]] name = "quinn" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", "cfg_aliases", @@ -2551,8 +2999,8 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.5.10", - "thiserror 2.0.16", + "socket2", + "thiserror 2.0.17", "tokio", "tracing", "web-time", @@ -2560,20 +3008,20 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.12" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "getrandom 0.3.3", + "getrandom 0.3.4", "lru-slab", - "rand", + "rand 0.9.2", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.16", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -2581,23 +3029,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -2608,14 +3056,40 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + [[package]] name = "rand" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "rand_chacha", - "rand_core", + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", ] [[package]] @@ -2625,7 +3099,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", ] [[package]] @@ -2634,14 +3117,81 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", +] + +[[package]] +name = "rasn" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5379b720091e4bf4a9f118eb46f4ffb67bb8b7551649528c89e265cf880e748" +dependencies = [ + "arrayvec", + "bitvec", + "bitvec-nom2", + "bytes", + "chrono", + "either", + "jzon", + "konst", + "nom", + "num-bigint", + "num-integer", + "num-traits", + "once_cell", + "rasn-derive", + "snafu", +] + +[[package]] +name = "rasn-derive" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e521162112419405837a6590b327f24707ce9f9b3ac9c9c4a4d10673b63abcd8" +dependencies = [ + "either", + "itertools 0.10.5", + "proc-macro2", + "quote", + "rayon", + "syn 1.0.109", + "uuid", +] + +[[package]] +name = "rasn-pkix" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f74a31343c2fd11da94025b8dcbeb96bfb207b4d480db99ad5554c117448fa" +dependencies = [ + "rasn", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", ] [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] @@ -2654,30 +3204,30 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax 0.8.5", + "regex-syntax 0.8.8", ] [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax 0.8.8", ] [[package]] @@ -2688,15 +3238,15 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" -version = "0.12.23" +version = "0.12.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" dependencies = [ "async-compression", "base64", @@ -2734,7 +3284,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", + "webpki-roots 1.0.3", ] [[package]] @@ -2751,6 +3301,33 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rle-decode-fast" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422" + +[[package]] +name = "rsa" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "sha2", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rustc-demangle" version = "0.1.26" @@ -2765,23 +3342,24 @@ checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustix" -version = "1.0.8" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.31" +version = "0.23.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" dependencies = [ + "log", "once_cell", "ring", "rustls-pki-types", @@ -2790,6 +3368,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "rustls-pki-types" version = "1.12.0" @@ -2802,9 +3389,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.4" +version = "0.103.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" dependencies = [ "ring", "rustls-pki-types", @@ -2823,6 +3410,15 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "sacabase" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9883fc3d6ce3d78bb54d908602f8bc1f7b5f983afe601dabe083009d86267a84" +dependencies = [ + "num-traits", +] + [[package]] name = "same-file" version = "1.0.6" @@ -2854,7 +3450,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2865,19 +3461,21 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] @@ -2893,15 +3491,24 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2912,19 +3519,20 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] name = "serde_json" -version = "1.0.143" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -2992,6 +3600,16 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -3010,31 +3628,71 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[package]] +name = "snafu" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4de37ad025c587a29e8f3f5605c00f70b98715ef90b9061a815b9e59e9042d6" +dependencies = [ + "backtrace", + "doc-comment", + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "socket2" -version = "0.5.10" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] -name = "socket2" -version = "0.6.0" +name = "socks" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" dependencies = [ + "byteorder", "libc", - "windows-sys 0.59.0", + "winapi", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", ] [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -3054,6 +3712,15 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "suffix_array" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907d9ca9637a22e3a7d7c7818f6105a7898857359e187ad3325d986684b9ec3f" +dependencies = [ + "cdivsufsort", +] + [[package]] name = "symlink" version = "0.1.0" @@ -3073,9 +3740,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" dependencies = [ "proc-macro2", "quote", @@ -3099,7 +3766,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3123,17 +3790,23 @@ dependencies = [ "libc", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tempfile" -version = "3.21.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -3149,7 +3822,7 @@ dependencies = [ "regex", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", "walkdir", ] @@ -3170,11 +3843,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.16", + "thiserror-impl 2.0.17", ] [[package]] @@ -3185,18 +3858,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] name = "thiserror-impl" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3210,9 +3883,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -3227,15 +3900,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -3268,26 +3941,23 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "pin-project-lite", - "slab", - "socket2 0.6.0", - "windows-sys 0.59.0", + "socket2", + "windows-sys 0.61.2", ] [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -3383,9 +4053,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "sharded-slab", "thread_local", @@ -3400,9 +4070,24 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "typewit" +version = "1.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c1ae7cc0fdb8b842d65d127cb981574b0d2b249b74d1c7a2986863dc134f71" +dependencies = [ + "typewit_proc_macros", +] + +[[package]] +name = "typewit_proc_macros" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36a83ea2b3c704935a01b4642946aadd445cea40b10935e3f8bd8052b8193d6" [[package]] name = "unicode-bom" @@ -3412,9 +4097,9 @@ checksum = "7eec5d1121208364f6793f7d2e222bf75a915c19557537745b195b253dd64217" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" [[package]] name = "unicode-normalization" @@ -3425,12 +4110,78 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unit-prefix" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "323402cff2dd658f39ca17c789b502021b3f18707c91cdf22e3838e1b4023817" + [[package]] name = "untrusted" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "ureq" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" +dependencies = [ + "base64", + "flate2", + "log", + "once_cell", + "rustls", + "rustls-pki-types", + "url", + "webpki-roots 0.26.11", +] + +[[package]] +name = "ureq" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99ba1025f18a4a3fc3e9b48c868e9beb4f24f4b4b1a325bada26bd4119f46537" +dependencies = [ + "base64", + "encoding_rs", + "flate2", + "log", + "percent-encoding", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "socks", + "ureq-proto", + "utf-8", + "webpki-roots 1.0.3", +] + +[[package]] +name = "ureq-proto" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b4531c118335662134346048ddb0e54cc86bd7e81866757873055f0e38f5d2" +dependencies = [ + "base64", + "http", + "httparse", + "log", +] + [[package]] name = "url" version = "2.5.7" @@ -3443,6 +4194,12 @@ dependencies = [ "serde", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -3455,6 +4212,15 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +dependencies = [ + "getrandom 0.3.4", +] + [[package]] name = "valuable" version = "0.1.1" @@ -3523,45 +4289,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -3572,9 +4339,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3582,31 +4349,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -3624,9 +4391,18 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.2" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.3", +] + +[[package]] +name = "webpki-roots" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" dependencies = [ "rustls-pki-types", ] @@ -3649,11 +4425,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -3668,13 +4444,19 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-registry" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ - "windows-link", + "windows-link 0.1.3", "windows-result", "windows-strings", ] @@ -3685,7 +4467,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -3694,7 +4476,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -3721,7 +4503,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", ] [[package]] @@ -3742,19 +4533,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -3765,9 +4556,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -3777,9 +4568,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -3789,9 +4580,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -3801,9 +4592,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -3813,9 +4604,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -3825,9 +4616,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -3837,9 +4628,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -3849,9 +4640,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" @@ -3863,13 +4654,10 @@ dependencies = [ ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" @@ -3877,6 +4665,24 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "xml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede1c99c55b4b3ad0349018ef0eccbe954ce9c342334410707ee87177fcf2ab4" +dependencies = [ + "xml-rs", +] + [[package]] name = "xml-rs" version = "0.8.27" @@ -3903,28 +4709,28 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3944,15 +4750,15 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" @@ -3984,14 +4790,14 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] name = "zip" -version = "4.5.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835eb39822904d39cb19465de1159e05d371973f0c6df3a365ad50565ddc8b9" +checksum = "eb2a05c7c36fde6c09b08576c9f7fb4cda705990f73b58fe011abf7dfb24168b" dependencies = [ "arbitrary", "bzip2", @@ -3999,7 +4805,7 @@ dependencies = [ "deflate64", "flate2", "indexmap", - "liblzma", + "lzma-rust2", "memchr", "nt-time", "zopfli", @@ -4008,9 +4814,9 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626bd9fa9734751fc50d6060752170984d7053f5a39061f524cda68023d4db8a" +checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2" [[package]] name = "zopfli" @@ -4044,9 +4850,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index 97fc61e..3a54572 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0" edition = "2024" repository = "https://github.com/QuestPackageManager/QPM.CLI" -rust-version = "1.85" +rust-version = "1.90" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # Rename binary @@ -17,9 +17,10 @@ required-features = [] [features] -default = ["templatr", "network_test", "cli", "gitoxide"] +default = ["templatr", "network_test", "cli", "gitoxide", "quest_emu"] templatr = ["dep:templatr"] cli = ["dep:clap", "dep:clap_complete", "dep:vergen", "dep:pbr"] +quest_emu = ["dep:quest_emu"] network_test = [] gitoxide = ["dep:gix"] @@ -35,7 +36,7 @@ color-eyre = { version = "0.6", default-features = false } [dev-dependencies] assert_cmd = "2.0.14" predicates = "3.1.0" -tempfile = "3.10.1" +tempfile = "3.23" assert_fs = "1.1.0" fs_extra = "1.3.0" walkdir = "2.4.0" @@ -47,6 +48,8 @@ qpm_package = { git = "https://github.com/QuestPackageManager/QPM.Package.git", qpm_qmod = { git = "https://github.com/QuestPackageManager/QPM.Qmod.git" } qpm_arg_tokenizer = { git = "https://github.com/QuestPackageManager/QPM.arg_tokenizer.git" } templatr = { git = "https://github.com/QuestPackageManager/templatr.git", optional = true } +quest_emu = { git = "https://github.com/Fernthedev/quest_emu_setup.git", optional = true } + pathdiff = "0.2" # No need for tracing support @@ -83,7 +86,7 @@ owo-colors = "4" dirs = "6.0.0" keyring = "3" -zip = { version = "4", default-features = false, features = [ +zip = { version = "6", default-features = false, features = [ "zstd", "nt-time", "deflate", diff --git a/src/commands/doctor.rs b/src/commands/doctor.rs index bbad87e..f901526 100644 --- a/src/commands/doctor.rs +++ b/src/commands/doctor.rs @@ -79,15 +79,18 @@ impl Command for DoctorCommand { if File::open("./qpm.json").is_ok() { let ndk_path = env::var("ANDROID_NDK_HOME"); - if ndk_path.is_ok() { - println!("NDK {} found in path!", ndk_path.unwrap()); - } else if let Err(err) = ndk_path - && File::open("./ndkpath.txt").is_err() - { - return Err(anyhow!( - "No ndkpath.txt or ANDROID_NDK_HOME environment variable found!" - ) - .error(err)); + match ndk_path { + Ok(ndk) => { + println!("NDK {} found in path!", ndk); + } + Err(err) => { + if File::open("./ndkpath.txt").is_err() { + return Err(anyhow!( + "No ndkpath.txt or ANDROID_NDK_HOME environment variable found!" + ) + .error(err)); + } + } } }; diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 53e33ef..ee25219 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -79,6 +79,13 @@ pub enum MainCommand { #[cfg(feature = "templatr")] Templatr(templatr::TemplatrCommand), + #[cfg(feature = "quest_emu")] + Emu { + yes: bool, + #[command(subcommand)] + main_command: quest_emu::commands::MainCommand, + }, + Version(version::VersionCommand), #[command(hide = true)] @@ -117,9 +124,16 @@ impl Command for MainCommand { MainCommand::GenSchema(g) => g.execute(), MainCommand::QPkg(q) => q.execute(), MainCommand::Triplet(t) => t.execute(), + MainCommand::Build(build_command) => build_command.execute(), + #[cfg(feature = "templatr")] MainCommand::Templatr(c) => c.execute(), - MainCommand::Build(build_command) => build_command.execute(), + + #[cfg(feature = "quest_emu")] + MainCommand::Emu { yes, main_command } => quest_emu::commands::Command::execute( + main_command, + &quest_emu::commands::GlobalContext { yes }, + ), } } } diff --git a/src/repository/local.rs b/src/repository/local.rs index 50f8b90..28504fe 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -1,6 +1,6 @@ use color_eyre::{ Result, - eyre::{Context, ContextCompat, OptionExt, bail, ensure}, + eyre::{Context, OptionExt, bail, ensure}, }; use itertools::Itertools; use owo_colors::OwoColorize; From c4099a868484519160089e17423fcf69d3d6ccfb Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Mon, 27 Oct 2025 19:37:27 -0400 Subject: [PATCH 117/119] Update qpm emu to fix obb copying --- Cargo.lock | 58 +++++++++++++++++++++--------------------------------- 1 file changed, 22 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6792d86..3cb9d2a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2097,9 +2097,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.18.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e0ddd45fe8e09ee1a607920b12271f8a5528a41ecaf6e1d1440d6493315b6b" +checksum = "ade6dfcba0dfb62ad59e59e7241ec8912af34fd29e0e743e3db992bd278e8b65" dependencies = [ "console", "portable-atomic", @@ -2217,9 +2217,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.81" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", @@ -2960,7 +2960,7 @@ dependencies = [ [[package]] name = "quest_emu" version = "0.1.0" -source = "git+https://github.com/Fernthedev/quest_emu_setup.git#31522eb233a255fc489a18e32484f47302463d2d" +source = "git+https://github.com/Fernthedev/quest_emu_setup.git#1214f051d3d2e7032ba972f72ca75ec486ba6b42" dependencies = [ "byteorder", "bytes", @@ -3379,9 +3379,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" dependencies = [ "web-time", "zeroize", @@ -4299,9 +4299,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", "once_cell", @@ -4310,25 +4310,11 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.108", - "wasm-bindgen-shared", -] - [[package]] name = "wasm-bindgen-futures" -version = "0.4.54" +version = "0.4.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" dependencies = [ "cfg-if", "js-sys", @@ -4339,9 +4325,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4349,31 +4335,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn 2.0.108", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.81" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -4685,9 +4671,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.27" +version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" [[package]] name = "yoke" From 37b6b52a27cfb980b1135e30f0a90e5fc926eb91 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Sun, 30 Nov 2025 18:01:25 -0400 Subject: [PATCH 118/119] Add warning for cyclic dependencies between root and dependency, then skip --- src/resolver/dependency.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/resolver/dependency.rs b/src/resolver/dependency.rs index 9838d1e..c23deb5 100644 --- a/src/resolver/dependency.rs +++ b/src/resolver/dependency.rs @@ -12,6 +12,7 @@ use color_eyre::{ Result, eyre::{Context, ContextCompat, bail}, }; +use owo_colors::OwoColorize; use pubgrub::{ DefaultStringReporter, Dependencies, DependencyProvider, PackageResolutionStatistics, PubGrubError, Reporter, @@ -153,6 +154,23 @@ impl DependencyProvider for PackageDependencyResolver<'_, '_, R> let deps = target_triplet .dependencies .iter() + // TODO: remove any private dependencies + // .filter(|dep| !dep.1.version_range.additional_data.is_private.unwrap_or(false)) + .inspect(|(dep_id, _)| { + if **dep_id == self.root.id { + println!( + "{}", + format!( + "Warning: Package {} depends on root package {}", + target_pkg.id.dependency_id_color(), + self.root.id.dependency_id_color() + ) + .yellow() + ); + } + }) + // skip root package to avoid circular deps + .filter(|dep| *dep.0 != self.root.id) .map(|(dep_id, dep)| { let id = PubgrubDependencyTarget(dep_id.clone(), dep.triplet.clone()); let range = req_to_range(dep.version_range.clone()); From 3e4d865ec050cc8971df6aeebf77099eac5c2c02 Mon Sep 17 00:00:00 2001 From: Fernthedev <15272073+Fernthedev@users.noreply.github.com> Date: Sun, 30 Nov 2025 18:14:21 -0400 Subject: [PATCH 119/119] Fix compile error and update --- Cargo.lock | 534 ++++++++++++++++++---------------------- src/repository/local.rs | 2 +- 2 files changed, 239 insertions(+), 297 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3cb9d2a..eb4d7e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -25,9 +25,9 @@ checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -85,22 +85,22 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -132,13 +132,12 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "assert_cmd" -version = "2.0.17" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd389a4b2970a01282ee455294913c0a43724daedcd1a24c3eb0ec1c1320b66" +checksum = "bcbb6924530aa9e0432442af08bbcafdad182db80d2e560da42a6d442535bf85" dependencies = [ "anstyle", "bstr", - "doc-comment", "libc", "predicates", "predicates-core", @@ -163,9 +162,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.32" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" +checksum = "0e86f6d3dc9dc4352edeea6b8e499e13e3f5dc3b964d7ca5fd411415a3498473" dependencies = [ "compression-codecs", "compression-core", @@ -198,7 +197,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -302,9 +301,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "bzip2" @@ -317,9 +316,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.43" +version = "1.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "739eb0f94557554b3ca9a86d2d37bebd49c5e6d0c1d2bda35ba5bdac830befc2" +checksum = "c481bdbf0ed3b892f6f806287d72acd515b352a4ec27a208489b8c1bc839633a" dependencies = [ "find-msvc-tools", "jobserver", @@ -360,9 +359,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.50" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2cfd7bf8a6017ddaa4e32ffe7403d547790db06bd171c1c53926faab501623" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ "clap_builder", "clap_derive", @@ -370,9 +369,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.50" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4c05b9e80c5ccd3a7ef080ad7b6ba7d6fc00a985b8b157197075677c82c7a0" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ "anstream", "anstyle", @@ -382,9 +381,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.59" +version = "4.5.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2348487adcd4631696ced64ccdb40d38ac4d31cae7f2eec8817fcea1b9d1c43c" +checksum = "39615915e2ece2550c0149addac32fb5bd312c657f43845bb9088cb9c8a7c992" dependencies = [ "clap", ] @@ -398,7 +397,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -448,9 +447,9 @@ checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "compression-codecs" -version = "0.4.31" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" +checksum = "302266479cb963552d11bd042013a58ef1adc56768016c8b82b4199488f2d4ad" dependencies = [ "brotli", "compression-core", @@ -460,9 +459,9 @@ dependencies = [ [[package]] name = "compression-core" -version = "0.4.29" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" [[package]] name = "console" @@ -548,9 +547,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" dependencies = [ "crc-catalog", ] @@ -606,9 +605,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -665,7 +664,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -726,7 +725,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -824,9 +823,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" [[package]] name = "flate2" @@ -933,9 +932,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.9" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -976,9 +975,9 @@ checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "gix" -version = "0.74.1" +version = "0.75.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd3a6fea165debe0e80648495f894aa2371a771e3ceb7a7dcc304f1c4344c43" +checksum = "60beff35667fb0ac935c4c45941868d9cf5025e4b85c58deb3c5a65113e22ce4" dependencies = [ "gix-actor", "gix-attributes", @@ -1028,9 +1027,9 @@ dependencies = [ [[package]] name = "gix-actor" -version = "0.35.6" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "987a51a7e66db6ef4dc030418eb2a42af6b913a79edd8670766122d8af3ba59e" +checksum = "694f6c16eb88b16b00b1d811e4e4bda6f79e9eb467a1b04fd5b848da677baa81" dependencies = [ "bstr", "gix-date", @@ -1103,9 +1102,9 @@ dependencies = [ [[package]] name = "gix-config" -version = "0.47.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e74f57ea99025de9207db53488be4d59cf2000f617964c1b550880524fefbc3" +checksum = "9419284839421488b5ab9b9b88386bdc1e159a986c08e17ffa3e9a5cd2b139f5" dependencies = [ "bstr", "gix-config-value", @@ -1136,9 +1135,9 @@ dependencies = [ [[package]] name = "gix-credentials" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20c2f7e9cda17bd982cfd4f7b7a2486239bb5be3e0893cf4b0178b8814ea3742" +checksum = "3c5576b03b6396d2df102c98a4bd639797f1922dd06599c92830dfc68fcff287" dependencies = [ "bstr", "gix-command", @@ -1154,9 +1153,9 @@ dependencies = [ [[package]] name = "gix-date" -version = "0.10.7" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "661245d045aa7c16ba4244daaabd823c562c3e45f1f25b816be2c57ee09f2171" +checksum = "9f94626a5bc591a57025361a3a890092469e47c7667e59fc143439cd6eaf47fe" dependencies = [ "bstr", "itoa", @@ -1167,9 +1166,9 @@ dependencies = [ [[package]] name = "gix-diff" -version = "0.54.1" +version = "0.55.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd78d9da421baca219a650d71c797706117095635d7963f21bb6fdf2410abe04" +checksum = "cfc7735ca267da78c37e916e9b32d67b0b0e3fc9401378920e9469b5d497dccf" dependencies = [ "bstr", "gix-hash", @@ -1179,9 +1178,9 @@ dependencies = [ [[package]] name = "gix-discover" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d24547153810634636471af88338240e6ab0831308cd41eb6ebfffea77811c6" +checksum = "809f8dba9fbd7a054894ec222815742b96def1ca08e18c38b1dbc1f737dd213d" dependencies = [ "bstr", "dunce", @@ -1214,9 +1213,9 @@ dependencies = [ [[package]] name = "gix-filter" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1253452c9808da01eaaf9b1c4929b9982efec29ef0a668b3326b8046d9b8fb" +checksum = "9e137e7df1ae40fe2b49dcb2845c6bf7ac04cd53a320d72e761c598a6fd452ed" dependencies = [ "bstr", "encoding_rs", @@ -1224,7 +1223,7 @@ dependencies = [ "gix-command", "gix-hash", "gix-object", - "gix-packetline-blocking", + "gix-packetline", "gix-path", "gix-quote", "gix-trace", @@ -1297,9 +1296,9 @@ dependencies = [ [[package]] name = "gix-index" -version = "0.42.1" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31244542fb98ea4f3e964a4f8deafc2f4c77ad42bed58a1e8424bca1965fae99" +checksum = "eab6410318b98750883eb3e35eb999abfb155b407eb0580726d4d868b60cde04" dependencies = [ "bitflags", "bstr", @@ -1336,9 +1335,9 @@ dependencies = [ [[package]] name = "gix-negotiate" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e16c96e052467d64c8f75a703b78976b33b034b9ff1f1d0c056c584319b0b8" +checksum = "1d7ecfa02c9bddd371ec2cf938ee207fe242616386578f2bfc09d1f8f81d25f9" dependencies = [ "bitflags", "gix-commitgraph", @@ -1352,9 +1351,9 @@ dependencies = [ [[package]] name = "gix-object" -version = "0.51.1" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba1815638759c80d2318c8e98296fb396f577c2e588a3d9c13f9a5d5184051" +checksum = "84743d1091c501a56f00d7f4c595cb30f20fcef6503b32ac0a1ff3817efd7b5d" dependencies = [ "bstr", "gix-actor", @@ -1373,9 +1372,9 @@ dependencies = [ [[package]] name = "gix-odb" -version = "0.71.1" +version = "0.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6efc6736d3ea62640efe8c1be695fb0760af63614a7356d2091208a841f1a634" +checksum = "5f81b480252f3a4d55f87e6e358c4c6f7615f98b1742e1e70118c57282a92e82" dependencies = [ "arc-swap", "gix-date", @@ -1394,9 +1393,9 @@ dependencies = [ [[package]] name = "gix-pack" -version = "0.61.1" +version = "0.62.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719c60524be76874f4769da20d525ad2c00a0e7059943cc4f31fcb65cfb6b260" +checksum = "38e868463538731a0fd99f3950637957413bbfbe69143520c0b5c1e163303577" dependencies = [ "clru", "gix-chunk", @@ -1414,21 +1413,9 @@ dependencies = [ [[package]] name = "gix-packetline" -version = "0.19.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64286a8b5148e76ab80932e72762dd27ccf6169dd7a134b027c8a262a8262fcf" -dependencies = [ - "bstr", - "faster-hex", - "gix-trace", - "thiserror 2.0.17", -] - -[[package]] -name = "gix-packetline-blocking" -version = "0.19.3" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89c59c3ad41e68cb38547d849e9ef5ccfc0d00f282244ba1441ae856be54d001" +checksum = "fad0ffb982a289888087a165d3e849cbac724f2aa5431236b050dd2cb9c7de31" dependencies = [ "bstr", "faster-hex", @@ -1438,14 +1425,13 @@ dependencies = [ [[package]] name = "gix-path" -version = "0.10.21" +version = "0.10.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0416b41cd00ff292af9b94b0660880c44bd2ed66828ddca9a2b333535cbb71b8" +checksum = "7cb06c3e4f8eed6e24fd915fa93145e28a511f4ea0e768bae16673e05ed3f366" dependencies = [ "bstr", "gix-trace", "gix-validate", - "home", "thiserror 2.0.17", ] @@ -1479,9 +1465,9 @@ dependencies = [ [[package]] name = "gix-protocol" -version = "0.52.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f19873bbf924fd077580d4ccaaaeddb67c3b3c09a8ffb61e6b4cb67e3c9302" +checksum = "6947d3b919ec8d10738f4251905a8485366ffdd24942cdbe9c6b69376bf57d64" dependencies = [ "bstr", "gix-credentials", @@ -1516,9 +1502,9 @@ dependencies = [ [[package]] name = "gix-ref" -version = "0.54.1" +version = "0.55.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8881d262f28eda39c244e60ae968f4f6e56c747f65addd6f4100b25f75ed8b88" +checksum = "e51330a32f173c8e831731dfef8e93a748c23c057f4b028841f222564cad84cb" dependencies = [ "gix-actor", "gix-features", @@ -1537,11 +1523,12 @@ dependencies = [ [[package]] name = "gix-refspec" -version = "0.32.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93147960f77695ba89b72019b789679278dd4dad6a0f9a4a5bf2fd07aba56912" +checksum = "7f88233214a302d61e60bb9d1387043c1759b761dba4a8704b341fecbf6b1266" dependencies = [ "bstr", + "gix-glob", "gix-hash", "gix-revision", "gix-validate", @@ -1551,9 +1538,9 @@ dependencies = [ [[package]] name = "gix-revision" -version = "0.36.1" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c5267e530d8762842be7d51b48d2b134c9dec5b650ca607f735a56a4b12413" +checksum = "ffe7f489bd27e7e388885210bc189088012db6062ccc75d713d1cef8eff56883" dependencies = [ "bstr", "gix-commitgraph", @@ -1566,9 +1553,9 @@ dependencies = [ [[package]] name = "gix-revwalk" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2de4f91d712b1f6873477f769225fe430ffce2af8c7c85721c3ff955783b3" +checksum = "dd2fae8449d97fb92078c46cb63544e0024955f43738a610d24277a3b01d5a00" dependencies = [ "gix-commitgraph", "gix-date", @@ -1605,9 +1592,9 @@ dependencies = [ [[package]] name = "gix-submodule" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bacc06333b50abc4fc06204622c2dd92850de2066bb5d421ac776d2bef7ae55" +checksum = "2b79f64c669d8578f45046b3ffb8d4d9cc4beb798871ff638a7b5c1f59dbd2fc" dependencies = [ "bstr", "gix-config", @@ -1638,9 +1625,9 @@ checksum = "1d3f59a8de2934f6391b6b3a1a7654eae18961fcb9f9c843533fed34ad0f3457" [[package]] name = "gix-transport" -version = "0.49.1" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8da4a77922accb1e26e610c7a84ef7e6b34fd07112e6a84afd68d7f3e795957" +checksum = "e058d6667165dba7642b3c293d7c355e2a964acef9bc9408604547d952943a8f" dependencies = [ "base64", "bstr", @@ -1657,9 +1644,9 @@ dependencies = [ [[package]] name = "gix-traverse" -version = "0.48.0" +version = "0.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "412126bade03a34f5d4125fd64878852718575b3b360eaae3b29970cb555e2a2" +checksum = "054c79f4c3f87e794ff7dc1fec8306a2bb563cfb38f6be2dc0e4c0fa82f74d59" dependencies = [ "bitflags", "gix-commitgraph", @@ -1674,16 +1661,15 @@ dependencies = [ [[package]] name = "gix-url" -version = "0.33.1" +version = "0.33.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c79b07b48dd9285485eb10429696ddcd1bfe6fb942ec0e5efb401ae7e40238e5" +checksum = "d995249a1cf1ad79ba10af6499d4bf37cb78035c0983eaa09ec5910da694957c" dependencies = [ "bstr", "gix-features", "gix-path", "percent-encoding", "thiserror 2.0.17", - "url", ] [[package]] @@ -1708,9 +1694,9 @@ dependencies = [ [[package]] name = "gix-worktree" -version = "0.43.1" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df3dfc8b62b0eccc923c757b40f488abc357c85c03d798622edfc3eb5137e04" +checksum = "428e8928e0e27341b58aa89e20adaf643efd6a8f863bc9cdf3ec6199c2110c96" dependencies = [ "bstr", "gix-attributes", @@ -1727,16 +1713,14 @@ dependencies = [ [[package]] name = "gix-worktree-state" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046efd191ff842cc22ddce61a4e8cea75ef7e3c659772de0838b2ad74b0016ef" +checksum = "9e12c7c67138e02717dd87d3cd63065cdd1b6abf8e2aca46f575dc6a99def48c" dependencies = [ "bstr", "gix-features", "gix-filter", "gix-fs", - "gix-glob", - "gix-hash", "gix-index", "gix-object", "gix-path", @@ -1799,9 +1783,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ "allocator-api2", "equivalent", @@ -1836,23 +1820,13 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "http" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -1893,9 +1867,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ "atomic-waker", "bytes", @@ -1927,14 +1901,14 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots 1.0.3", + "webpki-roots 1.0.4", ] [[package]] name = "hyper-util" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" dependencies = [ "base64", "bytes", @@ -1958,9 +1932,9 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", @@ -1971,9 +1945,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -1984,11 +1958,10 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -1999,42 +1972,38 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -2065,9 +2034,9 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.24" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81776e6f9464432afcc28d03e52eb101c93b6f0566f52aef2427663e700f0403" +checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" dependencies = [ "crossbeam-deque", "globset", @@ -2087,9 +2056,9 @@ checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" [[package]] name = "indexmap" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", "hashbrown", @@ -2097,9 +2066,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.18.2" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade6dfcba0dfb62ad59e59e7241ec8912af34fd29e0e743e3db992bd278e8b65" +checksum = "9375e112e4b463ec1b1c6c011953545c65a30164fbab5b581df32b3abf0dcb88" dependencies = [ "console", "portable-atomic", @@ -2126,9 +2095,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" dependencies = [ "memchr", "serde", @@ -2166,28 +2135,28 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" +checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" dependencies = [ "jiff-static", "jiff-tzdb-platform", "log", "portable-atomic", "portable-atomic-util", - "serde", - "windows-sys 0.59.0", + "serde_core", + "windows-sys 0.61.2", ] [[package]] name = "jiff-static" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" +checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -2217,9 +2186,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ "once_cell", "wasm-bindgen", @@ -2293,9 +2262,9 @@ checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libflate" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "249fa21ba2b59e8cbd69e722f5b31e1b466db96c937ae3de23e8b99ead0d1383" +checksum = "e3248b8d211bd23a104a42d81b4fa8bb8ac4a3b75e7a43d85d2c9ccb6179cd74" dependencies = [ "adler32", "core2", @@ -2349,9 +2318,9 @@ checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "lock_api" @@ -2415,7 +2384,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -2562,11 +2531,10 @@ dependencies = [ [[package]] name = "num-bigint-dig" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" dependencies = [ - "byteorder", "lazy_static", "libm", "num-integer", @@ -2675,7 +2643,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -2776,9 +2744,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ "zerovec", ] @@ -2980,7 +2948,7 @@ dependencies = [ "serde", "serde_json", "symlink", - "ureq 3.1.2", + "ureq 3.1.4", "walkdir", "xml", "zip", @@ -3043,9 +3011,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.41" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -3284,7 +3252,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.3", + "webpki-roots 1.0.4", ] [[package]] @@ -3309,9 +3277,9 @@ checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422" [[package]] name = "rsa" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" +checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" dependencies = [ "const-oid", "digest", @@ -3355,9 +3323,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.34" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "log", "once_cell", @@ -3368,20 +3336,11 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" dependencies = [ "web-time", "zeroize", @@ -3389,9 +3348,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.7" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ "ring", "rustls-pki-types", @@ -3450,7 +3409,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -3508,7 +3467,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -3519,7 +3478,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -3740,9 +3699,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.108" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -3766,7 +3725,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -3858,7 +3817,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -3869,7 +3828,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -3916,9 +3875,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -3965,9 +3924,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.16" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", @@ -3993,9 +3952,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +checksum = "9cf146f99d442e8e68e585f5d798ccd3cad9a7835b917e09728880a862706456" dependencies = [ "bitflags", "bytes", @@ -4023,9 +3982,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" dependencies = [ "pin-project-lite", "tracing-core", @@ -4033,9 +3992,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" dependencies = [ "once_cell", "valuable", @@ -4053,9 +4012,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.20" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" dependencies = [ "sharded-slab", "thread_local", @@ -4097,15 +4056,15 @@ checksum = "7eec5d1121208364f6793f7d2e222bf75a915c19557537745b195b253dd64217" [[package]] name = "unicode-ident" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-normalization" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" dependencies = [ "tinyvec", ] @@ -4124,9 +4083,9 @@ checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unit-prefix" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "323402cff2dd658f39ca17c789b502021b3f18707c91cdf22e3838e1b4023817" +checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" [[package]] name = "untrusted" @@ -4152,9 +4111,9 @@ dependencies = [ [[package]] name = "ureq" -version = "3.1.2" +version = "3.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ba1025f18a4a3fc3e9b48c868e9beb4f24f4b4b1a325bada26bd4119f46537" +checksum = "d39cb1dbab692d82a977c0392ffac19e188bd9186a9f32806f0aaa859d75585a" dependencies = [ "base64", "encoding_rs", @@ -4162,19 +4121,18 @@ dependencies = [ "log", "percent-encoding", "rustls", - "rustls-pemfile", "rustls-pki-types", "socks", "ureq-proto", "utf-8", - "webpki-roots 1.0.3", + "webpki-roots 1.0.4", ] [[package]] name = "ureq-proto" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b4531c118335662134346048ddb0e54cc86bd7e81866757873055f0e38f5d2" +checksum = "d81f9efa9df032be5934a46a068815a10a042b494b6a58cb0a1a97bb5467ed6f" dependencies = [ "base64", "http", @@ -4241,9 +4199,9 @@ dependencies = [ [[package]] name = "version-ranges" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8d079415ceb2be83fc355adbadafe401307d5c309c7e6ade6638e6f9f42f42d" +checksum = "3595ffe225639f1e0fd8d7269dcc05d2fbfea93cfac2fea367daf1adb60aae91" dependencies = [ "smallvec", ] @@ -4299,9 +4257,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", "once_cell", @@ -4312,9 +4270,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ "cfg-if", "js-sys", @@ -4325,9 +4283,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4335,31 +4293,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", @@ -4381,14 +4339,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.3", + "webpki-roots 1.0.4", ] [[package]] name = "webpki-roots" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" dependencies = [ "rustls-pki-types", ] @@ -4424,12 +4382,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - [[package]] name = "windows-link" version = "0.2.1" @@ -4438,31 +4390,31 @@ checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-registry" -version = "0.5.3" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ - "windows-link 0.1.3", + "windows-link", "windows-result", "windows-strings", ] [[package]] name = "windows-result" -version = "0.3.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.1.3", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.4.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link 0.1.3", + "windows-link", ] [[package]] @@ -4474,15 +4426,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.60.2" @@ -4498,7 +4441,7 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -4523,7 +4466,7 @@ version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link 0.2.1", + "windows-link", "windows_aarch64_gnullvm 0.53.1", "windows_aarch64_msvc 0.53.1", "windows_i686_gnu 0.53.1", @@ -4632,9 +4575,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] @@ -4647,9 +4590,9 @@ checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "wyz" @@ -4677,11 +4620,10 @@ checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -4689,34 +4631,34 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -4736,7 +4678,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", "synstructure", ] @@ -4748,9 +4690,9 @@ checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", "yoke", @@ -4759,9 +4701,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "yoke", "zerofrom", @@ -4770,13 +4712,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.111", ] [[package]] @@ -4806,9 +4748,9 @@ checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2" [[package]] name = "zopfli" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" dependencies = [ "bumpalo", "crc32fast", diff --git a/src/repository/local.rs b/src/repository/local.rs index 28504fe..50f8b90 100644 --- a/src/repository/local.rs +++ b/src/repository/local.rs @@ -1,6 +1,6 @@ use color_eyre::{ Result, - eyre::{Context, OptionExt, bail, ensure}, + eyre::{Context, ContextCompat, OptionExt, bail, ensure}, }; use itertools::Itertools; use owo_colors::OwoColorize;

@t_^MC z`k!91yA%C0VfY)QmKy+REKd{<)xba*W@&cJM4XuoZPf0l!|*&gL@L;tMVjF+6TcZ_ zQ&VtZRTDu}Ll2RxW-Cxi`J2RVRy1-GeKE95okNe?3d9+&-V|pqAuW3-hH{N)=K4F` z8RiDKu&622V*KYhkzpoImLtuCHShK#S?TEPQPsro6ixn7@YypJf+=W28#R_QOiCXn6}?pb z^F)((`n{5lWrA47q7O=!qwn?7$>vzy`S(q1r-S|$|8G6zX<$Sn^c0xs_@DE^dbjdH zZ_l}YD`3;Cp>0AVIXWzADZ13hBX1wJRP4_OOZGb1ky&nPQNMAtc8kC5Z{*#ibBp2R zcE)r0T(V*nUFxErx3522>~CtT6~xX{noUINb#fKmdU7wb?D1Hl@ze4EWO3O!MfxN` z4E_+p(C}QHOh-9eyWL|DV}$raL>i+bvfXnJO{ONYb#4(KNqqcO|CGpAlsUN*uemt6 zo!E#aP%y??RG)UBl*0TVrC%$SsQmc0RS9mSZwwMQ%HEOxz{M%nJe=UlqEr~CLm*=y z#i3DRETSQw9qO=Ccd8RDitG{|H|tGYa@g*lA1_RKk`EmeiniGtCoplXJPq{-M=Kwx zYQ)3fM%rSClHP3HAlPUGQe{0O2ofE0+OWod$TzJBre4yj|i*5bkhZWb^A$@rx zeoBCgptTErc&Ot;%C=Y2)UbRE(UT2M{fn(FJZ{0Yg zL^a>255AF)UWJ|h{aZIQjq~1KkQL(wF|iS&(U$Vh>d0gzgo(tN95Gdj8ZU7i+3s*p z4XqFT)_uX9SG_%9d)9$H#L+>yQ~vO(^3`H(J-}g@jC;RES&$q=gs16NZ6CT?T}6q zYu7W0)}$QUt#xiGx`B7iqCPLconEb(W`ONcq|?)0;`H;`oMiN|8fzzL9v6i&g6es0 zo8txnCv&(`f2s_ro;MdNKdu+EW2`d8cEb*S-5y<4H#&*DX{v~9FwLew*;r|I9;Mj3 zx10D9J=}NApgx~S-mvgHkmVts`qg3ze8y4H!lErc#E>#9#IOr*wmkMv`W15vA8p8C zSV(oNgJ;{rJRfb4B_FM&li3>_gaz((dMJ9U@u~g91m2)nFmnlz((%2kUB3r9JHIb} zy-eeK*HICX^;PNZ!f{_RL%Z#K%*XWtogUQQYHaEQoQOQ}Ln)lfuia1zeJ3HJ{X%JT z$&9@@E7>@5xx~fLkLz-b#5ysL+x@##uS$NTv%L+^(w=URVXwW@6Q#(Ar3PcybVXFi zCNBDaG+%?HOK#r3M!Fpe<(*W;DQDzK)=yaV@$;74R*{s=G42_pwmp9*#TrhRaZvkJC^pPx*Z# zL4Huf{PNH1#QHSrHd`+1-4t6Q+{(CYq2|KVE6U0^ljmQ4O9a@px_1LmV`Y<>z@s(N zy++F5visge@IPi!;vDMLiKOy_)5eSc7iDka z59Rm%k4GdFp%Su}r7V?@Weg!Arcz0^3XQU7-)2O%?2+A!q_iRXZb*@JLiS~pW$c3) z#*A6M$LsU{{QUe`Ty-$s9iMDI(3mxc4LuOv7^ zyGKmaMvfl17*yN-sWxfVi%YjGstu=NOvoXb^qq(FmZH#AjLSYN?W1N z)=%11*0;b_>`1Zif#Wc>idafUre|P9P-4*TjzY3iCyS zJ@}@rlv_sD&W8i5KRd{R)$FlEKXFR(AC_yWjo3#Q?6fw$#t*BNRe$HSXt7eTuT;Ke zy;%l+Mp(PvAF98(by1zK{dBgHZ*i@2UQ=W5m)~cxs-_}7b<|eU&#BXW(32~HTN&V4 zp1>Vu}*+7=mwFPX+wLq`5b4+FW|^^FZI@$Q30)%nfGr!|mdAZ0{iRQ-E@f z-DP^+#OAA?_Y7v6p3s$1Cdnd6QEv!_Bkl{g+53j8H>MJva)q2W`gfM;^sPS0nxIo6 z9q9Qo#9M`;Y^}3d$Xdj6UXU^;&d;en^iM+muaYIIk#02>pgP=HpV$F)r!fV(i+&|N zUi5Ky8E|Twm5=l4cu`Gv5yN%J%kp7#5d&9?xMg1}iBy{p58{F#vJ>CjiWvdb5d7(2 zG5uz}CYu0lC)M>UzpHQFa9>=!(|E7WW^~+6tn7;Q#LsHUi6l2I9koQ7=~-yaTZ`rG z4BjMl^XlRuacp%L%KYADLJHmPC_*@57vW4xw~lHO>nk-uF@+k^;y z-!a$^R}4aDH>Z>SBJ89f8FiM_Qq+cqXWbt3 z5##U&3`x7`Bcou$shf8b<0$N5OM#Mc_yc)58BG}iwNN+)*?Fd3u;VXNeQp~$q;d&W zVJFTgBFe!P83p;j;TZXQuq`=A?R=TMWu< z)@ioRLv!fLg%?lzoa}Y9o8daM@v{ZA2AR!;BG11kGL9xGGke@(5DKO39gGL$JZ3S$ z^y7IMrg!>*XG^w!_?MM44*ViKtABdMFRMYp&$f0o=oZpBmtdtV!i%>JFyv{$7eaCB zGU=$QMY-aqw!x84?Hz{J8>GBWbBYM-+5F& zGIzDQp^o)b(~2~`Q5fI3_taYBADpF9=@g+X_EUYw?W9G9@!j$BV{TSTK|7C&Er;tL zSvSY$b=i;kMT&m-Ywdf*-9@uM(7D2pa%JZ%vN|VdzN1`G2p-%~AxSaC>bdH({!Fzn zR68?Fg~|BwBnJ^*dW5H9F)Wn+`aKl&co=bWT!tI=-W3`(f(f zV{WHvQTc0`nafsKX2fL=p3tvFc^R4QPgUB-muC4}t`8Kw*U9;H$qTNyCdG-aaUR|D z8gz#+y59?!ace9|Ej`?;8P62@kTkq&uy-{(W&tg*)T`278|TcZV<#%U)kvAvs8$_L zR#TVcK9hd=i-evQzv)!_?aRl8=nf7WDG#F|qfdGLCL$PRxAuD6+*-|pzfJJ3a{4bL z>Q8f4*RU-;H>$0uh)~>fh;=HcQSyI~-q7)nQ|ChU>4f|LMii-;PJ!?1CQA-2n1>~b zdAkSj<@FqVrmpuw%zN4at8%FkeHMHF+o0HLHOEs_f}0EXfVRklpMo*5=l+MlCklhw zDjB`nri;bhdFk`(WdX*hGN;$@*j?X~aF5`75Ydd`G|Hr0_)F*$LqlywKmkGuqe~7lckLg>6p% z%!j=kd{4C9ve9GBqr#Gk11@Y?%&;XR=j5o%7?VSCi%yJ#AH?743BTI)br5Nj=Deu? z8S{G*_O>qPs<(1vyE#`vXmXwX*-H)^w;iAcPXZj3BYo}EWdeW0xBXq@1%a@0r681LFSFVWB9Qkq#JzNvFCj!h}e&3OI@VDirQno_I?;~-);Ian3K~>bzhAOaAfvAc_Sgu zrJj0Rh`96Q`6b=L(wwhLk{^q*a)sx5B+fj(R;sS=pYvfbR0yHGX>9$du+#Xqigy0B zpd3k)OCkklN+nI6IDXObey77<3_Yc?W8Uaj)o~=t&O0pL!SwT)%h9aI+;})72KXd~ z20!LG>OQ!wm#`^tz42V^aOrDp%fBo`rJs+jN&Y;1%X`|b=X&hbw4QkVo1H?&C#Bce zQs0UUiM=WOUU=;*-&K0+slRJKR0f`Xj1k=Cco2R}6~3l-dy{p_u`U8El$W%q_xyn5 z%^Yh9sxJH+dx7I{303u-#Qxv!9My8}qXoPlMVq2<4oa0@AdYvF%8vKI;;XWYGsj}|Jfd+p_d8>L(iJh}Fq2E2 zJ?FgB?B6}E*1zK+1HRg>R+D-qUM}A4uDA6+A);~e5B`2|N5qXDjhw8#MK{?!32%qP zk1BejoxNYmyx48mE)aNR#+3Eg||DpmyM%_S1L5j8FE9U3`!klk%=GQnJGQlI&3W zjF{$=%8SO8R>-9*{e>@7vn?w+`>#9bM(L^wi~S?>Cta4P?+-uKo$_SrbWwJ$tfmI+ z$X6l$-ZW=T(&cF1=jq1`wX%Gd^CPtqwlxi|pZj%4)1dRz$TbH8vMW$fX(RW(>p{Ik zp$p?Wq6Mv)?)Td5o-gYf95s5I(Noa=_1*brf3kJnm6L=Be$-GEN%c`Vv8Ao$@2t>5beS1+RoNQ$Rr zQG=)7^yMv-?ZasOhEM_o}He(wZc)65Y{) zT+<5}#Vc?-Z@Z6UXaeu#y%}uIEE%huTQt3(?2J;8&F}NUpW!L}@WCr3P$9(`f1|eN zvgDh|4|E1B6Q_H~a&~g=y$J2`dGwnfCD}w$z4{yG&$-*uC~&V4yA&nO(TNzVDeeqqm-tYR_rj=+ik^oFDSBb8fCdLRz-;QlPp}V^X}m z5rts!l=0C4-Iu&{s+VK_X)v{6$t&SEMzmsFA{$*+Ds0mdRa_u?d@jr#cQ1KM^DD6{AO^k(yYEFp9Ytwnpg`v<0P_S zHt(8ai+Q(~S?Udx5fLde-;h9x&$C~x>pNGE%VRo6bq1t>C!$g8^}0g^%?NkX2yeFy zifAn-WbAd3Lv4vJEQ;ia((FfX+L>HKgaYL!Z^NGgTjwicWssm`f`z7M+S<`0@(I@$Z5Hwv2}hey^nF@_Y@=aQ8h8Ba9_JAb~Jlby#eBHm0r z34m%TFK)UQ&i|UuKb^lVyHn7lLsOZr^2tR(e17JUw8ssZ%AV^cgUIPeTep%>kmQwjARz2RMP8#Pi*bk`Mg1~l!Wn_er|Aj9B$sX^?<5YlnZ;wC zMp+Rrr>4)UJ+{%^F{KnaH@k(lA0fQQ_ZNL)kTTZhueP61>stw4o4=B`B|y#$i&ruI zaPbsen&XE~7@T3gqT*<`z)Acl=WEH|-3&&o{-}70H#prxrhzfnKMy-N8KiWXnAG z8QRMA>Vrzg2Nge6Mf)y~Cu?GEyH*WNDb<$UP&bUuum$4dXkV&4%*q)by@(jmarVF= zj41a`Lgy_9NXOp=G32h$0)6&V^=E3WQ3sxXDsgNz0u^Sn%qki z6t6=nr6wv)HhSi4lK#Va!VHOt%w@Y^nEq(-X)toZtBdRb9_j+@#Y|(bttrj*`J47O zY8(3PWWsKln^eo-xd(z;_<9I|W>6-+^ z+JZuh`Hr9S*wbdzOQ4FJbkIKRXw3N;an1n(|7s2CoQ|wR4{=6(k&J}9W=2n&CMtN?FXjsIkIMm zAM?h;C`j$76eP!764F4>23`bh805zc;#m@cBk!E0Vy$<&8HGVd|7pp~Vn-K?b1#ab zFSKKx{e>&iPH;DCx<3~5!rlie5_aB-jl^KdU2waHaj)FyoO=zvNy+tS#D z&t}Hh-RFgv#OEiLghrAX*SaPEY4<|(wYo%7d`B{BTIu_)rIWS1Zh&9hgET%ys{tZIGpn~Rrdq$3}QL}INj(xipAZ>GrG@eni*&qgJx z>{3$EtvC;_Lr}UIE4}^*1EKDCxUY1DLj4L}z9Ym^EwP$>om$G~NGm8`OV9{(*XO1;|>qFT~68S?OIsLa3qo^(t2?o z3f8|9Isc8x#NaC>Ab7SVbcl*Qthwml<~(b2=Xd}6yJM#jRP6j=>Is#OE1`uRH{e#0s}{gh!J)>J4<;?@5(^-nU+azml1_K8+?G}7?}AW&|Si#KJ{ zqhbTE5CT`iK!iHy$u-JzT+2*F8g(!!-sA_MJBSk`T<0nw18-7SvuOMc+=-0tVnyh>3cxKA?h%Bw5}@MUdk0 zlA-+b6hM%*kSP#~x*t!9x0Ikqr;Pw}i%VgU)0Fjs+B2l-9&(mox?dqwFAz)@)2B+O zl>)*elJuN358a@4bxAr|UK})PBux*B1pkb_H@>R!YK%~Bfvem7QufU$T0Ge^Fnn3Q-0~RWWM_-cSJq&}M7}XyI zoEii@hM9ek1SbUtQnww)fyj8J>1T#{0C|oS1gi@Na6RvgvC|``_xDK(qPiDm@!$S1 zMHBG*8zi>$X^g`LNaoF$AH7r#mgP30q9e5QN#pPh!=U!T6b3x40j&FUArfWR0RbLO zX8@@iC<%OAJPGq|GMW@WB0{2a+H;OD7$&G;7L&n(E zGb2DiBFTu%tpvcpfdPy;SW5Xe+*xqv zX4+U0CM^~xw*pc7K6Qw-*>?ZagjmqaCkicER9SFmW~5mW=9M^pJ&5223yU~-Y#HnN z&Sqe0SgF89C@bPYON9xg@mh=e;aw#b;HfRTcN_2j-^5^cT47jG8Zq!~SO;53X&74Y zr@iDaI1BD9pvm(lob1GECp}Xi#>=@Yxj!}VZb-91i|_vV4tDLPY-}iNvrP*Jdx${` zj62}oQS`{+T^SbK`57bj$vR_C9j<`XFpm>}iIT}qyckRAv5f@QW}_Bf&VXgx5R~#v z9J{v6OfY+H=uB*2aaaxauG;=&YY__VV;K6x#-HGQPDi+QW5Un^KQS+{Ic#A3LDpu| z78qARS5tV<`I(C>IGKGJU2Rc5TpKKp-ea>7*f3*7+-&))qoaHr$PnxV5c$)8-goy& zDY1z2dCntr>?LMQ*+L@1fGjy#fcMrw|Mf$K9Sf|g-tgwX?g^8co;ATaQNG(SD zY*5C{b-;uO*5>>;Yy*49yM20%?s_`h0XJG;hj-ao$PkGuO8d*;V7FQN>s_U ze+a((x@VKX#y{EBC5;>8mEi9vvG()H45R-%ag{MsW{iT#W&YUfnBF zyo)i~5a&=0T-$Q0AHA5Q<+66Y0kxR`+v;{1Obyv1w#u@TwP2imrA4btb+KY2)!_dl z;1ntda1fO?B@1Drl3;c;+fw63+Kg5nOEV;JFDzeFWCo8PWcnllI`{aH zqC>8lMtdb$2tnIZqy=(AsYj3)BlJ8TyX+RyKuws~r4~=@uC*v}BL{*SPnzd=I(!aD zWQI;^uvntRXO*pX|KKUqdF73jH&j-P-BaMTBF6z2X387gPB&Y~T)VM?yYp3kT4>mG zE0(Fpf~(Q@3_ZTlX@7DuDa2|cG&c;rcd5L=!B5)$njiSt6P*i+%(ee3Zi$KlsQ?7%Wt1%wf<6JRxCcG!2jGfx-TEhZ9cP zFN~bW9>bL=c*J;ErYDh*utAF$QoOP*wJA*y$Wx~fY7oc{oOlF@L%tOFRY7UG^?$*X zBWjnTeP$*&YImeGRX^Ns=?l&8+KG*n(yi{Ae&-?ZYY+=rlecPxd+U`Upwv?;+ ze8?NLN2FHDl>8UV|2rDP7)S#d@d1^R^|_*=U|A@7WbOE*KQaO9(%hGX*;%3OPGI^l z>mwm;2peYKGDUs0<7WU_eRt26ew2a0BJ@4&tK+ch>-;3FKWE8Ec)*AC1u{IhfkMw> zZ=mccPAl&6OnqNEJDzzP(}@>p?u6mRUNrBh>OiT&7+VNq{}4<1O4k5rrf8Lqbbe=J z(7r4h4V_>+-F!AcXG5`d`=2#!_M8D#V-?!=A6CcRr~{$8R5vIcstSTsy$9!d1Y5|4 zHI1rGQ`FN^{-wSvg3$30*dUe?$qio0m?j7i6{Z)KgxA^$*<))W^z9`=aHp_FR1rB4 z@!JI@=)V6GINJPw0%uR#kA!h4h?DcCAUewwGQ)<^Am^>6inbDuf~YCFgugir(v=ls zXwudxfcb@&yhoYcKoNb7nGz6;8c+t26rC={7XXKNB|o6A zUXUFax!KJ9AHw;WMgW@}ox2=YAyTG1r_d3*}WYq!Lf$)T3GR( zxB~WYo0PCHUT)yx?YGDw&G&#mr6q$v=}8s|v6GwuF7|EkrhBpMh@NsO{YuL>gxUS% zy{+|{4?yT7Ytl7Lnw>iAKItBiUg=vx9Y{N8i&7ZRy0Bos;3>B8B2ax(&61emeK$L2=fu46=#4&js|-cqWh*JfRVf4<}$kL)hYAkOfyC( z$%_SdsR;*eLgzGGo{=w^~S9nHq%JibWgB2kmr=r6@L ziH}B-b}8RDmd5-+q+7ig#5oxiR0oE4qYsNR?IOnJk2rTpPBa^3 zN1!#3E`UIwXq-?eOcGL|e+B6C`Dn`C_UQ$@_4K1w;+HmBNM?}1M#$D-C`!PHZHL!r zm(p^Gt(B60dL9Zh2e=-f>3OUpFo<0_X23)e7q!iZ9V?Q=wW^f3xlQR{VjmpUjxWUpq%u2(B@$bWZJj<7K+bZoJPi)4!E z!V%ihT;ojeLKeceJ@;jCbjb=b3G#1osyqf^cdQV)f~HWCiC9|5sO)co;G%=P91-4T_?nH@739vnyD}4bM=T1{6g?6KBWde-ro@8<3Kz5{ds z$Zseb2$0sJyxZZsBN)zXK+V~6jwW+J@6jJjLj*&}eSN*#NZM%o>J&v>3dH2E#bF)<#0sX-A>ZL1Y^iran*+ zlo?5i-Mp8K8q((-kZnIt0p~K9*M2M06J|n7!gv``Xmm6}I>2sIIXom7=4nq9gF;=V zXYp`FFuC>=FvoDxS1~o9w<5S%ae|#571rE=Wm*t6iO6lt*0u}t?r#)R1c@=^O^X8t=E`oGJk!18d z8UwsoUXe8Le;^6MFWoAH+fX1(TJK)d4242qXO=OWT1xJMoc}k0<`0-+G|XsI{aXV` zI`%k*jy>8p5rfP2X4U%QO$#vRA{DVwTcL*&$-K0n=d}F;>(bcv<{6M~Ec1r%1r>sN zq&O|;-yUyka4z%MD25(AqtVF`61vP0z8A^MM$ls0%;o!0LDja$>}cEDUjbUSbqk@r z{Bfr7*dmsj6bzjskb9y5;T?ShL<3Zgrmp;#9S04&w;;#2;mnva%` z!RJb#eA^Ef}!1+V;~hfYr7=4=f2_n-rHSA>@;V zIC&yba_YMqwuybe@X-)~!Le}H45@QKQKutI$#NlddG4AfGVEW6ibkwB*6#)4X1<5X z0>R(5JiqxYan{RDQcjS&2EtM8nUm+qg+XXq>~5=w0xAAUAjR&1jBjM{H1Pk|!Kso8 z&k1h?7;I$1ms=#TOBLp>8Cx-*BdEg*@|&${-E4p=p>@R@USn`;mR!p@krV4278L4L z?wTp`d#>>pU)Z*Lzq`@zzd&T@;_}*Y1c~`w9ru{$A>uXMOJih(U=UuLjIqsdAy5kd zac{5r2^4JQv86Hk)ZqcyRje%MmQ@Snq z3mJr{FO>NPP8du$j+Zl$L+a#es9R1T_X$ndR~c^85`Oas50XO3Yd zLWLTXf&T}w;(RF)paQ%wqE4aq+D)aA4I=#4cQ>5i{o3u|_w?{xf7@yQCBPbY9_WSoaV=L^Bzu_ag`V8-2KdQb@DH3tyv#GFsn-W&RhfNQcqGs9 z=l#LnUCKcoiKMv9sp9|=F7lJ$Y>l1Y-3Zo-lRMf*ErK?(wd?z@!vW9g^O34;C|>gK z+3lWh_=B@2RCYTWLZW8s)gqA7d4h}TPNRc^J?j;h_F??_0q_6~Eud!2M-Wu9b?sW9 zD=65>j}R$iD{D)Sn7kVPO%O;t+K7t#MrZ~ALoJMF5bZd7rFI`+Br~pv;8;NA#E*Nq zE^=bES7CCek$Omvd1erW;@O#&9RxW@hIAc8ay6r@9C|W%;3J z0q5~S3er%T3&5OU--39lM|J)roY)uC5f#ExTVo-E6k+Qi8RG4`~A(vtDBQu0Zp|`)H&=3y5r*BT3 z1i+w-Li5=-zF~|vuOW>QV#0^9 zxeXM((-^y+1lXPBezn_SeSW4pZkK}jWV|tH-69zB8VxlCd(;fex2Ioc1bW#WgKe_v z?Nx_~Gq>1jyDm@=sW*$*=oHxItPt%oM(0Rqw!OHY6y!YF))@Uw#USY3dN5Qmz>f5^ zl_yfnTG>;zo_L` zhvA4R!lxYy(92>;eMv;&m zt9ih3+zZ8@&>^6#A4S4F+HZvX?!aOt(KGc+vm;*`Z|iAE&s4FZEZU)^5GNW@Q+&w^ zSq1R2$2kF;kuJ9Fq8l4J#w`=wXV;m$=g+M!Ig)2pPtf*A4+`OA0QNx*>;!Fg{LIY6 zIbbjyz_`flLH=i%jrSF14&DuC!~>}deP*X;3F|>^T6l*x&~2xS|3afR5=pCp-JAe4 zoEfNit_^Y-^tGUSiEzL%$&mKE$LdUNpVB`(^A?MEb1E9Tw?2o*A^=A7+=uf1vcTH> zH|zG47+#e1e%k@L^@M_PA7mEI>}Wk)#IyTKOH69GFR zY}8NNA*dmVD@np^*g!TK=`n)2*0X<57^v7Ic>|GyvKx76AI;WIl)wp*ZyG3sIE!S| z_CbK%z%3JL&uye;mZxZpzcTx-eOghj2Blw1I>^WSRb>FGB7PgWh*ziJH~!MpTM z74pVjDm(?XEwT@kEiyKUgLMX;xXPDkh98T)r!offAOswi^@E0$i-C)*3Z^W1)BsJ- zBFqC}uQm$xpn$dGqDiqU!odG|V{9=mwg=a1R`&B1-g0I+AY^9DJhlfF0e(g*R6H03 zY_&!@^d;RAIQ@~7=G6bCX$RBxbLkODkdhq*(z#ZML2sFX#(@Ex>3`Kukpblopt_-= z6GM8ly2l5!Om+ZgNKpa}-hqs7K>&P$`mN|!6tL30l;)W2{f*`;M4M7Th@r_12!2DT z0`Jbc7w$2j|TXeasgaq@&{&? z;R66n0!jH6sISN4CFnd)JpQY(L%!628he1`Kn2m6<-f}A#C;4%97}bnMOOQl-$BCa z0^j!>AYrWv-e1vkU~5$qAUs8p>>sYF{fFaL>+`{oiy*{*0tMe){x>+Z$88Ed@Whh9 ztSZ32YruI_)C0u;a3J*FjT73udO^b;_WPxGFf5n8Uq^$1us``i0>ey&|E(rSu+d(I zp?S8*TB<+rfs(CshZr1oQho-`zKQnu+d=rVUv$iH3E%T)u@_t@f;WVTSApQIS-eAS zLpjJ5)9@nl##m~?C%_IXz=wtx2UOPegVdU@|6lE+rzF4n?nClG7dD!Y1v=V}$B(lS zs?eZC3``phBo!lICK0~Jh) z7BF#e`Qkm1yU!2{C^c%0)(qGpe6smih$}W6ZC-V07c)J%|N$QjiIqy zz)yr+94IPhw*IGW&=+*slS@LDDLPrtL7^X9%H-HXf_i<4G~^qz3k(4PCTSI1dWLo{-yS;3sQIKFCs!|j256Q%raMzt3G=f5d;(SsP#4URFz#SJ`|E8Sd_`>|-@Se;c~*J~dudLd%Qed7 zQQ;yHyV#1_8v9v$|gPTU=hyFwQ|d)gqE@j-c0{Be8SBGNrcx;dE+JGIHx1(UWjrC9yQ_{L;P zH|Nrs_SM9bT^7gSBe>2O|JzLhn|57OF{K~0IW~P=bC3T}FWX+N(=`;w+?6e1{sWZN7WyCNNfOiGXimnX++C1a9qHnVI>r+M(79=XSYQ<~9d zZRXxY575^QX&Gq*ecI)D4nAo2vbE7S>EBJP^}*lsf*da7`)}Xz``mh}XPvWp55Cfx z$-})OsHie*>37Y?!b;qg(}?sCW_G2ZZB^IO$mp9zwBcEUvajVT+A?2O7oC59mlS;v z9$UOl@@IpOa9E$brn$})Db*Txudm73t<843^`!8bC97IzE7P0ywI3heDEI8wc6qpd zKmTiW`MY;to4QN&^&_SQNd5}kKE8)&Pwp5TBds(+^gQk-U8wx}B{&Ou?C>?IW1P#~ zn&F}fwI5%ettwafV_3P}n*Q1kdFHX$<<1DybeP!sa&FUwf&P55fs$qb3p(fi#cBcR zC$H_M#Mk3>YgGp7zSdZ8ue3V7-ARwBnlpZy=DWS4;ObGj>3>N1K}~I`Y2|WBU%u!0 zVp%zx>wY7@*Lc~6Ojk*lSoxu^e`o*U|3g?^tNo%iI!m}yw^x1V(7WuZAyMbw#XfI8 z@7z4q9~{J*U02?4z98p~rt{auBR)Pko60tqORHrAER(E4<5T~Z{PWma#v+x-mUuwvk!#$PhjwWvng} zJtnrw2ELFe^pw1!C*5{VOY?@4oA1x>QPjBmX8LB~is#-M>hbjOd{6mt?X2w-#Fj;c zk8PmwX2c66)d2XCt-sRpZBAL)%+E4v)?c^%F021Zy&%8yvZNp9u6DpD@P<&$4(Ss$?(o3VY;t2)s& zPHiwrznfmQXDxNl?sj>6PlM*rYbDiRV~=lTWan2NCIxyoAx<_1E4X%Jsrf>2_IE|@ z85sY{Zg_G^T|15zq|5DJeVOFP5v;(sF?6)4*D=z{xaw$oS(#!__9AhG5w+2kuiCcK z;DZsnTvK21<-2%4Sbg}jD=aRzY8@3qZq3D6`fzBN@hVoNJLNGFCESk-WbjMt=D<(R zRh^CcPzM1w6?w2gSh_#l|NhXL?{djH|G|MLGW=)OqS!0X9Dsy3NVlR4&*c7UG_?IJ zl<#D)GH)|5eay+p$ms2u`6!#~c1WM*UV947)K!PTzp^ksV#V88pj291x*Z+t`n6SL zSkU*=-&HWqF)wt9akFLD+{AOFc8vojYSm0*77bAI|kGuS28oNk_S8$?` z+ch1*k&h5n#sYZEr!k zb-M(0q6(s?dU|6;Z?CVe5*Sc*llpVZB2jg=?T1A{o150lxAh_dd_$W8Z1oj2ccU5t zvK;Sho941Nngr#{e4XiM?KhXEWauDYo+qaFcIM~5Yef7Ul& zo$FwYT?yg@Pt;g^){i>8ayca`u~MMwNrtoEOhI*7b&b#yBa+w@jCMja3O8t2e}2c| z!D?|!iz)2kKr2c`y!_7?#Ze9Rr!~u^L87PWV@?l0-qPwP+NG)X!H$}T63J%?@?k{B zLn+N?+iy88nD%$a6W+~io6c%6yv0D$vTR@Ev3&n>L3zWZ^7eg$e1(xeQb{~X<@$X0 zkH7X7JVyM!*z#^bd+Xz$Roz~mhJ5N9r|79qqJ9y6VQ@d%cyT<_|Zd#_eBs9 z6I=gv<9yfY3=K&7wvy)0-#YSCvBHnrT%~aPK9DB%Pz>2Mdi8r+Xjq@ zWtF|BpQ*m_$SL@l<^_MZ<6lY=%I}V3zGt{5x_KP0IQ`ko23Mz(R>vE4fqbEzf8xS$ znbMDik~l|qL&Y4tYiUyXUGdA^bfey?wW^-G!=gv3>MYK5KQ>K<*Jm5&G(3{Eu5Qbv zZX$ih=Jgtwqdz8PpP-v5KQ{86eBXLk#|53f&~5F0CA76x|H+f7o6}QO{gYF^%s%(K zWJ0bDc%192?(Yh5El7HLQB}2;n7Ep~}YF`Glf1Wk{T3;UW%GA8#u6@`2?-9#EYia47 zZ=Hg7qA#rI5hvH;6rF;f&y_>|>Ny1`M)ge~0&~hC(3d?^h)HdaJ)SyOZ2OjciJgVp z5XVmWa>9aqiP(EJ@`tU?ySU6=x(CX^disfZjxSDTe3JK@S{(Rh;mMIBj_bk|mG6fq zpL8?6SZyP`Clq}{vl^NOy~X1nuj|`p?s=Z^7GG+aG?LETyD#T0&im+DQq}o8?s;RA zxJx6|jfnhSQI(N`(!saKaweoAl}avJSAQJ*yaLa1@~&W4uu5CeA9_0XQ>3!-f}(Qt zq47!e{Y@~htP{N6^-r2ljVvc`Gy5m|jpClxsCn~hj7<6z?3s<9BX{~#q=MFG_U`q8 zALSh;oxY)N?!Gx6OV=>tAJ&wELW2UAD{x;?*UY#~!EiHLS7WU@;XJx2W#R_$JBzVlizZfmiu?KN+< z{$A4ZlZgq~?UUl!?q77QA9v>TTG-H^j7{R>Mbm90t*$z>n{>)PflbmnWO5qbY8ykN z91dk9xGbL%>rzlzZcLmy{;RCp51py#rgJe@vEoAYAE`1Yk7{`lOM&l`RgzzWkTF5) zH*2yc?ZNYccfR!=olhXX3Ve1ot3fUNuKLUJWla_Dku1DhDeutA-_G}0_}g2jQ&S#< zf}W&rcg2rX-4(xdo(^{&j4IJ`+;J5#EWgY9CQWENWku@?h4)^=X(y+(mEN9bDUR>m zbxhOmntv=F=l?N26j{DJ9u;NGeO?3)F`Ejpex5Kkz+@Us^$x5HRP^S+RvmTl54N>M zy1I5=Uaa7WzCDhy9jEUIPG-Xu)i6q_G+PJBLP5A3RQa%x*QP~8o2@0s@(0>`q>11r>L(e6jwuANDa zKBfb{m`9yS@r3lklB5l>&dl69E<7u^cVFB*uo_$S54J*#jOndE@(CYB<>|4-wJzw$PTmte8`=9Y z&IU*El>3sHk~yAZ*inD%$z5`d-1T9*ikAVj6OV;NUDp}B{4(Q9t&Bl8`|FkajrO*Au8&@y)F5DTZKB7wa`(WCr_o!_VDj1tGs^B|y zp5#k<;Qsr1x`@x~`9oEY>r&Kea-R-PLkrC78K{sNcY0B6b%IBM*lZxA{mTmWYYq_Q z<2!4s={`^O^&OqS(t77DY%cPfmYgn4mvxyJs8F7s{5I&Vfd1NRKCwco5TM6PBDw_h zpevEz7N8ED24B$c8>Q10FBEhd-SiXg=QAKCoerv$u7~uC#;hBYmJHB(K4<#>RV0w% zHiX3+K7s`e{8PO%DmDHFe2OLV{QVJ&C!k^dh&- z4-EsfDd|7~2frDVyMxaR`lUkv60^uwz#))lTv^+0Y;dU`&ljrGuOHJKw#XeTHvYq3 zSt^Pzl&`<-XtTveVv2$Njmp}SaVajJ3~WqDas@wCt)<$JLDCnyV@{6v#ny%|o{tqX zs;oV9;|E)TEPv>U{(lcHUMmq2@H*N*!XGNy|4&$jFEti*)#qHlMeNCu53$Cwni0-g z{aJw3af2JO4{StarE(TU0J-n6za%v?7PW^%XyBLCVaI)N>M<$4;-#ZosIL|OO5bEcSX^wSX zL)excBZtM_EbZP%w2o~~aQ0HpIqXHqj4?D&mI>nQuMtpO*AVcM?Kh3JyGF7Fl!gqx zN(7zlpT<7A*|w)+vf!JP6QgQSdUm`B%Cl_;EBM*uCDlm4-f@8Ri^NO=kr$c2B-4wZ z?UK}6PX#AC6Bxh$Y^)dA9VP6k4vpTZq(vNc z&-BCi=$HHdq4fB${EF+X$KNt$W<{}lbnSlSV~XpB$2X<=mHCHo%yXv= zCHR?PhzSX9fHWrw8pJhQ7=##-Mhr%d*_x6N1-!@TNBeR7bkTkskca5WTQHJd0WV)@ z=AyKL_*v?ye(15#+(q$NMyxZ#IS8^VJ+nQNOON~%1}IP48Ne}K-N;RtAf zH7~>14YK>L40L>TKN4gn+fVE74%#r1TWJ-K{K|p!DHEgd{Qw=DE0XK%f_kMF=aXuO zBA}n|@iKl{0aA~_OcT)Y{SN531xQ^69kqY-*DPAKcBRF(Z|>dONK}bgNK*TwKS@*y zhjQKIWgLb;{xlzHjDWJjz#C04Ynn8Z^l&f&x_pC|5u*a=wt$X>fe7ehQ(lI%A{bE& zI!XrgCnuD{q2En-8FJ^qs4UR=7>s&$9ZZvg9OCa4hZJ%kE0Y1&dVp*4Vyk%TJ0sS9 z+ATHkc63padf`~BxcoZ~uO6qs3_br$L7+=+Jx1f&B3jP~it1 z@}MI&A9RF)5v)Nm&B6v7O62Vs+vSzkhJld?f7MbBg0LO$v{Qpv<9T05fFM3-qoe~2 zNCX3Tz<{Y@4#L(0-f7<|vBo%OhynVzRDfV77!(5r9R-7^LlOS$pF55hSj3`CE)z^{ zCHWKpsoAnGw>E4HM)(&OaS(39c>Bpwho|4|ixgXWI)Ht2xU?C*_q`q>Qx z|39<)X^;WVJR8s_U6cy$F@k_F;24@e2pk5&4uW2Q|=(gq&V z)LRAO(p0a4r@5=-Z)(M~rWG_{f`LTh{KS~O*XVg|3Mwbhsrc1=AC-wL<2cbSc3T@W z_7OAt_3kO_4&;Fo4z325IyVx{RI|6NQmsDiNtkIV>Ki5ut3^cjC}3$x#(froO6d?u#h1Fz{N5?n9+#JD}m{YNQhx-h9C$g#=Q=wbkR!1roNb z#nxPDe)29Ob2f_aHxpXUsC5y>>xPZKO>2v<`On)*R9-}ktX1ixuZa7$Q*F2Xxh~Tq zMw}2MM-C0#ZaQt!z-rRKZz6*CcXN`c+`Ku?Cg&!Vrq)Ri{xfVOy(TQT_CRh;6Z6Fd z_QJ1d_s~ob#>M;KTeF>pa`j{5$1yA62j9M@+TJ~V*zGe;we!XA0a}SO&)f~vx<7;j z)>=xsL@W8g^YRI~;pE+X#qP!yV7* zvImNAQ>Th_2aytTTMZer$DOHO4_5tUjV18YV+e8zTloiX+WJ+_mue#fv2(g;s|^As)?DuuBL>#D8dNSG8-Fh67KyWc{o?n% zt53hs)<=)LtQI!0p7kd?OH@|f9ETwM%MV>`5HxAP5=zE(ombvg9=$pK|0sJCaH_hu zao7+tXRc((cqB=t5RNGv;iMu*D2XDm#Ck_|p!mc^)>xW6!<9%KR;;>tzgBU1eA!~EncMIjfLR$eXyYJ9=NtN$Q z!B^(5DjGngSV$`uw#kM2a^SvP*nex?6AIonTfMRw5Te19zWw{tM#$EOT~<}#A2c#q z^F8af)?YxuhaDwK+=plTM%(4ScnZOto9mxJWry{5rB#{OlEfEby~VwyliAoA8Yk>I ztPc(ALBj?R%htLb+t_jKu|B&q;w{sc8XK}0Y`Y~xw2hb+sSBqYLkbw4^(*Z%-x;4{ zxjGoX@jFLgH`RETxg&T3(|6;0sn<(vNdHz(sp~5sZqh=eiMvQh1QN0`8>X;_B8I21 zVyKpwb_sL(x%x5^TfQ9f^$p}7t)*^|3m=sO;^x2>g;*pbVSN)uSjdBX{|yxIEYq0< zp_rv%2`te5#NN~CT=|(tuFylSCf~7yd>_WdUek2?{7kuVIw+HT;fHJ55i8MO1O4Yd zu^_dkOjv^dv!kHjd*Mi)G)rPHBW_ksBMf%H6TF`7HkoB4XUYpOLX0_Z7@lyLBq;lk zZhosu9|Gbhj#1Fds~2GLv3zxwEngZ}9tulMpS(EqAQxWBftPaOgS^xP&BT=VOvqyZ z=CnR^PpdXp4S(C zUa`T!eJ^`k7Mn-ZKixo%iF>^EvH77AT=hs?fd!Gl$%n#4`47Xom)}pjK>~?trnSP= z1$`z(VX!+{^^I!11%W-^Jf)ZZYPgb7EsKfS!#O6T0JlO9K}f(4(FaF7=#XRiaoBYG zS}~K)BsKc0PV%RcMd`j6Lbc1{FFkD$1G;p~6*F!|NZsTimcjukC#Fbx&?7g=#c#^5 zWG(MbOi}b;EP-;DF)uy2rj^9o<+Qo-1xzjJpk~DHhczZCYZrne7cvx1lWp;oIHVg( zxrXtGU*+cik^$rE(|UtYhx+Oh=VxQcG^I^m2o$6PJU3sBAHOd2eO^L#5uw@Hq<- zk7EggFCz!VsVvh+6a6k|GURVzM3|6}2l4cfu9+^~Fg-CTo)K!q=`ui`(}k#rs873! zQ~jrf#HrlV!&nOIw2e5`vXu!O{y+Byic4M02w_B|y5|9j9<(mAB)X_&(jk;b+q;nP zQ=C}B%hvg~^Yquc_ayJiw>>2zZmyOVrqcYC*@Rt{i5|LC@FNt8^S>2o02S&%Ja~c~ zrdWj3JH*eB?;DC}>O+MFkSi8S!V_dM)Ki#ZWl}E_ZkCPg8-dhj9L5s(NrIf@-=Ro= zK2)Cr56SHNqa2vXzatT+95@6|AY!Qh`V$^>B(*)b*hpj~N2SP=^-<;7MspQWU>+jq z;18nanTx0qb7J zc-)a=FcD@Y+jEfZ8OUTTl&TLs+0zp4u;0Ut{YC#?jK^V;-#(I`2FZ_!A_Q^F#mc9X8_FtFdk*kv=h~saAuK6fj$J`37VvoOEYx&-*e$p zXN<)?_LI~GeSijIB45eqphG-E5f?0^fhQaxrLd644Im~w;UH-u6nTs%@Q|!I$PclQ zaxQFz@ko*5HL2slWpI+)!;lGm2p0dkCFb5Y~m@0FjP;BhbpO(8E3~%E(R7n44I2W<|2?@ z14uXrj>A*7@Dv#g6|k&cciP`Fi2pw%Fbt_o(_{pu7fJvI*Z{J`LjAe0ths$CT$uB> z^@Uw?;X|0>{kT9bT;R}G0h2&_+=dW|CP6~YE+a1R``2Pqf=N+nL16P&5tIIyoN2O6 zu5TbGp{kF^PEWC(ez2e}$2YK>pJ^a)I2;*LGh#Vacc!JDkzCJCu4f_FbLTvq-RNi8 zo$f&4EbbS*I!H?opqr%~B++<6dvARua*%_aX7(KiRui1|`sVUqXE0P{4AmP$Wv45? zLEPX4oaCrCOH+kCRSSmR6yw>+)F^}t3k}mDwArS642b-}*@CS-IlluRe!DVB7E%S98e7^=`4>#Lj2%U&3& z4W^xmT$2kA=fK0cux<{_ho@xY35=u^! z=+0M#0F=&n&9z_m_*_m8fAIdOfv42qDRdZ*oZI5R287wk&3ceEMnM!OybD-QC?Xd& z#3-=h%%leixZD3OR{|By(ZlNt(6Yz!FeDo}|Wx z6Xqnxg&`mGp;SF6)c~@=LN@x)XwHAUb3Xx+pDIa>6<5cMs}sc4apCGjaTy$B^DtyF z2M)p%)8XXrAP4a2d^q`VlS+kMb!x7Irh>HQ_odbgjoWOYKkgS=>3Zefc zH-ZL`Sq==CS1Shw{vR1nIfkJg!FXtpDj9HgtmNWwWbQ6vZ2-CFpl+-thAN7oI$)?e z7!PeyB|WZxH+hho>=BNL9<>XDS#sg195^Z$#$h~^NtH~vem1f;Fj^6Rj25^@A*j6q z0;3OE>OqzUP$w1wIt8^(z$*o|DHpEFg;#Rmm0VaGPbtJxT=A4iJVgjkNySra@RUA0 zfsG@h~#Pmm&^z8g@{VSnpm3LrfQ-}d3OxN&uKIAQvK6z7v%SP4%V z$5T}C6kj}rALDU|ltNFwq7OxSFw;Xuc!JVD1em}=z|*VJg9PvteT)YWsdDchyxv86 zvCs;*^iiFofTyTosHZVhRtzxMfucB|Edp6_{q$t&9b_mH8Hz$^SV&AC%Em(3V8)fE ziPyKHg8E#JCepM?*1)Te_);qpj&N0(?n2_Rka54%!3}M|-y5;p^f;~f^JnUpFK0Oa zIK2ac4P_FIokaV;N@jQmV^*LvUGc&-C>&{vR_!tK2=6f79$_Uj89)c|=}frfTooo9 zdnEEM2fmJ>s$ditaPI8niU@?l!pZttAb6hOFtf*pev!a{q55E`92f;&-0UuLCM((Z zE>eqy>~mqyXi2jJ=U-?6!L*14o^viNiYHj2f*Fnk7(l@}aCr{gfG2Q}dbx44+~iD7 zaweb8!C&>;139^GYB_-g)Q4W-2?t0nz)0r8dUyf@No_CA%!lmNf=VX_+|e}B8cf)QC?6Gz-6$J$$HQ< zp1@3Ui9(J=te0K$%9N}g($=t3(4og=k$aa`|JHB0V-5Od#elnSJ^)}#rxy; zL17-1t*XI|2&+)v{yRC-zJcOXRzEbx^Z*sL`Bm7eqfT&;&oRd_BWebaT@GA~r%3)` z^{yNxEaftuGK!}FbKnQ!R}57SLxnKZeHf}ODg;G$ku3K8?D^W<t7CSDG=O2-% z=OEWJpn~BLi8w?c4&1dICV`B&ekO7~E4g04MV~ta2vaE8+&mZyKwzNKGKOaITCFjiKaoKF_CD}B-*(z$Hl4cm||vJQ6xeG z;c5=-1+H9pJ_nx9g*7q7qByPHWK`S?AmbePiQXu1Qt=dSJmm(4+LFVHrC8!Aop_2O zP-_t~3{WG8+A!^$ z9L-%MHC|lZUR>QSoLLxhBoaBP2mKF$V#82@l{i3B1GbEgY<>qR0itvl0m$gXLVe7Z zOh`!tQWAy87(i!o;IkMHx9j^8Q<%wQ18CpdX>7U(?(-d_Ko9E9g%4vCgmHEBxD0yo zI2NkG6GTZV+++bP1Xhd~ao)_XbpL2%-fJv~i#`Ob++hs$!;e$q9%>{t*<1VnM1(>o zL`*Wc$q)4)V7fEH%R^xx_AVHzAcks9g?^aU+ESfE4+Av&= zvvhV~A`iv^)eCFhVm|8Sj=Jskz~eM{@ywxC_BhL=Mvg2agLqs*0l{ zjHV9(ld2DD1&AN#epJQ6qf)<&zpnGrlbi8soLw$2uKzw-U%Hy^QB^ToUkBJ&wATQY z>OJ3X-r~Ro9>4`M;QG19+N@-4CbBjsS(}lp%}ze2_m8<NmqvxG>c5 zi?WF{Hc}-YE>Hj$$cYOS!Tpz50pa2#|2OB8985>1avfnn?NVSa%$*A-gvW-#3AwOk zxLGJ1{Qt*zvvlr4W^&*F4E5smXU=zncl>q(2QVtam44Q57f2aLcGcWXUBO1+ph;T8bCxWB%1^4Mocn5 zocR6hdWaOJ9r&ENe>(tz9OOtWB#1G;ivYFFkNY1|#)Wg|CjVDlcc+aJk;sKD@RYQJ zOJQ&ao*;xNmM8Uc;%2$XMtV>ep1_SMmL>H9;rio3bc7@8`j8U%23TU&o5C+NV_<^5 zf2qx6Ebgy4c;!v;QQ%SRCO7LtH}L5KxY#I!Sr20Ua{1EHLBvUfe&C5gm9lD zki}e>0aLsO=Z%FdFvYuZ@^=wj4xEN30H2i|m%&bMk3c32pm98<9Zv!N3sCJIcmflt zau3dK7g^yhk^(#*1IQl>`RhYwx$qS{#U76?lY%O|I6EL3oaEv^UXXh(416ffw0ZrVmLcSa&aWmtM|vTWS}LU zqyRYtAvzZbg26I=9sDro+6B=9Kle{F;oQ%)#EeUpS(IeB@j>9z*AW86wfIQXYS<# zWkQ51?p)uE-Gr(H@Y7VrTOIW?0?~;?bih3dX?XcU-$8vhIhctY%t`LSLK_OLVeh`( ztoNbAZG5;Xnn+V1(K5$_!~s!@JC5x#DFOj4!H*sSLCO0R^)MLt9;ZLsVJTp}oaJ*r z7B$zhu}$d#4X4bqwaN*KTO8yq26Bx;!Jj27uar9J162R3gJ|e*z70#s7GzKCr6Vit zGff`rd86F~6v?<>*t_$)TTEZX9ag?D81Bqu!k%If2JgYNGmzzO_P>GT`);vWVSKn* zllxgtu{*TSet0*|g{43@TSB3t`90*_Ys={Jb8*ng7d}TtT!G3f}~y{Tx`+?BeXT< z%}`h@MBZMk0r{0dmdSyo12d{3;@rDmy4){D5+cJEvEmBW@l43b*m3dpLm=F{r6Fn} zEXB=$@Q&RHh1{1#Jdcu6c9W&`pw`8U;?xtEe_VvH$9svy(`gAgyg49Qrm~iU?7`EBFGppNIq*$;tGtoaswz0 zPXXZyJMMFeA`{}7cqSAEfgcwM-FVVNSEF)Iu$g#&d=jQ2OS0ZY7BGOMQFp;3K1lJ` z{`+Vcy{03M2GTMKto$FseFqqBAO6+1lQH(0PUZBWR7I9vs>|9vK-|6UwFAz_0VwmJOO0fk`h( zm1VNvJ9k-l%sn(aQ=Q>zk##h(wL5)VcwA;GT}Rvzc*eVPR41qhcbRwgzhCryQ}16M zq@DOr&@EBQQfcsKcL+*oP2LwzJ5HkQB30UF@gAjGi>%~7X3N)>w&Z+NxgMW!d-@-@ zTLax2c^-~D&xI#*;K^~HA3g6BK?og=H~?q+figqkpbSpSSu2rN_Lw!lUc!aj>kRNcXH$W5w65>bJRCyAqOAo+?AE2lWZ0ScaGa)DME{J zZ|XuD?;s6ec{#Uvhn7q>AD`fg9;M#bWVA8Lb&in|c5kFlY!*H|-_Qnknnbo`nh zPzY;W;>8xdip;v>yB+M`n*F|cnP^zJzsQSE*X95z6{v`@IzT_o!-`p5f0s!S*7<=r)H*^23%e6{Fh>ChX@b8KFy`lCgy9 zMITV5%WpqPF!uywenligkvj*(z$%cuzuH_2(@77BJe&-JyB`XHH8K*BetzNp-x>r2 z3J<|<1~6zgm||g4ul;S-TVIX;^F0|8nrCU$+lKm=A#+3=oh%UgS!2IX46}MJ^2Xm;Y7@ za`W^M2#;^$DQllLu#`RHjN(*=E9$?zdm}$(0XBi2E*?yDIYVPW!w9h6w;SUjMe=*K z$dl+7v#6Aan$~dSq`@Dp@JaUYW4X4cjZWpc;27F5+&JIG!4GmPjHSl=xr_V3ka>$5 zzX&VfjSsL%^-wVkHvMGt=C%EkAd%x#>(jN?&sZN9q?Vjf`-|oPl`YaGrab?urg3hz z)HD6>xcw9Tzq;a+I?%q-!z&hN8o>6I{4hOa`)LKma-|hZ{$S2m#?tnT+ylEN6pS@? z<&PhV3WHCKgPp0;155}T=`xm(yU3V0fsbdg=r*$$Hx@58S!1m(X#UiRCB!VUC#s!U zQ%|&hzR8x~Zgl}miMuCkl2N?LoZo&rgd0FOafnDat7fS|pWki+_9s4(n89AvJE?)m z$P9i~6M36cSW5f7eXDEBf@IE@o>hnR-qa2jsBFEiO!;tVD{m+g_rp@jJ^z1=S8g_Q znu?@Q|g`3fvz73|W@|?Q>d&5t^6dHZ!ky@}6M6fqk|M@skf*2`QiPypgai zDlKNxU&K!bi5&`CsY4!BC6L|(N<#U;FH{D(PtHQwm?Z{hrAoJ$>H%l5ADTTMYJ=IT z^~;j}EFJvNEIIjSkur2PX+Pws2RRymr4#p%{ZIv-5`v-9k!W#crDJY9+R)ffGz-*}0|-PU4Wt;kFI5V7<1^5SOb zSGMuA%u+G2>Ey@!?N#^J#?GuWS8*&|T-|^A$^)r~F-cx*O+Smz-OVliWNK{QHfOeA z?ZlhS(^=>Y538>bmdw1SO~#s)dyR>M?pYOT8H8tqdMBqQ*A*JJ;YQhl0J5 zNN+7atl9L+s#j%QH-vX(pK2A-aAvXI_|c2$zK^6JXSW5D($`cPHI&&ug9<6 zb)U%L&!}dS6>&Mb*q&3m7&lRHZLSG1WU>qL`NCM*bJU|DS&Uwx)0S_tcIV5-<*NNk zA5GSYD!gJL_fHn=40QZj89ckQ;znyEO6`kJ54?PlnEh!-neE5%_1V-fpSm2Eves?- z)*ERlo7t+(HUTGxg;pDSgC1lklXtw!cf^irBdbMaDMdSj;2&KaRh)>rG90niIQW6%npB9?@#*I(8zQ#Kld}^;3KqUPR&d=QRpzmt9U4 z2E_TYmozD#h2xwaxo7vCXP+2t33b&A`pTjFrH<+TsrOgc{Jd`OEjb<;d8gpl5mr1O$bx>{{&e>)azM=HYsi#{t-wgIhrU`s_rr7f8-En#O`?0Q(HzLkoy1?MwbjTJiMC7KZ0G&xy+0gtJ>X49Q_j+0QF3MQ=5pyUoH*sw;XH941;69Cy!VG@ zW!C}miTh?3I{^6mQa?Th;O|Rqd)#||0tVoF6GqdzHKR2E_>c(5HJpHDlnPbTGywR@ zI`JA0(j+a4FCOr2vb9aujv#-h9&Vqz2&GxnX?{G*^1Wu?jETs^ciVNCBSl9cgY4@1 za(N$<(P8Z<@+7Iu=l48wO2@IEOf!uSuZ$f(W@dY`Bkr)Idcu`4!KWL$K3{ikvg_7< z!lBeLGMbj9l&YMj9jsYCS)g2}oOxwJ>wE$D;KIYPiPV>n2JJ#%z%#WD3;8S3HC(b8 z6NeWcbx5?ged>^Rvehs;TqG57MXTF3UfX=Dk1dUybx_E!6JsXwEP}&5UhOOkA?BIc zS=Y{rqVlolJKx<}lN|Cnd%|$1`v}5r@lij2C5mK)snuJHM0G2dp9y?BecMR*N`P0EAv^=&+9Hn3tdfTFfkfE(i+{$ zkCcN6a^943vq#FxQ5wpz$CiG!r9Bi(&E+hIFO{er{&Kftx=Z*85fjWg-Q zSR*ovhtG@1K9ltAvYkoSC_mv&j!S-2Tdw8pjUa#w5+2Sg9A*`#<6S=%e*7zW>{dZ5 z51+t7YU~L`@7A7E3F*(|3e^g`m7jFKzY%bJ#=7q=m&e#LhwAAU){<4njRl$sOtIPm zhiPA5d^_`M@c-q`EPV&{QU)qckq3>UBrIaid(_=Dc4txuLfo) z_3}gr9THKlIp(FDU^1F!#~yjRgso?HJSH1KK~JsgV2py9h?}5)+4<8h2jy?(3%rzY z<&mfTJPMF0P*i93sy0=yzwnilucg97AW6-_%6LYKB6_ZE1>^C!>7I8ta`XJF%29sz z{wI&bu2YViiac9#Yq3?*{Q%$KmG>)n#&^8?Cq#K_BK)+}oo@-!PIfDL%6ZPxuGz^~ zpeL-Q)kzwfhBPR6k#7}w_9Dk^O$i^CPkEeg!hL<>DB?U0N&0Hm1kA%DxSQom@J&Ba`O^s}d=sB=Wm2#T6REfE&hT6K z(wxo}30D|u_oa+ov2c~XO=-JL3A#<;UyDEC`{SZC6Xf^M_DAb;O($t43c?PL3%d2| zYbm7iQ?v!}Ei(u^wWe9aHt5C7z~%!dUs20Qwu(q0&8D+lt|^*H@6*Uf?1kOW1YUEs zws@t6IDB`0jQCU>>1aFPE9C7m@l-2K^AK`U z+QNFI&8j??M;i;cuhm8RQ0&92QiTRRMmJ{OJm(tec`NRlLlq!=)&mrO4(%~JVqx>P zd0N>vCO}_K&dT?6z_UuC=6TbkT9e<8Pg@0DrkAf#s>6Diw>v{_m(`xU*;mL}OgWl$ zMM%l_@^jZ4zNOd4v>v@b{XDD8r7UmR$C{MYd<6*2l zOMGVgvD$D5>!h2Tq#dV8%tkNRyks4fiO;@H9Z!vOmX5f0-ZY$+-HKx_fAH4r z9-pl#uY8*I#d9nRGZ*)md5@J1+<&Z6m^?l%v|x4G`i5t%>)zDtROQcS;4%hd7gJvF zn&*RzGtaH%hP&@M)53uve&Kxmh;Vyal$@h-2M_-$(h7LQYYB zuPPZzw=yzxi{=6GapiMq%95q-sWwUFZrS)UUf;g>DKaDoft}BUQ@U& zZ??r@=umcp40!3wZ{faT*XD-+PvMb$UK0m+!qrnZ)Jn8;f7o8vnT%Zx>kO!Bnr*Gv zTXae7V_^%o=R0ob-Abn`sp))Ra*Q_bSeN4U9frBsLK*Te?p0T%gzRRaEjr@X?v?D3 zbK}#Oh}VZdY)O=!cowp^bVloO>96s7kKVU%-*5!~e;?@`a&^>hhij%%`QzI;nN6$K zZ#Emv%8Qa2k8~PX9S61Jf?gSECaxJ;zAEI~aXD81&GOL4<#*i4`wMNdt;A_9l~$w6 zL)&}j{FC-B&0W!H{W`U>xJY#f@mJh=CR0!fIjx^BUs&!7Ts!TseLzu{^4Ss^%@DhB zAOZdPYhJuNcB!ezIpD887`oueT{^z~vw0z8|DDgVqf}kdF|GRJUMB>=&o8rxxT?{| z7e}e*|56POEFC|xkUrE;JoN2WT`8B+(2=_IUz6weZ+SXwtDCPTJ73<3kl8f7_iDIx z*6if(Z$dlmoU9-CDxAEP+b_&i#%a^=WK?8>v?CZW`fuRM;AhwYn$HsYGc zW@CqRw0MZmKI$&mL~rsr{v^sZH5!ACgh5A&6h<VU-nyYVwNELZ{Fg_u_9welVA#06htNKtdW6ib(^6y#k3weK3_#qwN^t zLx7M{bkfeCVqpxx?io<@9n|R*0K?~gB)%+lJPexIf~;&nhfOB5y%DIy4%*MJ4GevA z5ZFEjT9=~Z?MKNm*>;wP_yqLaT>h2DLo5fWs+bc|d#hx%BEjvl{{8-B(}N$Vt)xAp zw6T0}bGDAY5m=_uRIP2x<1~=PPrXgadcmROX=#l%FxtqjlwCnnvuM*2&>+7VRQu@+ zYJ514_9h7WxYt~*t4XL@S{+H z3HZo;pqiRJ1!ZTz?U>A0&<(%aK-MW%RZmL`HgI!^+z-Gq03!pK!1mcuD?B?)NjrFeEqTxb#H#FR>Bk0cAMWg{l1+XGMwGh*+L@xa7e~R^&?7LU zL|e6XjV8F+?sFN)dVw~W`*ULlsoqG?)E+c2HLFI!1Gi%`11NZ&D0u29c;My|iDKAe$tjzOjT2AlqdSuu@vV`-~mu_yR; z%#vJ3#P-~l*q9leUNcIhj9^JguzUStSdHrM2;2t7$Vb35jwxRXd>sz3J>uf z7>f#e7aGp6(_CHG07*rlEJ9v^d@od-PXHKFV}ZU5a&*LPY5`qIOa)~&VD3Z|(0PE3 z?Jcy2M!v5+JEuW)UAe{Ku0EnQz)UA-NsI#3hEWalXRZJ{K?`+8atn>TAd4Q=7Q-5c zVu+_e^+uqWcho`FjvPRe+Gb#o(1O66oyE%U{+o?_3!OhgI2P(|0zzunWb1F1qa@uz zCwd%^R5xiuph@f<(2PQTV&`~?Qs_kQp%dMQPE=xLHkz0TAOUux^Vjb}0GO@~7_u3F z{zt3Xp;JRaZJxIxH#ItfGBj)F4#>&|nsB=jeM(2?f@(_^&~C?YOc&|fK@G()3V9+Z zOaL7Z1G5wqvy+%;6toa%C$|8A4__VeukL9|mDVz zAkhb`A~6Ca!~_9sPXKI0!r0C!MGUCI)JiaMU-bY0t6QRNP{vuJqLjFQnUhR(oRXkc0b75 z!Gb(7v_o&u2t~<`7D$Mp6IKF=9n^~H0xEhHrxZ4ztWIy{mv86vk(Iv&EbPxu*H|TlP)!om;_xS|K6}eAV+3+iL?=h8yeetA}G&g}im|u3oOrHr%{1 zV0o~iy1|uqp%5VUkCQbLki#}I35NXxU>bl#Xyx=ziEVQ<)hFD;v%`hXZqM4hUI$8+ zMoR!w2AGFpi7W2l_GOSoJPEQ;J+LDHsy3n%T>%vuQQ;fWd=4}?DnBeB%Mp+nX!jlM z;4McK6{yY>1_`mIQhD6LhIfDh2|q#v7c5Z<)LjQMrCr^azUq1dP{7q2$dvWmyhO+` zRN65>+I1gn92rTNXdtJS5~cq*l7Mw}A8wd7Wgh_p1p#O}Q4NPCh7W-p)IoAYF&>DH z9tuXU0<5@W3d;Xg+JPJEUMLZQK^_qmn^LqYst38z8KSh=kwJyu(XujqbtIqx2RIBs z=6andv`}{g@LHfZ5Gq&iVWS}V6@}oS;2ZT9Wk(WVaPiP^G~5HziU!K`x~Rv8y3man zkod!5@u2*FWii=pRDJJAEe@x`lc>HZ1U1_?*8zvc&KjSI7V7{c@ahCYV0^QY1Wc-< z-lph)qxojTK&jMr%|NL{$l(=#9^xKA0>=xJ1XQ>A^9+9oHoIS{8xDkuD7SJsS{F48 zHYgSkfzeRUep3$2q7$_cJ|G8Ww?EVUqnc6hZ-e4S+p(JLQjnjv>K}aq)q2Vc^Mb%H zI0+mCU>i>b-N?Klx8NuMvigCC0Bq{1%}%4N7)MEvcmi^S`sDj~hMP*C`0@awpR(Nm zILZR$D2|1GZ-DwF!2bW`Z37)=7Bid*Y>I9aa1($!zyU=ENckRB+^MMAXt@DMi7F}G zb7MQ#9EqrH@CImeL@|xZO16ULuaE6*?U+Z+%ulstIWbm&qGsO5t(48mGmTDBYh=}x zOQSi3)zy3hTu!@%=(!P2o-F8orV-yZt?x3av1HZL5L=+N7|U+8gxpj<j+cMBop@k__)$W$~yDhZ<0hHWk07q&A%Prc0f&Bu@U3_Mmp8}M4v4wMJb|B zO17t)k^l2Y#SVF#!bg9X!1b`3Zat5uKOXtC{Nk>Ip83r0?miQ~?|wy|&jl9FN~o$2 zXH7qAg@2x?%MxsF?Opx`hll@sJ&hRBRg`(#QUUd^rv(j5`Xq5jpU94r1H(mR1h zCp9<8xAHbRM|<}(N8!D{50RR^&I_&N78PnG+vuw1Wyi5K1l4klY(J9kpgCswlhj{r zwsg|=*enUKj(2yB59j<&9UC4!(|fUVm2e~XFn8_YDCY}1Haf~{%ky8)Zaa=G#cn7V zjTr|-$G*EiDKzT&`qYZ7zhdX+O}>7|`&GhUO*zkqJ*odhq%41!R9(Fj*{Rzzd)h#R zbFozP-WqM>aU1;_;}h_A`H8S(ulw;^U&KAGnZq)-9WtM{iD^tY&37zI(_Z{l8yzUv z^Xn&2g$L~lQ7P1<^WTq0z9K)7%FrUcA}fQR`>)7m z;OFrxa=%o@hRTPO2HEceJogo}Wxfx1?6afvI(v($`&XpzwF}@WuW7%p(0);E!!HSC48M8dz>U~L=2^~sgO@h&}6>gD78@Kq2hQvM%u;@R^Fg4H} zx)^`c<7naY!KW|2fdhjm)!z34%>KIfY4L2I%MyR;fu@0n;FOw_#j`f|+6JCCl7q_3 zGzQNMxn=!iqy8l)7GGBLzGIn`;Pa~HeckO(#*!X$-RrkLwP=1D;NjCA_tUGKpPYkrvUzOdEb#W}Kd3%k3o&a_u!j=;3RCya9=$fs4 zH0|5~cq_79;bzgqmC;{MpKtNB)!(?~c8(vN6oTx+ito7Ki=`5tJfd3zX|UA0sv%Fa(%)~k0v1>c#WyqzJ^Xah@AMC-I}!(mr1 zwZG=w-`O#-j%w$ z)VN7K&}nXhO`GOtRJ9v9&10{YPSRnd=JSK6 zOc%i#i`a;2eREE6vf(BVC~xE}yk$O5O;||J8kQ+o5s?FxWpA4g-~FlU6yQaC-nTr| z-#w>VU!^#A$!6pD(%f{}r_VxL7Ee!$@9Qfx84xxJ>QWah?mU1FULrF(9zcA0+U^UJ zTj%T4iM8ODt*w@ppH164KGUw&|M^+khIjVx_-{b&v+|)1I2Xn=A!azg3flf9?Z@8(vo$iTe%TT7&ZcwGOb*p1KcV}i?9UW?$)Up*`>5!pRR|%`% z*eW=ees%Q7_>%6CwG!Floi}%Om0D9<`>P{fyt)x#_x;1*%dW<_qN^SkpsL7+amlvd zvm#tvil@P$UyQcDx4GH|_cTABt$pcMTrcqU`E1^`9=E{4;S2pk5%$;SPV1?y;7v8o z_W1`-@_*nBjIOj6%CPfj5xEb}twWFdYD3ShuQqydY`x>j zUbFjqmV95L)|3;^g@uWjd$tNzPahnzb@>{3tJmIx zuZZd>^ZkL5-J@q3>ivdxfv-Mkjy#(@Ua@sy_Ai^I>7pl(uAGdcWT_W<5N*G2o>|GK z;4|uU%WK>L3e=#fmWR6LrdEzsCS_KaE0=YZ0-Gl8{^d0IZEpXzMvhvOwLPDcw;hG@ zJnGnI4qxFOwQ|+r%KUa3(`Fvf&68XNgA7B6XS>MkW zu4D!bur3V_F9F&uaKmiq^KTs}^mS)bYu${;&sqfyN;qcpbYX7!FcD<#PO!b6vxKIW$_8`uf!rOMWz`q{9>*$dq1rQX5n zUnWZ8;F^_{-(&9Yf6bk13HUxxLD3iuuu&0SfA!p5DkJd8T7ZrDE^lyPq{7Tv`(y=Z zs+zl5fnQ8t(@YI$b1RKpZLrqDZ*kpebfLZWbD~YPbGnod*StW^RvNop8Rfd`Q{l;Z zNO+yi~?xPUYTt!vinV)tLx zC_Wr({>{@C93P;gXzAPhv98xT#keM3O~ue!^Gx#Bt%2*ebF;>Ko=#f&);+z=UQtuu z={+<*D)Ke{V||`vm(14MyR4~G@X%YqgvznsG(+Q9uF6~ITW3x43=~8?KF(e;^p~oY z@2Zc{iJHl}G?e8GZUjM1W}mLtIlY0Fm(9gUXx^9p$~jeS_V zmZG^1YKBjly@x_SZmZc3HEtY!>3wgCOr-Jfad9|~rj@=BYiF&FDT>={g$V!C6aH)Er>XrossyLR4W!tp;BZo=_Dm-$LUrlFX`I$c*DBM!yC@b1zH zcE^8@4^!y!HSFUHPMi{p);XfdJH8;MNOBR4ITA;*t$}AweL-J873SATmg=u(&)0;6D-{|8ZBzM{Lk5UHhkJKQ|{3X zDO0o24OvsIhL#5dbilcH7LuBoQyh6zLqPYqscA!3o=o#)PQy-d&8Vphc}vk9vbCX8 z`gtOTS}{i?Y9CGU0tT_iEg#PFk_u4k@{Z0jTRxE&n6y$PYPce$nSM2PYEP!IUEY(J zcxlQ>09kT$7S2ZyoW7OHtH7hc=OIBj2#yfUjA@9TI&GLBSg4Vl{NcE}P`F@Mne&F!um*e zCGgoBEpz4h^K8*~ZA6zGtc?c*^y8@yor*M6lnmhP5{?-YSgeUrXgm^$Z*(bnUFUx8^GSx9}^NkWfL6|JEd(%Jc*tv$Gauj)yQLSvFwzW z%2yvhWp3yty>6P9EenqD`mXQzJ!R@@-sPA|o?s?`&?DjmiCU2^?dW*PfW2KdyqPC` z4tB}p_45rTUzP6?;?a(u@&V|~h?&FsDCUjEh*~V)0*9IT@ebad8Zt}}r&s_i1OwUv z$$o2?Z3IYcDXDn}9H8i^zwDFuIobiYd>4F^jXIiF-LbtBk+J(8GoS3i(|jiP=~clQ z$cE+@jF_?|?y)VxKf9uXMbLBU1@7hV|E-S5;p?mCIjZbch+=FYPPj?bZ}vG?vC(b zbRwJtnr%*Ra`NkjjYMEV=$jjj7VI!O2_u&HO>=&tP_t#;D#Wi_+p>3ur`ap-TUdv2 z{*&W8nM8S`&eXgmkt7@dX=$k$qo`V~T_aH|)Gn2pv5Hbctss*Bo$v2`&-tJ8fB)|}NzU^;$#Y-V^|?OR z=enP`FqG{@zlm+kq8>Z++2Wws+_S}N>=s2$ zG~I3^MVHt)v8gvDp2a~S`*SFK1|x4XC3kUxU_&6 zXiWMlmX}~px)e@SBPjoXol}8A+UyCuD~n5-iZA%Zf_ay)g+!FrDJ=Pz#Iz4hTErG% zNN2lYnmbq7i>kj-L-5v?k-4{!T^Rq_ugh7kO_vq%7pk+}nD>Hu!Hq(@6Y!_B2N$Xj z-I#Yym=;^N52ct^c)?Ah5#ojTo8u&(J%YpNE+QX4wnrkU=o9B*I!~ea)8nJ1+cStX zsKKo-0*jQ@MSml%)kJqz9x^(Zk`hViaQIQy@zPNuw$zasAISQR_GG9LKMz|?gZj#Z zMg7GLu=(0>MYj9w8AKg7V|j^*cQEkoq9ztQ=6_r-pgNe?$d{_Hzghv?%$HgB64n=3 zo;wj~nHK_t!%y$BClq18LnohDWUS27{YFe6cJYfClCIlC49VENWE?5=!cT1{l>NFG zlA{~E!P~tfmiJ=u#Ds9>1)E7u+~TCzJ&heccJ#t<_ULX%ekjF@&XJu+E=ASz8aSws zKWs0o;~e4WvLZ@~wOg(LFUyXNUpz5ZrtIbxvyWfoW1lv$eYMEL9%0hT+YK+kE3lKO z+eieZ7o?cQVH1KMdt)K~%!_H0NcQerG1XU#redloivsKjjR5f%)%kdy7qlj}FR^}w zp~5dX3*{l*yd%d$Ist+&jEW8+Dq<^e)_;gY26*9VdxE;7gBBJwwbnt{D|Lu_zukrtWypOl|_sp#TC&SoK@y+#P zamct2GuSG57kbG8-*=XjX|QhTFnf(?=Ar8!_&d1yo1{CH$>%o)O&i-|^o&HQ%%8U2{2280`zI9_nlnS;Y5G`#%NF?{^P%WGRM-J$(mRTlx4r z>UFKBja6>xoRvsiM_T=sq=l6X{F+AWm7UilS8AH2B(ryB>u=>MS~oue%R0B z{oK0mgRk&F_WvAZvv@bBL-L46^mUn-4*E*ulb(qdjCj7R?4q=J*7fjuSL%LxdCztv zYk*mV?AHdG{GusSi&~E~BCqY{WW>7`vUcVxo#e;3h9sX~ z?YaGvYe@FFhZtkd#qatbKMNEM#PMuMd^h}9BT)1=P7!PxeXJ93!Wu`bf7$2yE&A35 zZW68j?Y~W1@wa){be;_1&yK(DFI~I7Q0Y16ztOw&Sl;gU-*#QU3He{XFY5Vaer8|m zryNY3@@dtvva_m3FHEMoC#F)onKrF)VZg1?@s(5iN7Z+h=_|@lH%a^&HeVDgzrk47 z_}J2d+tWNferhY<-L7~{P_wuoz2&mJo}EY1b*`rVhV-9bSv3Yf7?05#W=xwtKu5Hw z9P>4XT`P|*F^jOZ(NlX)tNZ97N38QXOQs}sC0%!$cv&2T=h6p(RGQiE*BWaF-f($} z#Ai(yo31HIjpuN9mc(V1Rs5m<<;f_MrZJdVuu@?xb!D8L-8CW0qrmlk;mAGKsg9?* z9f`UfuXQ`#>vrVpc6`+B_^jK}^uW=!{C1T&7v|baFOHsi`X%f5fXYG#@*6YG;1SjL zm7mEnp@QSl#KY?fzp}W!2k9H`KdWrV`!;s+j|bB3�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