Skip to content

Commit 178a117

Browse files
committed
🐛 Write manifest even if only requirements changed
1 parent b5df487 commit 178a117

File tree

5 files changed

+82
-57
lines changed

5 files changed

+82
-57
lines changed

compiler-cli/src/cli.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use gleam_core::{
22
build::Telemetry,
33
error::{Error, StandardIoAction},
4-
manifest::{Changed, ChangedGit, Resolved},
4+
manifest::{Changed, ChangedGit, PackageChanges},
55
};
66
use hexpm::version::Version;
77
use itertools::Itertools as _;
@@ -57,8 +57,8 @@ impl Telemetry for Reporter {
5757
print_waiting_for_build_directory_lock()
5858
}
5959

60-
fn resolved_package_versions(&self, resolved: &Resolved) {
61-
print_resolved(resolved)
60+
fn resolved_package_versions(&self, changes: &PackageChanges) {
61+
print_package_changes(changes)
6262
}
6363
}
6464

@@ -154,22 +154,22 @@ pub(crate) fn print_running(text: &str) {
154154
print_colourful_prefix("Running", text)
155155
}
156156

157-
pub(crate) fn print_resolved(resolved: &Resolved) {
158-
for (name, version) in resolved.added.iter().sorted() {
157+
pub(crate) fn print_package_changes(changes: &PackageChanges) {
158+
for (name, version) in changes.added.iter().sorted() {
159159
print_added(&format!("{name} v{version}"));
160160
}
161-
for Changed { name, old, new } in resolved.changed.iter().sorted_by_key(|p| &p.name) {
161+
for Changed { name, old, new } in changes.changed.iter().sorted_by_key(|p| &p.name) {
162162
print_changed(&format!("{name} v{old} -> v{new}"));
163163
}
164164
for ChangedGit {
165165
name,
166166
old_hash,
167167
new_hash,
168-
} in resolved.changed_git.iter().sorted_by_key(|p| &p.name)
168+
} in changes.changed_git.iter().sorted_by_key(|p| &p.name)
169169
{
170170
print_changed(&format!("{name} {old_hash} -> {new_hash}"));
171171
}
172-
for name in resolved.removed.iter().sorted() {
172+
for name in changes.removed.iter().sorted() {
173173
print_removed(name);
174174
}
175175
}

compiler-cli/src/dependencies.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use gleam_core::{
2020
error::{FileIoAction, FileKind, ShellCommandFailureReason, StandardIoAction},
2121
hex::{self, HEXPM_PUBLIC_KEY},
2222
io::{HttpClient as _, TarUnpacker, WrappedReader},
23-
manifest::{Base16Checksum, Manifest, ManifestPackage, ManifestPackageSource, Resolved},
23+
manifest::{Base16Checksum, Manifest, ManifestPackage, ManifestPackageSource, PackageChanges},
2424
paths::ProjectPaths,
2525
requirement::Requirement,
2626
};
@@ -291,10 +291,10 @@ pub fn cleanup<Telem: Telemetry>(paths: &ProjectPaths, telemetry: Telem) -> Resu
291291
write_manifest_to_disc(paths, &manifest)?;
292292
LocalPackages::from_manifest(&manifest).write_to_disc(paths)?;
293293

294-
let resolved = Resolved::with_updates(&old_manifest, manifest);
295-
telemetry.resolved_package_versions(&resolved);
294+
let changes = PackageChanges::between_manifests(&old_manifest, &manifest);
295+
telemetry.resolved_package_versions(&changes);
296296

297-
Ok(resolved.manifest)
297+
Ok(manifest)
298298
}
299299

300300
/// Remove requirements and unneeded packages from manifest that are no longer present in config.

compiler-cli/src/dependencies/dependency_manager.rs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use gleam_core::{
55
build::{Mode, Telemetry},
66
config::PackageConfig,
77
dependency,
8-
manifest::{Manifest, ManifestPackageSource, Resolved},
8+
manifest::{Manifest, ManifestPackageSource, PackageChanges, Resolved},
99
paths::ProjectPaths,
1010
requirement::Requirement,
1111
};
@@ -87,24 +87,24 @@ where
8787
let existing_manifest = read_manifest_from_disc(paths)?;
8888

8989
// If we have been asked not to use the manifest then
90-
let manifest_for_resolver = match self.use_manifest {
91-
UseManifest::No => None,
90+
let (requirements_changed, manifest_for_resolver) = match self.use_manifest {
91+
UseManifest::No => (true, None),
9292
UseManifest::Yes => {
93+
let same_requirements = is_same_requirements(
94+
&existing_manifest.requirements,
95+
&config.all_direct_dependencies()?,
96+
paths.root(),
97+
)?;
98+
9399
// If the manifest is to be used and the requirements have not changed then there's
94100
// no point in performing resolution, it'll always result in the same versions
95101
// already specified in the manifest.
96-
if packages_to_update.is_empty()
97-
&& is_same_requirements(
98-
&existing_manifest.requirements,
99-
&config.all_direct_dependencies()?,
100-
paths.root(),
101-
)?
102-
{
102+
if packages_to_update.is_empty() && same_requirements {
103103
return Ok(Resolved::no_change(existing_manifest));
104104
}
105105

106106
// Otherwise, use the manifest to inform resolution.
107-
Some(&existing_manifest)
107+
(!same_requirements, Some(&existing_manifest))
108108
}
109109
};
110110

@@ -115,7 +115,12 @@ where
115115
manifest_for_resolver,
116116
packages_to_update,
117117
)?;
118-
Ok(Resolved::with_updates(&existing_manifest, new_manifest))
118+
let resolved = Resolved {
119+
package_changes: PackageChanges::between_manifests(&existing_manifest, &new_manifest),
120+
manifest: new_manifest,
121+
requirements_changed,
122+
};
123+
Ok(resolved)
119124
}
120125

121126
pub fn resolve_and_download_versions(
@@ -177,7 +182,8 @@ where
177182
LocalPackages::from_manifest(&resolved.manifest).write_to_disc(paths)?;
178183

179184
// Display the changes in versions to the user.
180-
self.telemetry.resolved_package_versions(&resolved);
185+
self.telemetry
186+
.resolved_package_versions(&resolved.package_changes);
181187

182188
// If requested to do so, check if there are major upgrades that could be performed with
183189
// more relaxed version requirements, and inform the user if so.

compiler-core/src/build/telemetry.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ use std::{
33
time::{Duration, Instant},
44
};
55

6-
use crate::{Warning, manifest::Resolved};
6+
use crate::{
7+
Warning,
8+
manifest::{PackageChanges, Resolved},
9+
};
710

811
pub trait Telemetry: Debug {
912
fn waiting_for_build_directory_lock(&self);
1013
fn running(&self, name: &str);
1114
fn resolving_package_versions(&self);
12-
fn resolved_package_versions(&self, resolved: &Resolved);
15+
fn resolved_package_versions(&self, changes: &PackageChanges);
1316
fn downloading_package(&self, name: &str);
1417
fn packages_downloaded(&self, start: Instant, count: usize);
1518
fn compiled_package(&self, duration: Duration);
@@ -31,5 +34,5 @@ impl Telemetry for NullTelemetry {
3134
fn checked_package(&self, _duration: Duration) {}
3235
fn checking_package(&self, _name: &str) {}
3336
fn packages_downloaded(&self, _start: Instant, _count: usize) {}
34-
fn resolved_package_versions(&self, _resolved: &Resolved) {}
37+
fn resolved_package_versions(&self, _changes: &PackageChanges) {}
3538
}

compiler-core/src/manifest.rs

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,12 @@ zzz = { version = "> 0.0.0" }
500500
#[derive(Debug)]
501501
pub struct Resolved {
502502
pub manifest: Manifest,
503+
pub package_changes: PackageChanges,
504+
pub requirements_changed: bool,
505+
}
506+
507+
#[derive(Debug)]
508+
pub struct PackageChanges {
503509
pub added: Vec<(EcoString, Version)>,
504510
pub changed: Vec<Changed>,
505511
/// When updating git dependencies, it is possible to update to a newer commit
@@ -526,10 +532,7 @@ pub struct ChangedGit {
526532

527533
impl Resolved {
528534
pub fn any_changes(&self) -> bool {
529-
!self.added.is_empty()
530-
|| !self.changed.is_empty()
531-
|| !self.changed_git.is_empty()
532-
|| !self.removed.is_empty()
535+
self.requirements_changed || self.package_changes.any_changes()
533536
}
534537

535538
pub fn all_added(manifest: Manifest) -> Resolved {
@@ -540,26 +543,40 @@ impl Resolved {
540543
.collect();
541544
Self {
542545
manifest,
543-
added,
544-
changed: vec![],
545-
changed_git: vec![],
546-
removed: vec![],
546+
requirements_changed: true,
547+
package_changes: PackageChanges {
548+
added,
549+
changed: vec![],
550+
changed_git: vec![],
551+
removed: vec![],
552+
},
547553
}
548554
}
549555

550556
pub fn no_change(manifest: Manifest) -> Self {
551557
Self {
552558
manifest,
553-
added: vec![],
554-
changed: vec![],
555-
changed_git: vec![],
556-
removed: vec![],
559+
requirements_changed: false,
560+
package_changes: PackageChanges {
561+
added: vec![],
562+
changed: vec![],
563+
changed_git: vec![],
564+
removed: vec![],
565+
},
557566
}
558567
}
568+
}
569+
570+
impl PackageChanges {
571+
pub fn any_changes(&self) -> bool {
572+
!self.added.is_empty()
573+
|| !self.changed.is_empty()
574+
|| !self.changed_git.is_empty()
575+
|| !self.removed.is_empty()
576+
}
559577

560-
/// Create a `Resolved`, comparing the old and new versions of the manifest to work out
561-
/// if resolution resulted in any changes.
562-
pub fn with_updates(old: &Manifest, new: Manifest) -> Self {
578+
/// Comparing the old and new versions of the manifest and determine the package changes
579+
pub fn between_manifests(old: &Manifest, new: &Manifest) -> Self {
563580
let mut added = vec![];
564581
let mut changed = vec![];
565582
let mut changed_git = vec![];
@@ -613,7 +630,6 @@ impl Resolved {
613630
removed.extend(old.into_keys().cloned());
614631

615632
Self {
616-
manifest: new,
617633
added,
618634
changed,
619635
changed_git,
@@ -629,8 +645,8 @@ mod manifest_update_tests {
629645
use ecow::EcoString;
630646
use hexpm::version::Version;
631647

632-
use crate::manifest::{Base16Checksum, ManifestPackage, ManifestPackageSource};
633-
use crate::manifest::{Changed, Manifest, Resolved};
648+
use crate::manifest::{Base16Checksum, ManifestPackage, ManifestPackageSource, PackageChanges};
649+
use crate::manifest::{Changed, Manifest};
634650

635651
#[test]
636652
fn resolved_with_updated() {
@@ -669,21 +685,21 @@ mod manifest_update_tests {
669685
],
670686
};
671687

672-
let mut resolved = Resolved::with_updates(&old, new);
673-
resolved.added.sort();
674-
resolved.changed.sort_by(|a, b| a.name.cmp(&b.name));
675-
resolved.removed.sort();
688+
let mut changes = PackageChanges::between_manifests(&old, &new);
689+
changes.added.sort();
690+
changes.changed.sort_by(|a, b| a.name.cmp(&b.name));
691+
changes.removed.sort();
676692

677693
assert_eq!(
678-
resolved.added,
694+
changes.added,
679695
vec![
680696
("new1".into(), Version::new(1, 0, 0)),
681697
("new2".into(), Version::new(2, 1, 0)),
682698
]
683699
);
684700

685701
assert_eq!(
686-
resolved.changed,
702+
changes.changed,
687703
vec![
688704
Changed {
689705
name: "changed1".into(),
@@ -699,7 +715,7 @@ mod manifest_update_tests {
699715
);
700716

701717
assert_eq!(
702-
resolved.removed,
718+
changes.removed,
703719
vec![EcoString::from("removed1"), EcoString::from("removed2")]
704720
);
705721
}
@@ -731,9 +747,9 @@ mod manifest_update_tests {
731747
})],
732748
};
733749

734-
let resolved = Resolved::with_updates(&old, new);
735-
assert!(resolved.changed.is_empty());
736-
assert_eq!(resolved.removed, vec![name.clone()]);
737-
assert_eq!(resolved.added, vec![(name.clone(), version.clone())]);
750+
let changes = PackageChanges::between_manifests(&old, &new);
751+
assert!(changes.changed.is_empty());
752+
assert_eq!(changes.removed, vec![name.clone()]);
753+
assert_eq!(changes.added, vec![(name.clone(), version.clone())]);
738754
}
739755
}

0 commit comments

Comments
 (0)