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

Reply via email to