tags 1119017 +patch thanks
based on twox-hash upstream's changelog, 2.x is a complete rewrite with a lot of interface changes, so it likely is best to ask sourmash's upstream whether they are planning on migrating any time soon. if not, somebody needs to either do this migration in Debian and try to upstream it, or we'd need to re-introduce twox-hash 1.x as a separate source package..
I just took a look at this figuring "it's a hash function, how complex can the API be" and indeed it was relatively simple. There were two main changes of relavence. 1. The type names had changed slightly. 2. The 128 bit xxhash 3 no longer implements the hasher trait "as that trait requires a 64-bit result while this computes a 128-bit result.". xxhash 1.x simply truncated the result, so I wrote a wrapper for xxhash 2.x that did the same. While I was in there I also relaxed a couple of other dependencies to accomodate upcoming crate updates, and removed the downgrade of thiserror. There is also an issue building the package with ipython 9 (currently in experimental), It seems a module was moved out to a seperate package which is currently in NEW ( https://ftp-master.debian.org/new/ipython-pygments-lexers_1.1.1-1.html ) Finally, I'm seeing a testsuite failure, it looks like the formatting of some error message has changed slightly, someone more familiar with python than my can look into that.
diff -Nru sourmash-4.9.4/debian/changelog sourmash-4.9.4/debian/changelog --- sourmash-4.9.4/debian/changelog 2025-10-12 18:30:00.000000000 +0000 +++ sourmash-4.9.4/debian/changelog 2026-01-24 05:08:09.000000000 +0000 @@ -1,3 +1,11 @@ +sourmash (4.9.4-4.1) UNRELEASED; urgency=medium + + * Non-maintainer upload. + * Use thiserror 2, thiserror 1 is legacy. + * Relax cargo dependencies on itertools, md5 and roaring. + + -- Peter Michael Green <[email protected]> Sat, 24 Jan 2026 05:08:09 +0000 + sourmash (4.9.4-4) unstable; urgency=medium * Team upload. diff -Nru sourmash-4.9.4/debian/control sourmash-4.9.4/debian/control --- sourmash-4.9.4/debian/control 2025-10-12 16:00:00.000000000 +0000 +++ sourmash-4.9.4/debian/control 2026-01-24 05:08:09.000000000 +0000 @@ -47,7 +47,8 @@ librust-serde-json-dev, librust-statrs-dev, librust-streaming-stats-dev, - librust-twox-hash-dev, + librust-thiserror-dev, + librust-twox-hash-2-dev, librust-typed-builder-dev, librust-vec-collections-dev, librust-chrono-dev, diff -Nru sourmash-4.9.4/debian/patches/series sourmash-4.9.4/debian/patches/series --- sourmash-4.9.4/debian/patches/series 2025-10-12 16:00:00.000000000 +0000 +++ sourmash-4.9.4/debian/patches/series 2026-01-24 05:08:09.000000000 +0000 @@ -2,3 +2,4 @@ soften-deps older-md5 tests-no-timeout +twox-hash-2 diff -Nru sourmash-4.9.4/debian/patches/soften-deps sourmash-4.9.4/debian/patches/soften-deps --- sourmash-4.9.4/debian/patches/soften-deps 2025-10-12 16:02:00.000000000 +0000 +++ sourmash-4.9.4/debian/patches/soften-deps 2026-01-24 05:08:09.000000000 +0000 @@ -2,9 +2,11 @@ Author: Peter Michael Greem <[email protected]> Description: soften some dependencies to match what is packaged in Debian Forwarded: not-needed ---- sourmash.orig/src/core/Cargo.toml -+++ sourmash/src/core/Cargo.toml -@@ -31,43 +31,40 @@ +Index: sourmash-4.9.4/src/core/Cargo.toml +=================================================================== +--- sourmash-4.9.4.orig/src/core/Cargo.toml ++++ sourmash-4.9.4/src/core/Cargo.toml +@@ -31,29 +31,27 @@ byteorder = "1.4.3" camino = { version = "1.1.10", features = ["serde1"] } cfg-if = "1.0" counter = "0.6.0" @@ -17,11 +19,11 @@ -itertools = "0.14.0" +getset = "0.1" +histogram = "0.11" -+itertools = "0.13" ++itertools = ">= 0.13" log = "0.4.27" -md5 = "0.8.0" -memmap2 = "0.9.7" -+md5 = "0.7" ++md5 = ">= 0.7" +memmap2 = "0.9" murmurhash3 = "0.0.5" -needletail = { version = "0.6.3", default-features = false } @@ -41,17 +43,16 @@ -rkyv = { version = "0.7.45", optional = true } -roaring = "0.11.0" +rkyv = { version = "0.8", optional = true } -+roaring = "0.10" ++roaring = ">= 0.10" roots = "0.0.8" serde = { version = "1.0.219", features = ["derive"] } serde_json = "1.0.141" - statrs = "0.18.0" +@@ -61,13 +59,12 @@ statrs = "0.18.0" streaming-stats = "0.2.3" --thiserror = "2.0" -+thiserror = "1" + thiserror = "2.0" twox-hash = "1.6.0" -typed-builder = "0.20.0" -+typed-builder = "0.21" ++typed-builder = ">= 0.21" vec-collections = "0.4.3" [dev-dependencies] @@ -63,7 +64,7 @@ tempfile = "3.20.0" [[bench]] -@@ -93,26 +90,9 @@ +@@ -93,26 +90,9 @@ skip_feature_sets = [ ["branchwater", "parallel"], # branchwater implies parallel ] diff -Nru sourmash-4.9.4/debian/patches/twox-hash-2 sourmash-4.9.4/debian/patches/twox-hash-2 --- sourmash-4.9.4/debian/patches/twox-hash-2 1970-01-01 00:00:00.000000000 +0000 +++ sourmash-4.9.4/debian/patches/twox-hash-2 2026-01-24 05:08:09.000000000 +0000 @@ -0,0 +1,68 @@ +Index: sourmash-4.9.4/src/core/Cargo.toml +=================================================================== +--- sourmash-4.9.4.orig/src/core/Cargo.toml ++++ sourmash-4.9.4/src/core/Cargo.toml +@@ -58,7 +58,7 @@ serde_json = "1.0.141" + statrs = "0.18.0" + streaming-stats = "0.2.3" + thiserror = "2.0" +-twox-hash = "1.6.0" ++twox-hash = "2" + typed-builder = ">= 0.21" + vec-collections = "0.4.3" + +Index: sourmash-4.9.4/src/core/src/encodings.rs +=================================================================== +--- sourmash-4.9.4.orig/src/core/src/encodings.rs ++++ sourmash-4.9.4/src/core/src/encodings.rs +@@ -470,7 +470,7 @@ impl Colors { + } + + fn compute_color(idxs: &IdxTracker) -> Color { +- let s = BuildHasherDefault::<twox_hash::Xxh3Hash128>::default(); ++ let s = BuildHasherDefault::<crate::Xxh3Hash128>::default(); + s.hash_one(&idxs.0) + } + +Index: sourmash-4.9.4/src/core/src/index/revindex/disk_revindex.rs +=================================================================== +--- sourmash-4.9.4.orig/src/core/src/index/revindex/disk_revindex.rs ++++ sourmash-4.9.4/src/core/src/index/revindex/disk_revindex.rs +@@ -36,7 +36,7 @@ const VERSION: &str = "version"; + const PROCESSED: &str = "processed"; + + fn compute_color(idxs: &Datasets) -> Color { +- let s = BuildHasherDefault::<twox_hash::Xxh3Hash128>::default(); ++ let s = BuildHasherDefault::<crate::Xxh3Hash128>::default(); + s.hash_one(idxs) + } + +Index: sourmash-4.9.4/src/core/src/lib.rs +=================================================================== +--- sourmash-4.9.4.orig/src/core/src/lib.rs ++++ sourmash-4.9.4/src/core/src/lib.rs +@@ -40,6 +40,24 @@ pub mod storage; + use cfg_if::cfg_if; + use murmurhash3::murmurhash3_x64_128; + ++//compatibility struct to support twox_hash version 2 ++#[derive(Default)] ++struct Xxh3Hash128(twox_hash::XxHash3_128); ++ ++impl std::hash::Hasher for Xxh3Hash128 { ++ #[inline(always)] ++ fn finish(&self) -> u64 { ++ // this truncates the 128-bit value to 64-bits, ++ // which reflects what xxhash 1.x did. ++ self.0.finish_128() as u64 ++ } ++ ++ #[inline(always)] ++ fn write(&mut self, bytes: &[u8]) { ++ self.0.write(bytes) ++ } ++} ++ + cfg_if! { + if #[cfg(all(target_arch = "wasm32", target_os = "unknown"))] { + // Explicitly keeping emscripten and wasi out of this

