changeset 53260:fc55ffef89fe

rust-hg-core: update `rand` dependency It is good to refresh our dependencies every cycle to get the latest perf improvements, bugfixes etc. This update is done in a separate changeset because of a breaking change. The change in discovery tests is due to `thread_rng` (now just `rng`) having changed algorithm: the output is still stable and still behaves as expected.
author Rapha?l Gom?s <rgomes@octobus.net>
date Wed, 26 Mar 2025 12:00:38 +0100
parents efd03dbaf153
children aed2aee075c2
files rust/Cargo.lock rust/hg-core/Cargo.toml rust/hg-core/examples/nodemap/main.rs rust/hg-core/src/dirstate/on_disk.rs rust/hg-core/src/discovery.rs rust/hg-core/src/vfs.rs rust/hg-core/tests/test_missing_ancestors.rs
diffstat 7 files changed, 124 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/rust/Cargo.lock	Mon May 19 09:27:06 2025 +0200
+++ b/rust/Cargo.lock	Wed Mar 26 12:00:38 2025 +0100
@@ -18,7 +18,7 @@
  "getrandom 0.2.15",
  "once_cell",
  "version_check",
- "zerocopy",
+ "zerocopy 0.7.35",
 ]
 
 [[package]]
@@ -578,6 +578,18 @@
 ]
 
 [[package]]
+name = "getrandom"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi",
+ "wasi 0.14.2+wasi-0.2.4",
+]
+
+[[package]]
 name = "hashbrown"
 version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -648,7 +660,7 @@
  "memmap2",
  "once_cell",
  "pretty_assertions",
- "rand 0.8.5",
+ "rand 0.9.0",
  "rand_distr",
  "rand_pcg",
  "rayon",
@@ -1034,7 +1046,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
 dependencies = [
- "zerocopy",
+ "zerocopy 0.7.35",
 ]
 
 [[package]]
@@ -1138,6 +1150,12 @@
 ]
 
 [[package]]
+name = "r-efi"
+version = "5.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
+
+[[package]]
 name = "radium"
 version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1168,6 +1186,17 @@
 ]
 
 [[package]]
+name = "rand"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94"
+dependencies = [
+ "rand_chacha 0.9.0",
+ "rand_core 0.9.3",
+ "zerocopy 0.8.24",
+]
+
+[[package]]
 name = "rand_chacha"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1188,6 +1217,16 @@
 ]
 
 [[package]]
+name = "rand_chacha"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.9.3",
+]
+
+[[package]]
 name = "rand_core"
 version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1206,13 +1245,22 @@
 ]
 
 [[package]]
+name = "rand_core"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
+dependencies = [
+ "getrandom 0.3.2",
+]
+
+[[package]]
 name = "rand_distr"
-version = "0.4.3"
+version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31"
+checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463"
 dependencies = [
  "num-traits",
- "rand 0.8.5",
+ "rand 0.9.0",
 ]
 
 [[package]]
@@ -1226,11 +1274,11 @@
 
 [[package]]
 name = "rand_pcg"
-version = "0.3.1"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e"
+checksum = "b48ac3f7ffaab7fac4d2376632268aa5f89abdb55f7ebf8f4d11fffccb2320f7"
 dependencies = [
- "rand_core 0.6.4",
+ "rand_core 0.9.3",
 ]
 
 [[package]]
@@ -1829,6 +1877,15 @@
 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
 [[package]]
+name = "wasi"
+version = "0.14.2+wasi-0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
+dependencies = [
+ "wit-bindgen-rt",
+]
+
+[[package]]
 name = "wasite"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2121,6 +2178,15 @@
 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
 
 [[package]]
+name = "wit-bindgen-rt"
+version = "0.39.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
 name = "wyz"
 version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2142,7 +2208,16 @@
 checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
 dependencies = [
  "byteorder",
- "zerocopy-derive",
+ "zerocopy-derive 0.7.35",
+]
+
+[[package]]
+name = "zerocopy"
+version = "0.8.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879"
+dependencies = [
+ "zerocopy-derive 0.8.24",
 ]
 
 [[package]]
@@ -2157,6 +2232,17 @@
 ]
 
 [[package]]
+name = "zerocopy-derive"
+version = "0.8.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.89",
+]
+
+[[package]]
 name = "zstd"
 version = "0.12.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
--- a/rust/hg-core/Cargo.toml	Mon May 19 09:27:06 2025 +0200
+++ b/rust/hg-core/Cargo.toml	Wed Mar 26 12:00:38 2025 +0100
@@ -28,12 +28,12 @@
 lazy_static = "1.4.0"
 libc = "0.2.137"
 memchr = "2"
