diff --git a/Cargo.lock b/Cargo.lock index 9869a2658dd67..4619dbf0c16ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8057,9 +8057,9 @@ dependencies = [ [[package]] name = "soldeer" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef46372c17d5650cb18b7f374c45732334fa0867de6c7f14c1fc6973559cd3ff" +checksum = "d584c27ebf7ad3e2557d029a07b19fa0d192d67bd73eea1e1695936eb5666e34" dependencies = [ "chrono", "clap", diff --git a/Cargo.toml b/Cargo.toml index a64a6688cbfab..f726796afe5d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -260,6 +260,6 @@ reqwest = { version = "0.12", default-features = false } tower = "0.4" tower-http = "0.5" # soldeer -soldeer = "0.2.17" +soldeer = "0.2.19" proptest = "1" diff --git a/crates/config/src/soldeer.rs b/crates/config/src/soldeer.rs index e5df0dcaf6a01..3bb8e9a3b74a8 100644 --- a/crates/config/src/soldeer.rs +++ b/crates/config/src/soldeer.rs @@ -13,6 +13,10 @@ pub struct MapDependency { /// The url from where the dependency was retrieved #[serde(default, skip_serializing_if = "Option::is_none")] pub url: Option, + + /// The commit in case git is used as dependency retrieval + #[serde(default, skip_serializing_if = "Option::is_none")] + pub rev: Option, } /// Type for Soldeer configs, under dependencies tag in the foundry.toml diff --git a/crates/forge/bin/cmd/soldeer.rs b/crates/forge/bin/cmd/soldeer.rs index 52e1240a06e13..9c8579fe7a4e9 100644 --- a/crates/forge/bin/cmd/soldeer.rs +++ b/crates/forge/bin/cmd/soldeer.rs @@ -6,6 +6,9 @@ use soldeer::commands::Subcommands; // CLI arguments for `forge soldeer`. #[derive(Clone, Debug, Parser)] #[clap(override_usage = "forge soldeer install [DEPENDENCY]~[VERSION] + forge soldeer install [DEPENDENCY]~[VERSION] + forge soldeer install [DEPENDENCY]~[VERSION] --rev + forge soldeer install [DEPENDENCY]~[VERSION] --rev forge soldeer push [DEPENDENCY]~[VERSION] forge soldeer login forge soldeer update diff --git a/crates/forge/tests/cli/soldeer.rs b/crates/forge/tests/cli/soldeer.rs index cf1e0e5d34aa3..1a62578d1b67a 100644 --- a/crates/forge/tests/cli/soldeer.rs +++ b/crates/forge/tests/cli/soldeer.rs @@ -47,8 +47,96 @@ libs = ["lib"] forge-std = "1.8.1" "#; - let actual_foundry_contents = read_file_to_string(&foundry_file); - assert_eq!(foundry_contents, actual_foundry_contents); + assert_data_eq!(read_file_to_string(&foundry_file), foundry_contents); +}); + +forgesoldeer!(install_dependency_git, |prj, cmd| { + let command = "install"; + let dependency = "forge-std~1.8.1"; + let git = "git@gitlab.com:mario4582928/Mario.git"; + + let foundry_file = prj.root().join("foundry.toml"); + + cmd.arg("soldeer").args([command, dependency, git]); + cmd.execute(); + + // Making sure the path was created to the dependency and that README.md exists + // meaning that the dependencies were installed correctly + let path_dep_forge = prj.root().join("dependencies").join("forge-std-1.8.1").join("README.md"); + assert!(path_dep_forge.exists()); + + // Making sure the lock contents are the right ones + let path_lock_file = prj.root().join("soldeer.lock"); + let lock_contents = r#" +[[dependencies]] +name = "forge-std" +version = "1.8.1" +source = "git@gitlab.com:mario4582928/Mario.git" +checksum = "22868f426bd4dd0e682b5ec5f9bd55507664240c" +"#; + + let actual_lock_contents = read_file_to_string(&path_lock_file); + assert_eq!(lock_contents, actual_lock_contents); + + // Making sure the foundry contents are the right ones + let foundry_contents = r#"[profile.default] +src = "src" +out = "out" +libs = ["lib"] + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options + +[dependencies] +forge-std = { version = "1.8.1", git = "git@gitlab.com:mario4582928/Mario.git", rev = "22868f426bd4dd0e682b5ec5f9bd55507664240c" } +"#; + + assert_data_eq!(read_file_to_string(&foundry_file), foundry_contents); +}); + +forgesoldeer!(install_dependency_git_commit, |prj, cmd| { + let command = "install"; + let dependency = "forge-std~1.8.1"; + let git = "git@gitlab.com:mario4582928/Mario.git"; + let rev_flag = "--rev"; + let commit = "7a0663eaf7488732f39550be655bad6694974cb3"; + + let foundry_file = prj.root().join("foundry.toml"); + + cmd.arg("soldeer").args([command, dependency, git, rev_flag, commit]); + cmd.execute(); + + // Making sure the path was created to the dependency and that README.md exists + // meaning that the dependencies were installed correctly + let path_dep_forge = + prj.root().join("dependencies").join("forge-std-1.8.1").join("JustATest2.md"); + assert!(path_dep_forge.exists()); + + // Making sure the lock contents are the right ones + let path_lock_file = prj.root().join("soldeer.lock"); + let lock_contents = r#" +[[dependencies]] +name = "forge-std" +version = "1.8.1" +source = "git@gitlab.com:mario4582928/Mario.git" +checksum = "7a0663eaf7488732f39550be655bad6694974cb3" +"#; + + let actual_lock_contents = read_file_to_string(&path_lock_file); + assert_eq!(lock_contents, actual_lock_contents); + + // Making sure the foundry contents are the right ones + let foundry_contents = r#"[profile.default] +src = "src" +out = "out" +libs = ["lib"] + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options + +[dependencies] +forge-std = { version = "1.8.1", git = "git@gitlab.com:mario4582928/Mario.git", rev = "7a0663eaf7488732f39550be655bad6694974cb3" } +"#; + + assert_data_eq!(read_file_to_string(&foundry_file), foundry_contents); }); forgesoldeer!(update_dependencies, |prj, cmd| { @@ -101,8 +189,7 @@ libs = ["lib"] forge-std = { version = "1.8.1" } "#; - let actual_foundry_contents = read_file_to_string(&foundry_file); - assert_eq!(foundry_contents, actual_foundry_contents); + assert_data_eq!(read_file_to_string(&foundry_file), foundry_contents); }); forgesoldeer!(update_dependencies_simple_version, |prj, cmd| { @@ -156,8 +243,7 @@ libs = ["lib"] forge-std = "1.8.1" "#; - let actual_foundry_contents = read_file_to_string(&foundry_file); - assert_eq!(foundry_contents, actual_foundry_contents); + assert_data_eq!(read_file_to_string(&foundry_file), foundry_contents); }); forgesoldeer!(login, |prj, cmd| {