Skip to content

Commit febf9b4

Browse files
authored
Merge pull request #77 from rodneylab/fix__add_multiple_crate_version_support
fix: 💫 add support for muliple aliased crate versions
2 parents fe77f0c + 0dfc79a commit febf9b4

File tree

4 files changed

+200
-26
lines changed

4 files changed

+200
-26
lines changed

src/domain/cargo_toml/mod.rs

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ impl File {
8282
)
8383
})
8484
}
85-
CargoDependencyValue::Git(GitCargoDependency { git }) => {
85+
CargoDependencyValue::Git(GitCargoDependency { git, .. }) => {
8686
log::warn!(
8787
"Git dependency `{git}` found, but version change detection for git \
8888
dependencies is not currently supported"
@@ -101,6 +101,17 @@ impl File {
101101
) -> anyhow::Result<()> {
102102
for (name, current_value) in current_dependencies {
103103
let current_version = Self::get_version(current_value)?;
104+
let package_name = match current_value {
105+
CargoDependencyValue::Simple(_) => name,
106+
CargoDependencyValue::Git(GitCargoDependency { package, .. })
107+
| CargoDependencyValue::Detailed(DetailedCargoDependency { package, .. }) => {
108+
if let Some(package_value) = package {
109+
package_value
110+
} else {
111+
name
112+
}
113+
}
114+
};
104115
if let Some(previous_value) = previous_dependencies.get(name) {
105116
// Handle dependencies in previous and current (filtering for ones with changed
106117
// versions)
@@ -116,13 +127,13 @@ impl File {
116127
if let Some(label_value) = label {
117128
let _ =
118129
writeln!(result,
119-
"{change_type} bump {name} {label_value} from {previous_version} \
130+
"{change_type} bump {package_name} {label_value} from {previous_version} \
120131
to {current_version}",
121132
);
122133
} else {
123134
let _ = writeln!(
124135
result,
125-
"{change_type} bump {name} from {previous_version} to \
136+
"{change_type} bump {package_name} from {previous_version} to \
126137
{current_version}",
127138
);
128139
}
@@ -131,27 +142,27 @@ impl File {
131142
Some(Ordering::Less) => {
132143
if let Some(label_value) = label {
133144
let _ = writeln!(result,
134-
"{change_type} drop {name} {label_value} from {previous_version} to \
145+
"{change_type} drop {package_name} {label_value} from {previous_version} to \
135146
{current_version}"
136147
);
137148
} else {
138149
let _ = writeln!(
139150
result,
140-
"{change_type} drop {name} from {previous_version} to \
151+
"{change_type} drop {package_name} from {previous_version} to \
141152
{current_version}"
142153
);
143154
}
144155
}
145156
None => {
146157
if let Some(label_value) = label {
147158
let _ = writeln!(result,
148-
"{change_type} change {name} {label_value} from {previous_version} \
159+
"{change_type} change {package_name} {label_value} from {previous_version} \
149160
to {current_version}\n"
150161
);
151162
} else {
152163
let _ = writeln!(
153164
result,
154-
"{change_type} change {name} from {previous_version} to \
165+
"{change_type} change {package_name} from {previous_version} to \
155166
{current_version}"
156167
);
157168
}
@@ -160,9 +171,12 @@ impl File {
160171
} else {
161172
// Handle added dependencies
162173
if let Some(label_value) = label {
163-
let _ = writeln!(result, "✨ add {name} {label_value} {current_version}");
174+
let _ = writeln!(
175+
result,
176+
"✨ add {package_name} {label_value} {current_version}"
177+
);
164178
} else {
165-
let _ = writeln!(result, "✨ add {name} {current_version}");
179+
let _ = writeln!(result, "✨ add {package_name} {current_version}");
166180
}
167181
}
168182
}
@@ -190,24 +204,40 @@ impl File {
190204

191205
// Handle removed dependencies
192206
for name in previous_keys {
193-
let version = match previous_dependencies
207+
let (version, package_name): (SemverVersion, &str) = match previous_dependencies
194208
.get(&name)
195209
.expect("Previous dependencies should include this dependency.")
196210
{
197-
CargoDependencyValue::Simple(version) => SemverVersion::new(version).unwrap(),
198-
CargoDependencyValue::Detailed(DetailedCargoDependency { version, .. }) => {
199-
SemverVersion::new(version)
200-
.expect("Previous dependencies should include this dependency.")
211+
CargoDependencyValue::Simple(version) => {
212+
let version = SemverVersion::new(version).unwrap();
213+
(version, &name)
214+
}
215+
CargoDependencyValue::Detailed(DetailedCargoDependency { package, version }) => {
216+
let version = SemverVersion::new(version)
217+
.expect("Previous dependencies should include this dependency.");
218+
let name = if let Some(package_value) = package {
219+
package_value
220+
} else {
221+
&name
222+
};
223+
(version, name)
201224
}
202-
CargoDependencyValue::Git(GitCargoDependency { git }) => {
225+
CargoDependencyValue::Git(GitCargoDependency { git, package }) => {
203226
log::warn!("Git dependency `{git}` found, but version change detection for git dependencies is not currently supported");
204-
SemverVersion::new("0").expect("`0` should be a valid semver version")
227+
let version =
228+
SemverVersion::new("0").expect("`0` should be a valid semver version");
229+
let name = if let Some(package_value) = package {
230+
package_value
231+
} else {
232+
&name
233+
};
234+
(version, name)
205235
}
206236
};
207237
if let Some(label_value) = label {
208-
let _ = writeln!(result, "🗑️ remove {name} {label_value} {version}");
238+
let _ = writeln!(result, "🗑️ remove {package_name} {label_value} {version}");
209239
} else {
210-
let _ = writeln!(result, "🗑️ remove {name} {version}");
240+
let _ = writeln!(result, "🗑️ remove {package_name} {version}");
211241
}
212242
}
213243

@@ -290,6 +320,7 @@ pub struct DetailedCargoDependency {
290320
// #[allow(dead_code, reason = "Field needed for deserialisation")]
291321
#[allow(dead_code)]
292322
version: String,
323+
package: Option<String>,
293324
}
294325

295326
#[derive(Debug, Deserialize, PartialEq)]
@@ -298,6 +329,7 @@ pub struct GitCargoDependency {
298329
// #[allow(dead_code, reason = "Field needed for deserialisation")]
299330
#[allow(dead_code)]
300331
git: String,
332+
package: Option<String>,
301333
}
302334

303335
#[derive(Debug, Deserialize, PartialEq)]
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
---
22
source: src/domain/cargo_toml/tests.rs
33
expression: "format!(\"{outcome:?}\")"
4-
snapshot_kind: text
54
---
6-
File { dependencies: {"ahash": Simple("0.8.11"), "clap": Detailed(DetailedCargoDependency { version: "4.5.23" }), "clap-verbosity-flag": Simple("3.0.1"), "config": Simple("0.14.1"), "env_logger": Simple("0.11.5"), "git2": Simple("0.19.0"), "log": Simple("0.4.22"), "serde": Detailed(DetailedCargoDependency { version: "1.0.215" }), "sqlx": Detailed(DetailedCargoDependency { version: "0.8.2" })}, build_dependencies: None, dev_dependencies: Some({"assert_fs": Simple("1.1.2"), "trycmd": Simple("0.15.8")}) }
5+
File { dependencies: {"ahash": Simple("0.8.11"), "clap": Detailed(DetailedCargoDependency { version: "4.5.23", package: None }), "clap-verbosity-flag": Simple("3.0.1"), "config": Simple("0.14.1"), "env_logger": Simple("0.11.5"), "git2": Simple("0.19.0"), "log": Simple("0.4.22"), "serde": Detailed(DetailedCargoDependency { version: "1.0.215", package: None }), "sqlx": Detailed(DetailedCargoDependency { version: "0.8.2", package: None })}, build_dependencies: None, dev_dependencies: Some({"assert_fs": Simple("1.1.2"), "trycmd": Simple("0.15.8")}) }
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
---
22
source: src/domain/cargo_toml/tests.rs
33
expression: dependencies
4-
snapshot_kind: text
54
---
65
{
76
"ahash": "0.8.11",
87
"clap": {
9-
"version": "4.5.23"
8+
"version": "4.5.23",
9+
"package": null
1010
},
1111
"clap-verbosity-flag": "3.0.1",
1212
"config": "0.14.1",
1313
"env_logger": "0.11.5",
1414
"git2": "0.19.0",
1515
"log": "0.4.22",
1616
"serde": {
17-
"version": "1.0.215"
17+
"version": "1.0.215",
18+
"package": null
1819
},
1920
"sqlx": {
20-
"version": "0.8.2"
21+
"version": "0.8.2",
22+
"package": null
2123
}
2224
}

src/domain/cargo_toml/tests.rs

Lines changed: 143 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,16 @@ fn new_successfully_parses_valid_cargo_toml_dependencies() {
6161
assert_eq!(
6262
dependencies.get("serde"),
6363
Some(CargoDependencyValue::Detailed(DetailedCargoDependency {
64-
version: String::from("1.0.215")
64+
version: String::from("1.0.215"),
65+
package: None
6566
}))
6667
.as_ref()
6768
);
6869
assert_eq!(
6970
dependencies.get("sqlx"),
7071
Some(CargoDependencyValue::Detailed(DetailedCargoDependency {
71-
version: String::from("0.8.2")
72+
version: String::from("0.8.2"),
73+
package: None
7274
}))
7375
.as_ref()
7476
);
@@ -627,3 +629,142 @@ fn new_from_buffer_creates_expected_config() {
627629
// assert
628630
insta::assert_snapshot!(format!("{outcome:?}"));
629631
}
632+
633+
#[test]
634+
fn get_changes_from_current_dependencies_emits_package_field_for_name_when_present() {
635+
// arrange
636+
let updated_cargo_toml_content = r#"[package]
637+
name = "some-example-crate"
638+
version = "0.1.0"
639+
authors = ["Rust Coder <[email protected]>"]
640+
edition = "2024"
641+
license = "BSD-3-Clause"
642+
repository = "https://github.com/example/example-repo"
643+
rust-version = "1.75"
644+
description = "An example Rust app"
645+
646+
[dependencies]
647+
getrandom = { version = "0.3.2", features = ["wasm_js"] }
648+
getrandom2 = { package = "getrandom", version = "0.2.15", features = ["js"] }
649+
"#;
650+
651+
let earlier_cargo_toml_content = r#"[package]
652+
name = "some-example-crate"
653+
version = "0.1.0"
654+
authors = ["Rust Coder <[email protected]>"]
655+
edition = "2024"
656+
license = "BSD-3-Clause"
657+
repository = "https://github.com/example/example-repo"
658+
rust-version = "1.75"
659+
description = "An example Rust app"
660+
661+
[dependencies]
662+
getrandom = { version = "0.3", features = ["wasm_js"] }
663+
getrandom2 = { package = "getrandom", version = "0.2.1", features = ["js"] }
664+
"#;
665+
// assert
666+
let updated_cargo_toml = File::new_from_str(updated_cargo_toml_content).unwrap();
667+
let earlier_cargo_toml = File::new_from_str(earlier_cargo_toml_content).unwrap();
668+
669+
// act
670+
let output = updated_cargo_toml
671+
.print_changes_versus_previous_version(&earlier_cargo_toml)
672+
.unwrap();
673+
674+
// assert
675+
assert_eq!(
676+
output,
677+
String::from(
678+
"🤷 bump getrandom from 0.3 to 0.3.2\n📦 bump getrandom from 0.2.1 to 0.2.15\n"
679+
)
680+
);
681+
}
682+
683+
#[test]
684+
fn get_changes_from_current_dependencies_emits_package_field_for_name_when_present_and_tracks_changed_alias(
685+
) {
686+
// arrange
687+
let updated_cargo_toml_content = r#"[package]
688+
name = "some-example-crate"
689+
version = "0.1.0"
690+
authors = ["Rust Coder <[email protected]>"]
691+
edition = "2024"
692+
license = "BSD-3-Clause"
693+
repository = "https://github.com/example/example-repo"
694+
rust-version = "1.75"
695+
description = "An example Rust app"
696+
697+
[dependencies]
698+
getrandom = { version = "0.3.2", features = ["wasm_js"] }
699+
getrandom2 = { package = "getrandom", version = "0.2.15", features = ["js"] }
700+
"#;
701+
702+
let earlier_cargo_toml_content = r#"[package]
703+
name = "some-example-crate"
704+
version = "0.1.0"
705+
authors = ["Rust Coder <[email protected]>"]
706+
edition = "2024"
707+
license = "BSD-3-Clause"
708+
repository = "https://github.com/example/example-repo"
709+
rust-version = "1.75"
710+
description = "An example Rust app"
711+
712+
[dependencies]
713+
getrandom_current = { version = "0.3", features = ["wasm_js"] }
714+
getrandom_previous = { package = "getrandom", version = "0.2.1", features = ["js"] }
715+
"#;
716+
// assert
717+
let updated_cargo_toml = File::new_from_str(updated_cargo_toml_content).unwrap();
718+
let earlier_cargo_toml = File::new_from_str(earlier_cargo_toml_content).unwrap();
719+
720+
// act
721+
let output = updated_cargo_toml
722+
.print_changes_versus_previous_version(&earlier_cargo_toml)
723+
.unwrap();
724+
725+
// assert
726+
assert_eq!(
727+
output,
728+
String::from(
729+
"✨ add getrandom 0.3.2\n✨ add getrandom 0.2.15\n🗑\u{fe0f} remove getrandom_current 0.3\n🗑\u{fe0f} remove getrandom 0.2.1\n"
730+
)
731+
);
732+
}
733+
734+
#[test]
735+
fn get_changes_from_current_dependencies_reports_addition_and_removal_of_git_dependencies() {
736+
// arrange
737+
let updated_cargo_toml_content = r#"[package]
738+
name = "gpui-tryout"
739+
version = "0.1.0"
740+
edition = "2021"
741+
742+
[dependencies]
743+
gpui = { git = "https://github.com/zed-industries/zed", rev = "f1af2a4a58b4e48a0ce442181120859cd4df4b30" } # v0.174.4
744+
http_client = { git = "https://github.com/zed-industries/zed", rev = "f1af2a4a58b4e48a0ce442181120859cd4df4b30" } # v0.174.4
745+
"#;
746+
747+
let earlier_cargo_toml_content = r#"[package]
748+
name = "gpui-tryout"
749+
version = "0.1.0"
750+
edition = "2021"
751+
752+
[dependencies]
753+
gpui = { git = "https://github.com/zed-industries/zed", rev = "a3f070195111f8d80111cd73b8a26d7aa2228040" } # v0.171.6
754+
reqwest_client = { git = "https://github.com/zed-industries/zed", rev = "a3f070195111f8d80111cd73b8a26d7aa2228040" } # v0.171.6
755+
"#;
756+
// assert
757+
let updated_cargo_toml = File::new_from_str(updated_cargo_toml_content).unwrap();
758+
let earlier_cargo_toml = File::new_from_str(earlier_cargo_toml_content).unwrap();
759+
760+
// act
761+
let output = updated_cargo_toml
762+
.print_changes_versus_previous_version(&earlier_cargo_toml)
763+
.unwrap();
764+
765+
// assert
766+
assert_eq!(
767+
output,
768+
String::from("✨ add http_client 0\n🗑\u{fe0f} remove reqwest_client 0\n")
769+
);
770+
}

0 commit comments

Comments
 (0)