Skip to content

Commit 2c05015

Browse files
authored
fix(forge): write ordered deps in foundry.lock (#11360)
1 parent f887514 commit 2c05015

File tree

1 file changed

+64
-6
lines changed

1 file changed

+64
-6
lines changed

crates/forge/src/lockfile.rs

Lines changed: 64 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
//! foundry.lock handler type.
22
3-
use std::{
4-
collections::hash_map::Entry,
5-
path::{Path, PathBuf},
6-
};
7-
83
use alloy_primitives::map::HashMap;
94
use eyre::{OptionExt, Result};
105
use foundry_cli::utils::Git;
116
use serde::{Deserialize, Serialize};
7+
use std::{
8+
collections::{BTreeMap, hash_map::Entry},
9+
path::{Path, PathBuf},
10+
};
1211

1312
pub const FOUNDRY_LOCK: &str = "foundry.lock";
1413

@@ -137,7 +136,8 @@ impl<'a> Lockfile<'a> {
137136

138137
/// Writes the lockfile to the project root.
139138
pub fn write(&self) -> Result<()> {
140-
foundry_common::fs::write_pretty_json_file(&self.lockfile_path, &self.deps)?;
139+
let ordered_deps: BTreeMap<_, _> = self.deps.clone().into_iter().collect();
140+
foundry_common::fs::write_pretty_json_file(&self.lockfile_path, &ordered_deps)?;
141141
trace!(at= ?self.lockfile_path, "wrote lockfile");
142142

143143
Ok(())
@@ -340,6 +340,8 @@ impl std::fmt::Display for DepIdentifier {
340340
#[cfg(test)]
341341
mod tests {
342342
use super::*;
343+
use std::fs;
344+
use tempfile::tempdir;
343345

344346
#[test]
345347
fn serde_dep_identifier() {
@@ -382,4 +384,60 @@ mod tests {
382384
assert_eq!(tag, tag_de);
383385
assert_eq!(rev, rev_de);
384386
}
387+
388+
#[test]
389+
fn test_write_ordered_deps() {
390+
let dir = tempdir().unwrap();
391+
let mut lockfile = Lockfile::new(dir.path());
392+
lockfile.insert(
393+
PathBuf::from("z_dep"),
394+
DepIdentifier::Rev { rev: "3".to_string(), r#override: false },
395+
);
396+
lockfile.insert(
397+
PathBuf::from("a_dep"),
398+
DepIdentifier::Rev { rev: "1".to_string(), r#override: false },
399+
);
400+
lockfile.insert(
401+
PathBuf::from("c_dep"),
402+
DepIdentifier::Rev { rev: "2".to_string(), r#override: false },
403+
);
404+
let _ = lockfile.write();
405+
let contents = fs::read_to_string(lockfile.lockfile_path).unwrap();
406+
let expected = r#"{
407+
"a_dep": {
408+
"rev": "1"
409+
},
410+
"c_dep": {
411+
"rev": "2"
412+
},
413+
"z_dep": {
414+
"rev": "3"
415+
}
416+
}"#;
417+
assert_eq!(contents.trim(), expected.trim());
418+
419+
let mut lockfile = Lockfile::new(dir.path());
420+
lockfile.read().unwrap();
421+
lockfile.insert(
422+
PathBuf::from("x_dep"),
423+
DepIdentifier::Rev { rev: "4".to_string(), r#override: false },
424+
);
425+
let _ = lockfile.write();
426+
let contents = fs::read_to_string(lockfile.lockfile_path).unwrap();
427+
let expected = r#"{
428+
"a_dep": {
429+
"rev": "1"
430+
},
431+
"c_dep": {
432+
"rev": "2"
433+
},
434+
"x_dep": {
435+
"rev": "4"
436+
},
437+
"z_dep": {
438+
"rev": "3"
439+
}
440+
}"#;
441+
assert_eq!(contents.trim(), expected.trim());
442+
}
385443
}

0 commit comments

Comments
 (0)