From 1a000371faad19de32863a2e7bca270a0db6104f Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Mon, 21 Apr 2025 18:41:59 +0200 Subject: [PATCH 1/6] Treat lint warnings as errors in CI Warnings will not show up if they don't fail CI. --- .ci/tasks/clippy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/tasks/clippy.sh b/.ci/tasks/clippy.sh index 33901a9..7c27b5f 100755 --- a/.ci/tasks/clippy.sh +++ b/.ci/tasks/clippy.sh @@ -10,6 +10,6 @@ title "Install clippy" rustup component add clippy title "Run clippy" -cargo clippy --color always --no-deps +cargo clippy --color always --no-deps -- -D warnings title "Done" From 9ac13834a1b1adceffdef3d1a9bcdda26b8fc121 Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Mon, 21 Apr 2025 18:45:18 +0200 Subject: [PATCH 2/6] Commit lock file changes Seems like Renovate missed this. --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cbc1c09..7417133 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3036,7 +3036,7 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.9.0", "errno", "libc", "linux-raw-sys 0.9.4", @@ -4682,7 +4682,7 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.9.0", ] [[package]] From 38a023bea638c4d2d555d68f9145db7139dcc0ed Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Mon, 21 Apr 2025 22:52:54 +0200 Subject: [PATCH 3/6] Move serde_sjson to its own project --- .gitmodules | 3 --- Cargo.lock | 31 +++++++++++++++++++++---------- Cargo.toml | 3 +-- lib/serde_sjson | 1 - 4 files changed, 22 insertions(+), 16 deletions(-) delete mode 160000 lib/serde_sjson diff --git a/.gitmodules b/.gitmodules index a03eebf..e1964a8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "lib/serde_sjson"] - path = lib/serde_sjson - url = https://git.sclu1034.dev/lucas/serde_sjson.git [submodule "lib/luajit2-sys"] path = lib/luajit2-sys url = https://github.com/sclu1034/luajit2-sys.git diff --git a/Cargo.lock b/Cargo.lock index 7417133..874331a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -39,7 +39,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43e7fd8284f025d0bd143c2855618ecdf697db55bde39211e5c9faec7669173" dependencies = [ "heapless", - "nom", + "nom 7.1.3", ] [[package]] @@ -383,7 +383,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" dependencies = [ - "nom", + "nom 7.1.3", ] [[package]] @@ -2033,7 +2033,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -2274,14 +2274,23 @@ dependencies = [ ] [[package]] -name = "nom_locate" -version = "4.2.0" +name = "nom" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e3c83c053b0713da60c5b8de47fe8e494fe3ece5267b2f23090a07a053ba8f3" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "nom_locate" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b577e2d69827c4740cba2b52efaad1c4cc7c73042860b199710b3575c68438d" dependencies = [ "bytecount", "memchr", - "nom", + "nom 8.0.0", ] [[package]] @@ -3269,9 +3278,11 @@ dependencies = [ [[package]] name = "serde_sjson" -version = "1.0.0" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c5b0d7af37492e99b8559436ee76b9ec8935c75449b1c2ef08c205a9e92ae6f" dependencies = [ - "nom", + "nom 8.0.0", "nom_locate", "serde", ] @@ -4374,7 +4385,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 3f00fe6..31130f4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,6 @@ members = [ "lib/dtmt-shared", "lib/oodle", "lib/sdk", - "lib/serde_sjson", "lib/luajit2-sys", "lib/color-eyre", ] @@ -47,7 +46,7 @@ pin-project-lite = "0.2.9" promptly = "0.3.1" sdk = { path = "lib/sdk" } serde = { version = "1.0.152", features = ["derive", "rc"] } -serde_sjson = { path = "lib/serde_sjson" } +serde_sjson = "1.2.1" steamlocate = "2.0.0-beta.2" strip-ansi-escapes = "0.2.0" time = { version = "0.3.20", features = ["serde", "serde-well-known", "local-offset", "formatting", "macros"] } diff --git a/lib/serde_sjson b/lib/serde_sjson deleted file mode 160000 index 73d2b23..0000000 --- a/lib/serde_sjson +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 73d2b23ce50e75b184f5092ad515e97a0adbe6da From 3d05a2395e005de0443afb82a8c90c434f597a83 Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Mon, 21 Apr 2025 23:13:36 +0200 Subject: [PATCH 4/6] Fix clippy warnings --- Cargo.toml | 2 +- crates/dtmm/src/controller/deploy.rs | 15 ++++----------- crates/dtmm/src/controller/game.rs | 6 +++--- crates/dtmm/src/controller/import.rs | 2 +- crates/dtmt/src/cmd/bundle/extract.rs | 2 +- crates/dtmt/src/shell_parse.rs | 14 ++++---------- lib/sdk/src/bundle/mod.rs | 2 +- lib/sdk/src/filetype/lua.rs | 8 ++++---- lib/sdk/src/filetype/strings.rs | 8 ++++++-- 9 files changed, 25 insertions(+), 34 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 31130f4..23e92ef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,7 +34,7 @@ glob = "0.3.0" interprocess = "2.1.0" lazy_static = "1.4.0" luajit2-sys = { path = "lib/luajit2-sys" } -minijinja = { version = "2.0.1", default-features = false } +minijinja = { version = "2.0.1", default-features = false, features = ["serde"] } nanorand = "0.7.0" nexusmods = { path = "lib/nexusmods" } notify = "8.0.0" diff --git a/crates/dtmm/src/controller/deploy.rs b/crates/dtmm/src/controller/deploy.rs index 02b6860..481b07c 100644 --- a/crates/dtmm/src/controller/deploy.rs +++ b/crates/dtmm/src/controller/deploy.rs @@ -116,14 +116,14 @@ async fn patch_game_settings(state: Arc) -> Result<()> { eyre::bail!("couldn't find 'boot_script' field"); }; - f.write_all(settings[0..i].as_bytes()).await?; + f.write_all(&settings.as_bytes()[0..i]).await?; f.write_all(b"boot_script = \"scripts/mod_main\"").await?; let Some(j) = settings[i..].find('\n') else { eyre::bail!("couldn't find end of 'boot_script' field"); }; - f.write_all(settings[(i + j)..].as_bytes()).await?; + f.write_all(&settings.as_bytes()[(i + j)..]).await?; Ok(()) } @@ -453,10 +453,7 @@ async fn build_bundles(state: Arc) -> Result> { } #[tracing::instrument(skip_all)] -async fn patch_boot_bundle( - state: Arc, - deployment_info: &String, -) -> Result> { +async fn patch_boot_bundle(state: Arc, deployment_info: &str) -> Result> { let bundle_dir = Arc::new(state.game_dir.join("bundle")); let bundle_path = bundle_dir.join(format!("{:x}", Murmur64::hash(BOOT_BUNDLE_NAME.as_bytes()))); @@ -590,11 +587,7 @@ fn build_deployment_data( .map(|bundle| format!("{:x}", bundle.name().to_murmur64())) .collect(), // TODO: - mod_folders: mod_folders - .as_ref() - .iter() - .map(|folder| folder.clone()) - .collect(), + mod_folders: mod_folders.as_ref().to_vec(), }; serde_sjson::to_string(&info).wrap_err("Failed to serizalize deployment data") } diff --git a/crates/dtmm/src/controller/game.rs b/crates/dtmm/src/controller/game.rs index 6b91169..b93d985 100644 --- a/crates/dtmm/src/controller/game.rs +++ b/crates/dtmm/src/controller/game.rs @@ -91,14 +91,14 @@ async fn patch_game_settings(state: Arc) -> Result<()> { eyre::bail!("couldn't find 'boot_script' field"); }; - f.write_all(settings[0..i].as_bytes()).await?; + f.write_all(&settings.as_bytes()[0..i]).await?; f.write_all(b"boot_script = \"scripts/mod_main\"").await?; let Some(j) = settings[i..].find('\n') else { eyre::bail!("couldn't find end of 'boot_script' field"); }; - f.write_all(settings[(i + j)..].as_bytes()).await?; + f.write_all(&settings.as_bytes()[(i + j)..]).await?; Ok(()) } @@ -208,7 +208,7 @@ pub(crate) async fn reset_mod_deployment(state: ActionState) -> Result<()> { for p in paths { let path = bundle_dir.join(p); - let backup = bundle_dir.join(&format!("{}.bak", p)); + let backup = bundle_dir.join(format!("{}.bak", p)); let res = async { tracing::debug!( diff --git a/crates/dtmm/src/controller/import.rs b/crates/dtmm/src/controller/import.rs index 2f5f90b..6fc9693 100644 --- a/crates/dtmm/src/controller/import.rs +++ b/crates/dtmm/src/controller/import.rs @@ -397,7 +397,7 @@ fn extract_legacy_mod( tracing::trace!("Writing file '{}'", name.display()); let mut out = std::fs::OpenOptions::new() .write(true) - .create(true) + .truncate(true) .open(&name) .wrap_err_with(|| format!("Failed to open file '{}'", name.display()))?; diff --git a/crates/dtmt/src/cmd/bundle/extract.rs b/crates/dtmt/src/cmd/bundle/extract.rs index 9a0f1dd..75f1360 100644 --- a/crates/dtmt/src/cmd/bundle/extract.rs +++ b/crates/dtmt/src/cmd/bundle/extract.rs @@ -150,7 +150,7 @@ async fn parse_command_line_template(tmpl: &String) -> Result { String::from_utf8_unchecked(bytes.to_vec()) }); - while let Some(arg) = parsed.next() { + for arg in parsed.by_ref() { // Safety: See above. cmd.arg(unsafe { String::from_utf8_unchecked(arg.to_vec()) }); } diff --git a/crates/dtmt/src/shell_parse.rs b/crates/dtmt/src/shell_parse.rs index 6f35a5f..13b3c4d 100644 --- a/crates/dtmt/src/shell_parse.rs +++ b/crates/dtmt/src/shell_parse.rs @@ -54,17 +54,11 @@ impl<'a> ShellParser<'a> { } _ => {} }, - ParserState::SingleQuote => match c { - b'\'' => { - return Some(&self.bytes[start..(self.offset - 1)]); - } - _ => {} + ParserState::SingleQuote => if c == b'\'' { + return Some(&self.bytes[start..(self.offset - 1)]); }, - ParserState::DoubleQuote => match c { - b'"' => { - return Some(&self.bytes[start..(self.offset - 1)]); - } - _ => {} + ParserState::DoubleQuote => if c == b'"' { + return Some(&self.bytes[start..(self.offset - 1)]); }, } } diff --git a/lib/sdk/src/bundle/mod.rs b/lib/sdk/src/bundle/mod.rs index ca36393..075f4d2 100644 --- a/lib/sdk/src/bundle/mod.rs +++ b/lib/sdk/src/bundle/mod.rs @@ -237,7 +237,7 @@ impl Bundle { // Ceiling division (or division toward infinity) to calculate // the number of chunks required to fit the unpacked data. - let num_chunks = (unpacked_data.len() + CHUNK_SIZE - 1) / CHUNK_SIZE; + let num_chunks = unpacked_data.len().div_ceil(CHUNK_SIZE); tracing::trace!(num_chunks); w.write_u32(num_chunks as u32)?; diff --git a/lib/sdk/src/filetype/lua.rs b/lib/sdk/src/filetype/lua.rs index 14f0d6b..dd0494e 100644 --- a/lib/sdk/src/filetype/lua.rs +++ b/lib/sdk/src/filetype/lua.rs @@ -125,7 +125,7 @@ pub fn compile(name: impl Into, code: impl AsRef) -> Result, code: impl AsRef) -> Result unreachable!(), } - lua::lua_setglobal(state, b"fn\0".as_ptr() as _); + lua::lua_setglobal(state, c"fn".as_ptr()); - let run = b"return string.dump(fn, false)\0"; - match lua::luaL_loadstring(state, run.as_ptr() as _) as u32 { + let run = c"return string.dump(fn, false)"; + match lua::luaL_loadstring(state, run.as_ptr()) as u32 { lua::LUA_OK => {} lua::LUA_ERRSYNTAX => { let err = lua::lua_tostring(state, -1); diff --git a/lib/sdk/src/filetype/strings.rs b/lib/sdk/src/filetype/strings.rs index ca2ed8c..8643266 100644 --- a/lib/sdk/src/filetype/strings.rs +++ b/lib/sdk/src/filetype/strings.rs @@ -28,10 +28,14 @@ impl Language { #[derive(serde::Serialize)] pub struct Strings(HashMap>); +#[inline(always)] fn read_string(r: R) -> Result where R: Read, { + // We can safely ignore the warning here, as all data is already in memory, and no additional + // `BufReader` should be needed. + #[allow(clippy::unbuffered_bytes)] r.bytes() .take_while(|b| b.as_ref().map(|b| *b != 0).unwrap_or(false)) .map(|b| b.map_err(Report::new)) @@ -41,7 +45,7 @@ where impl Strings { #[tracing::instrument(skip_all, fields(languages = variants.len()))] - pub fn from_variants(ctx: &crate::Context, variants: &Vec) -> Result { + pub fn from_variants(ctx: &crate::Context, variants: &[BundleFileVariant]) -> Result { let mut map: HashMap> = HashMap::new(); for (i, variant) in variants.iter().enumerate() { @@ -76,7 +80,7 @@ impl Strings { } #[tracing::instrument(skip_all)] -pub fn decompile(ctx: &crate::Context, variants: &Vec) -> Result> { +pub fn decompile(ctx: &crate::Context, variants: &[BundleFileVariant]) -> Result> { let strings = Strings::from_variants(ctx, variants)?; let content = strings.to_sjson()?; From bb6396c9321291a70f90a15116edc3d229bdf5a7 Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Mon, 21 Apr 2025 23:15:08 +0200 Subject: [PATCH 5/6] Fix build script --- .ci/tasks/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/tasks/build.sh b/.ci/tasks/build.sh index 0b4f2aa..68c61a0 100755 --- a/.ci/tasks/build.sh +++ b/.ci/tasks/build.sh @@ -24,7 +24,7 @@ PR=${PR:-} if [ -n "$PR" ]; then title "PR: $(echo "$PR" | jq '.number') - $(echo "$PR" | jq '.title')" ref="pr-$(echo "$PR" | jq '.number')-$(git rev-parse --short "$(cat .git/ref || echo "HEAD")" 2>/dev/null || echo 'manual')" -elif [ -f ".git/branch"]; then +elif [ -f ".git/branch" ]; then ref=$(cat .git/branch)-$(git rev-parse --short $ref) else ref=$(git rev-parse --short "$(cat .git/ref || echo "HEAD")") From bf5c21dd03fb9e9ed74b1609399feb41ff05da12 Mon Sep 17 00:00:00 2001 From: Renovate Date: Mon, 21 Apr 2025 21:46:09 +0000 Subject: [PATCH 6/6] chore(deps): update rust crate steamlocate to v2.0.1 --- Cargo.lock | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 874331a..f4ff703 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -768,15 +768,6 @@ dependencies = [ "dirs-sys", ] -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - [[package]] name = "dirs-next" version = "2.0.0" @@ -1641,6 +1632,15 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[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.1.0" @@ -3413,12 +3413,12 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "steamlocate" -version = "2.0.0-beta.2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b6a4810c4e7fecb0123a9a8ba99b335c17d92e636c265ef99108ee4734c812" +checksum = "a13160bc6ea5cd80cde195ad4a4c629701db2bf397b62c139aa9e739016d2499" dependencies = [ "crc", - "dirs", + "home", "keyvalues-parser", "keyvalues-serde", "serde", @@ -4661,12 +4661,12 @@ dependencies = [ [[package]] name = "winreg" -version = "0.51.0" +version = "0.55.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "937f3df7948156640f46aacef17a70db0de5917bda9c92b0f751f3a955b588fc" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" dependencies = [ "cfg-if", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]]