-rand = "0.8.5"
-rand_pcg = "0.3.1"
-rand_distr = "0.4.3"
 rayon = "1.7.0"
 regex = "1.7.0"
 self_cell = "1.0"
+rand = "0.9.0"
+rand_pcg = "0.9.0"
+rand_distr = "0.5.1"
 serde = { version = "1.0", features = ["derive"] }
 sha-1 = "0.10.0"
 twox-hash = "1.6.3"
--- a/rust/hg-core/examples/nodemap/main.rs	Mon May 19 09:27:06 2025 +0200
+++ b/rust/hg-core/examples/nodemap/main.rs	Wed Mar 26 12:00:38 2025 +0100
@@ -53,11 +53,11 @@
 
 fn bench(index: &Index, nm: &NodeTree, queries: usize) {
     let len = index.len() as u32;
-    let mut rng = rand::thread_rng();
+    let mut rng = rand::rng();
     let nodes: Vec<Node> = (0..queries)
         .map(|_| {
             *index
-                .node(Revision((rng.gen::<u32>() % len) as BaseRevision))
+                .node(Revision((rng.random::<u32>() % len) as BaseRevision))
                 .unwrap()
         })
         .collect();
--- a/rust/hg-core/src/dirstate/on_disk.rs	Mon May 19 09:27:06 2025 +0200
+++ b/rust/hg-core/src/dirstate/on_disk.rs	Wed Mar 26 12:00:38 2025 +0100
@@ -220,12 +220,12 @@
     pub fn new_uid() -> String {
         const ID_LENGTH: usize = 8;
         let mut id = String::with_capacity(ID_LENGTH);
-        let mut rng = rand::thread_rng();
+        let mut rng = rand::rng();
         for _ in 0..ID_LENGTH {
             // One random hexadecimal digit.
             // `unwrap` never panics because `impl Write for String`
             // never returns an error.
-            write!(&mut id, "{:x}", rng.gen_range(0..16)).unwrap();
+            write!(&mut id, "{:x}", rng.random_range(0..16)).unwrap();
         }
         id
     }
--- a/rust/hg-core/src/discovery.rs	Mon May 19 09:27:06 2025 +0200
+++ b/rust/hg-core/src/discovery.rs	Wed Mar 26 12:00:38 2025 +0100
@@ -13,7 +13,7 @@
 use super::{Graph, GraphError, Revision, NULL_REVISION};
 use crate::{ancestors::MissingAncestors, dagops, FastHashMap};
 use rand::seq::SliceRandom;
-use rand::{thread_rng, RngCore, SeedableRng};
+use rand::{RngCore, SeedableRng};
 use std::cmp::{max, min};
 use std::collections::{HashSet, VecDeque};
 
@@ -161,7 +161,7 @@
     ) -> Self {
         let mut seed = [0; 16];
         if randomize {
-            thread_rng().fill_bytes(&mut seed);
+            rand::rng().fill_bytes(&mut seed);
         }
         Self::new_with_seed(graph, target_heads, seed, respect_size, randomize)
     }
@@ -606,7 +606,7 @@
     fn test_limit_sample_less_than_half() {
         assert_eq!(
             full_disco().limit_sample((1..6).map(Revision).collect(), 2),
-            vec![2, 5]
+            vec![3, 5]
         );
     }
 
@@ -614,7 +614,7 @@
     fn test_limit_sample_more_than_half() {
         assert_eq!(
             full_disco().limit_sample((1..4).map(Revision).collect(), 2),
-            vec![1, 2]
+            vec![1, 3]
         );
     }
 
--- a/rust/hg-core/src/vfs.rs	Mon May 19 09:27:06 2025 +0200
+++ b/rust/hg-core/src/vfs.rs	Wed Mar 26 12:00:38 2025 +0100
@@ -6,7 +6,7 @@
 use dyn_clone::DynClone;
 use format_bytes::format_bytes;
 use memmap2::{Mmap, MmapOptions};
-use rand::distributions::{Alphanumeric, DistString};
+use rand::distr::{Alphanumeric, SampleString};
 use std::fs::{File, Metadata, OpenOptions};
 use std::io::{ErrorKind, Read, Seek, Write};
 use std::os::fd::AsRawFd;
@@ -423,8 +423,7 @@
     ) -> Result<Self, HgError> {
         let target_path = target_path.as_ref().to_owned();
 
-        let random_id =
-            Alphanumeric.sample_string(&mut rand::thread_rng(), 12);
+        let random_id = Alphanumeric.sample_string(&mut rand::rng(), 12);
         let filename =
             target_path.file_name().expect("target has no filename");
         let filename = get_bytes_from_path(filename);
@@ -932,7 +931,7 @@
     if metadata.nlink() > 1 {
         // If it's hardlinked, copy it and rename it back before changing it.
         let tmpdir = path.parent().expect("file at root");
-        let name = Alphanumeric.sample_string(&mut rand::thread_rng(), 16);
+        let name = Alphanumeric.sample_string(&mut rand::rng(), 16);
         let tmpfile = tmpdir.join(name);
         std::fs::create_dir_all(tmpfile.parent().expect("file at root"))
             .with_context(|| IoErrorContext::CopyingFile {
--- a/rust/hg-core/tests/test_missing_ancestors.rs	Mon May 19 09:27:06 2025 +0200
+++ b/rust/hg-core/tests/test_missing_ancestors.rs	Wed Mar 26 12:00:38 2025 +0100
@@ -1,8 +1,8 @@
 use hg::testing::VecGraph;
 use hg::Revision;
 use hg::*;
-use rand::distributions::{Distribution, Uniform};
-use rand::{thread_rng, Rng, RngCore, SeedableRng};
+use rand::distr::{Distribution, Uniform};
+use rand::{Rng, RngCore, SeedableRng};
 use rand_distr::LogNormal;
 use std::cmp::min;
 use std::collections::HashSet;
@@ -20,32 +20,32 @@
     let mergeprob = mergeprob_opt.unwrap_or(0.2);
     let prevprob = prevprob_opt.unwrap_or(0.7);
 
-    let mut rng = thread_rng();
+    let mut rng = rand::rng();
     let mut vg: VecGraph = Vec::with_capacity(nodes);
     for i in 0..nodes {
-        if i == 0 || rng.gen_bool(rootprob) {
+        if i == 0 || rng.random_bool(rootprob) {
             vg.push([NULL_REVISION, NULL_REVISION])
         } else if i == 1 {
             vg.push([Revision(0), NULL_REVISION])
-        } else if rng.gen_bool(mergeprob) {
+        } else if rng.random_bool(mergeprob) {
             let p1 = {
-                if i == 2 || rng.gen_bool(prevprob) {
+                if i == 2 || rng.random_bool(prevprob) {
                     Revision((i - 1) as BaseRevision)
                 } else {
-                    Revision(rng.gen_range(0..i - 1) as BaseRevision)
+                    Revision(rng.random_range(0..i - 1) as BaseRevision)
                 }
             };
             // p2 is a random revision lower than i and different from p1
-            let mut p2 = Revision(rng.gen_range(0..i - 1) as BaseRevision);
+            let mut p2 = Revision(rng.random_range(0..i - 1) as BaseRevision);
             if p2 >= p1 {
                 p2.0 += 1;
             }
             vg.push([p1, p2]);
-        } else if rng.gen_bool(prevprob) {
+        } else if rng.random_bool(prevprob) {
             vg.push([Revision((i - 1) as BaseRevision), NULL_REVISION])
         } else {
             vg.push([
-                Revision(rng.gen_range(0..i - 1) as BaseRevision),
+                Revision(rng.random_range(0..i - 1) as BaseRevision),
                 NULL_REVISION,
             ])
         }
@@ -199,7 +199,7 @@
     let log_normal = LogNormal::new(mu, sigma).unwrap();
     let nb = min(maxrev.0 as usize, log_normal.sample(rng).floor() as usize);
 
-    let dist = Uniform::from(NULL_REVISION.0..maxrev.0);
+    let dist = Uniform::new(NULL_REVISION.0, maxrev.0).expect("invalid range");
     rng.sample_iter(&dist).take(nb).map(Revision).collect()
 }
 
@@ -276,7 +276,7 @@
             seed_parse_in(&val, &mut seed);
         }
         Err(env::VarError::NotPresent) => {
-            thread_rng().fill_bytes(&mut seed);
+            rand::rng().fill_bytes(&mut seed);
         }
         Err(env::VarError::NotUnicode(_)) => {
             panic!("TEST_RANDOM_SEED must be 128 bits in hex");
@@ -314,13 +314,13 @@
                 &hex_seed,
             );
             for _m in 0..inccount {
-                if rng.gen_bool(0.2) {
+                if rng.random_bool(0.2) {
                     let new_bases =
                         sample_revs(&mut rng, graph_len, None, None);
                     inc.add_bases(new_bases.iter().cloned());
                     naive.add_bases(new_bases);
                 }
-                if rng.gen_bool(0.4) {
+                if rng.random_bool(0.4) {
                     // larger set so that there are more revs to remove from
                     let mut hrevs =
                         sample_revs(&mut rng, graph_len, Some(1.5), None);