mirror of
https://github.com/RGBCube/dix
synced 2025-07-28 12:17:45 +00:00
src/main.rs: support multiple versions for the same package
This commit is contained in:
parent
d5f2a5d7ba
commit
93c8f55d30
1 changed files with 34 additions and 24 deletions
58
src/main.rs
58
src/main.rs
|
@ -57,43 +57,40 @@ fn main() {
|
||||||
|
|
||||||
if let (Ok(packages), Ok(packages2)) = (packages, packages2) {
|
if let (Ok(packages), Ok(packages2)) = (packages, packages2) {
|
||||||
// Map from packages of the first closure to their version
|
// Map from packages of the first closure to their version
|
||||||
let pre: HashMap<String, String> = packages
|
let mut pre = HashMap::<&str, HashSet<&str>>::new();
|
||||||
.into_iter()
|
for p in &packages {
|
||||||
.map(|p| {
|
let (name, version) = get_version(&**p);
|
||||||
let (name, version) = get_version(&*p);
|
pre.entry(name).or_default().insert(version);
|
||||||
(name.to_string(), version.to_string())
|
}
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
let post: HashMap<String, String> = packages2
|
let mut post = HashMap::<&str, HashSet<&str>>::new();
|
||||||
.into_iter()
|
for p in &packages2 {
|
||||||
.map(|p| {
|
let (name, version) = get_version(&**p);
|
||||||
let (name, version) = get_version(&*p);
|
post.entry(name).or_default().insert(version);
|
||||||
(name.to_string(), version.to_string())
|
}
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
// Compare the package names of both versions
|
// Compare the package names of both versions
|
||||||
let pre_keys: HashSet<String> = pre.keys().map(|k| k.clone()).collect();
|
let pre_keys: HashSet<&str> = pre.keys().map(|k| *k).collect();
|
||||||
let post_keys: HashSet<String> = post.keys().map(|k| k.clone()).collect();
|
let post_keys: HashSet<&str> = post.keys().map(|k| *k).collect();
|
||||||
// get the intersection of the package names for version changes
|
// get the intersection of the package names for version changes
|
||||||
let maybe_changed: HashSet<_> = pre_keys.intersection(&post_keys).collect();
|
let maybe_changed: HashSet<_> = pre_keys.intersection(&post_keys).collect();
|
||||||
|
|
||||||
// difference gives us added and removed packages
|
// difference gives us added and removed packages
|
||||||
let added: HashSet<String> = &post_keys - &pre_keys;
|
let added: HashSet<&str> = &post_keys - &pre_keys;
|
||||||
let removed: HashSet<String> = &pre_keys - &post_keys;
|
let removed: HashSet<&str> = &pre_keys - &post_keys;
|
||||||
|
|
||||||
println!("Difference between the two generations:");
|
println!("Difference between the two generations:");
|
||||||
println!("{}", "Packages added:".underline().bold());
|
println!("{}", "Packages added:".underline().bold());
|
||||||
for p in added {
|
for p in added {
|
||||||
let version = post.get(&p);
|
let versions = post.get(&p);
|
||||||
if let Some(ver) = version {
|
if let Some(ver) = versions {
|
||||||
|
let version_str = ver.iter().map(|v| *v).collect::<Vec<_>>().join(" ").cyan();
|
||||||
println!(
|
println!(
|
||||||
"{} {} {} {}",
|
"{} {} {} {}",
|
||||||
"[A:]".green().bold(),
|
"[A:]".green().bold(),
|
||||||
p,
|
p,
|
||||||
"@".yellow().bold(),
|
"@".yellow().bold(),
|
||||||
ver.cyan()
|
version_str
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -102,12 +99,13 @@ fn main() {
|
||||||
for p in removed {
|
for p in removed {
|
||||||
let version = pre.get(&p);
|
let version = pre.get(&p);
|
||||||
if let Some(ver) = version {
|
if let Some(ver) = version {
|
||||||
|
let version_str = ver.iter().map(|v| *v).collect::<Vec<_>>().join(" ").cyan();
|
||||||
println!(
|
println!(
|
||||||
"{} {} {} {}",
|
"{} {} {} {}",
|
||||||
"[R:]".red().bold(),
|
"[R:]".red().bold(),
|
||||||
p,
|
p,
|
||||||
"@".yellow(),
|
"@".yellow(),
|
||||||
ver.cyan()
|
version_str
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -121,6 +119,18 @@ fn main() {
|
||||||
// can not fail since maybe_changed is the union of the keys of pre and post
|
// can not fail since maybe_changed is the union of the keys of pre and post
|
||||||
let ver_pre = pre.get(p).unwrap();
|
let ver_pre = pre.get(p).unwrap();
|
||||||
let ver_post = post.get(p).unwrap();
|
let ver_post = post.get(p).unwrap();
|
||||||
|
let version_str_pre = ver_pre
|
||||||
|
.iter()
|
||||||
|
.map(|v| *v)
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join(" ")
|
||||||
|
.cyan();
|
||||||
|
let version_str_post = ver_post
|
||||||
|
.iter()
|
||||||
|
.map(|v| *v)
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join(" ")
|
||||||
|
.cyan();
|
||||||
|
|
||||||
if ver_pre != ver_post {
|
if ver_pre != ver_post {
|
||||||
// println!("C: {p} @ {ver_pre} -> {ver_post}");
|
// println!("C: {p} @ {ver_pre} -> {ver_post}");
|
||||||
|
@ -129,9 +139,9 @@ fn main() {
|
||||||
"[C:]".purple().bold(),
|
"[C:]".purple().bold(),
|
||||||
p,
|
p,
|
||||||
"@".yellow(),
|
"@".yellow(),
|
||||||
ver_pre.yellow(),
|
version_str_pre.yellow(),
|
||||||
"~>".purple(),
|
"~>".purple(),
|
||||||
ver_post.cyan()
|
version_str_post.cyan()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue