Skip to content

Commit 3eb4a17

Browse files
committed
Report all version changes
1 parent a580aea commit 3eb4a17

File tree

10 files changed

+203
-60
lines changed

10 files changed

+203
-60
lines changed

compiler-cli/src/add.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub fn command(paths: &ProjectPaths, packages_to_add: Vec<String>, dev: bool) ->
2727

2828
// Insert the new packages into the manifest and perform dependency
2929
// resolution to determine suitable versions
30-
let manifest = dependencies::download(
30+
let manifest = dependencies::resolve_and_download(
3131
paths,
3232
cli::Reporter::new(),
3333
Some((new_package_requirements.clone(), dev)),
@@ -84,8 +84,6 @@ pub fn command(paths: &ProjectPaths, packages_to_add: Vec<String>, dev: bool) ->
8484
.as_inline_table_mut()
8585
.expect("Invalid manifest format")["version"] = range.into();
8686
}
87-
88-
cli::print_added(&format!("{added_package} v{version}"));
8987
}
9088

9189
// Write the updated config

compiler-cli/src/build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::{
1515
};
1616

1717
pub fn download_dependencies(paths: &ProjectPaths, telemetry: impl Telemetry) -> Result<Manifest> {
18-
dependencies::download(
18+
dependencies::resolve_and_download(
1919
paths,
2020
telemetry,
2121
None,

compiler-cli/src/cli.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use gleam_core::{
22
build::Telemetry,
33
error::{Error, StandardIoAction},
4+
manifest::Resolved,
45
};
56
use hexpm::version::Version;
67
use std::{
@@ -54,6 +55,10 @@ impl Telemetry for Reporter {
5455
fn waiting_for_build_directory_lock(&self) {
5556
print_waiting_for_build_directory_lock()
5657
}
58+
59+
fn resolved_package_versions(&self, resolved: &Resolved) {
60+
print_resolved(resolved)
61+
}
5762
}
5863

5964
pub fn ask(question: &str) -> Result<String, Error> {
@@ -148,11 +153,27 @@ pub(crate) fn print_running(text: &str) {
148153
print_colourful_prefix("Running", text)
149154
}
150155

151-
pub(crate) fn print_added(text: &str) {
156+
pub(crate) fn print_resolved(resolved: &Resolved) {
157+
for (name, version) in &resolved.added {
158+
print_added(&format!("{name} v{version}"));
159+
}
160+
for (name, old, new) in &resolved.changed {
161+
print_changed(&format!("{name} v{old} -> v{new}"));
162+
}
163+
for name in &resolved.removed {
164+
print_removed(name);
165+
}
166+
}
167+
168+
fn print_added(text: &str) {
152169
print_colourful_prefix("Added", text)
153170
}
154171

155-
pub(crate) fn print_removed(text: &str) {
172+
fn print_changed(text: &str) {
173+
print_colourful_prefix("Changed", text)
174+
}
175+
176+
fn print_removed(text: &str) {
156177
print_colourful_prefix("Removed", text)
157178
}
158179

compiler-cli/src/dependencies.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use gleam_core::{
1919
error::{FileIoAction, FileKind, ShellCommandFailureReason, StandardIoAction},
2020
hex::{self, HEXPM_PUBLIC_KEY},
2121
io::{HttpClient as _, TarUnpacker, WrappedReader},
22-
manifest::{Base16Checksum, Manifest, ManifestPackage, ManifestPackageSource},
22+
manifest::{Base16Checksum, Manifest, ManifestPackage, ManifestPackageSource, Resolved},
2323
paths::ProjectPaths,
2424
requirement::Requirement,
2525
};
@@ -228,7 +228,7 @@ pub fn update(paths: &ProjectPaths, packages: Vec<String>) -> Result<()> {
228228
};
229229

230230
// Update specific packages
231-
_ = download(
231+
_ = resolve_and_download(
232232
paths,
233233
cli::Reporter::new(),
234234
None,
@@ -257,7 +257,8 @@ pub fn cleanup<Telem: Telemetry>(paths: &ProjectPaths, telemetry: Telem) -> Resu
257257

258258
// Read the project config
259259
let config = crate::root_config(paths)?;
260-
let mut manifest = read_manifest_from_disc(paths)?;
260+
let old_manifest = read_manifest_from_disc(paths)?;
261+
let mut manifest = old_manifest.clone();
261262

262263
remove_extra_requirements(&config, &mut manifest)?;
263264

@@ -270,7 +271,10 @@ pub fn cleanup<Telem: Telemetry>(paths: &ProjectPaths, telemetry: Telem) -> Resu
270271
write_manifest_to_disc(paths, &manifest)?;
271272
LocalPackages::from_manifest(&manifest).write_to_disc(paths)?;
272273

273-
Ok(manifest)
274+
let resolved = Resolved::with_updates(&old_manifest, manifest);
275+
telemetry.resolved_package_versions(&resolved);
276+
277+
Ok(resolved.manifest)
274278
}
275279

276280
/// Remove requirements and unneeded packages from manifest that are no longer present in config.
@@ -367,7 +371,7 @@ pub fn parse_gleam_add_specifier(package: &str) -> Result<(EcoString, Requiremen
367371
Ok((package.into(), requirement))
368372
}
369373

370-
pub fn download<Telem: Telemetry>(
374+
pub fn resolve_and_download<Telem: Telemetry>(
371375
paths: &ProjectPaths,
372376
telemetry: Telem,
373377
new_package: Option<(Vec<(EcoString, Requirement)>, bool)>,
@@ -385,7 +389,7 @@ pub fn download<Telem: Telemetry>(
385389
Mode::Dev,
386390
);
387391

388-
dependency_manager.download(paths, new_package, packages_to_update)
392+
dependency_manager.resolve_and_download_versions(paths, new_package, packages_to_update)
389393
}
390394

391395
fn pretty_print_major_versions_available(versions: dependency::PackageVersionDiffs) -> String {

compiler-cli/src/dependencies/dependency_manager.rs

Lines changed: 17 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
use std::collections::HashMap;
2-
31
use ecow::EcoString;
42
use futures::future;
53
use gleam_core::{
64
Error, Result,
75
build::{Mode, Telemetry},
86
config::PackageConfig,
97
dependency,
10-
manifest::Manifest,
8+
manifest::{Manifest, Resolved},
119
paths::ProjectPaths,
1210
requirement::Requirement,
1311
};
12+
use std::collections::HashMap;
1413

1514
use crate::{
1615
build_lock::BuildLock,
@@ -54,23 +53,6 @@ impl DependencyManagerConfig {
5453
}
5554
}
5655

57-
pub struct Resolved {
58-
pub manifest: Manifest,
59-
pub versions_changed: bool,
60-
}
61-
62-
impl Resolved {
63-
/// Create a `Resolved`, comparing the old and new versions of the manifest to work out
64-
/// if resolution resulted in any changes.
65-
pub fn with_updates(old: &Manifest, new: Manifest) -> Self {
66-
let versions_changed = old.packages != new.packages;
67-
Self {
68-
manifest: new,
69-
versions_changed,
70-
}
71-
}
72-
}
73-
7456
pub struct DependencyManager<Telem, P> {
7557
runtime: tokio::runtime::Handle,
7658
package_fetcher: P,
@@ -99,10 +81,7 @@ where
9981
if !paths.manifest().exists() {
10082
tracing::debug!("manifest_not_present");
10183
let manifest = self.perform_version_resolution(paths, config, None, Vec::new())?;
102-
return Ok(Resolved {
103-
manifest,
104-
versions_changed: true,
105-
});
84+
return Ok(Resolved::add_added(manifest));
10685
}
10786

10887
let existing_manifest = read_manifest_from_disc(paths)?;
@@ -121,10 +100,7 @@ where
121100
paths.root(),
122101
)?
123102
{
124-
return Ok(Resolved {
125-
manifest: existing_manifest,
126-
versions_changed: false,
127-
});
103+
return Ok(Resolved::no_change(existing_manifest));
128104
}
129105

130106
// Otherwise, use the manifest to inform resolution.
@@ -142,7 +118,7 @@ where
142118
Ok(Resolved::with_updates(&existing_manifest, new_manifest))
143119
}
144120

145-
pub fn download(
121+
pub fn resolve_and_download_versions(
146122
&self,
147123
paths: &ProjectPaths,
148124
new_package: Option<(Vec<(EcoString, Requirement)>, bool)>,
@@ -176,36 +152,35 @@ where
176152
}
177153

178154
// Determine what versions we need
179-
let Resolved {
180-
manifest,
181-
versions_changed: manifest_updated,
182-
} = self.resolve_versions(paths, &config, packages_to_update)?;
155+
let resolved = self.resolve_versions(paths, &config, packages_to_update)?;
183156
let local = LocalPackages::read_from_disc(paths)?;
184157

185158
// Remove any packages that are no longer required due to gleam.toml changes
186-
remove_extra_packages(paths, &local, &manifest, &self.telemetry)?;
159+
remove_extra_packages(paths, &local, &resolved.manifest, &self.telemetry)?;
187160

188161
// Download them from Hex to the local cache
189162
self.runtime.block_on(add_missing_packages(
190163
paths,
191164
fs,
192-
&manifest,
165+
&resolved.manifest,
193166
&local,
194167
project_name,
195168
&self.telemetry,
196169
))?;
197170

198-
if manifest_updated {
171+
if resolved.any_changes() {
199172
// Record new state of the packages directory
200173
// TODO: test
201174
tracing::debug!("writing_manifest_toml");
202-
write_manifest_to_disc(paths, &manifest)?;
175+
write_manifest_to_disc(paths, &resolved.manifest)?;
203176
}
204-
LocalPackages::from_manifest(&manifest).write_to_disc(paths)?;
177+
LocalPackages::from_manifest(&resolved.manifest).write_to_disc(paths)?;
205178

206179
if let CheckMajorVersions::Yes = self.check_major_versions {
207-
let major_versions_available =
208-
dependency::check_for_major_version_updates(&manifest, &self.package_fetcher);
180+
let major_versions_available = dependency::check_for_major_version_updates(
181+
&resolved.manifest,
182+
&self.package_fetcher,
183+
);
209184
if !major_versions_available.is_empty() {
210185
eprintln!(
211186
"{}",
@@ -214,7 +189,8 @@ where
214189
}
215190
}
216191

217-
Ok(manifest)
192+
self.telemetry.resolved_package_versions(&resolved);
193+
Ok(resolved.manifest)
218194
}
219195

220196
fn perform_version_resolution(

compiler-cli/src/fs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ impl MakeLocker for ProjectIO {
246246

247247
impl DownloadDependencies for ProjectIO {
248248
fn download_dependencies(&self, paths: &ProjectPaths) -> Result<Manifest> {
249-
dependencies::download(
249+
dependencies::resolve_and_download(
250250
paths,
251251
NullTelemetry,
252252
None,

compiler-cli/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -774,7 +774,7 @@ fn project_paths_at_current_directory_without_toml() -> ProjectPaths {
774774
}
775775

776776
fn download_dependencies(paths: &ProjectPaths) -> Result<()> {
777-
_ = dependencies::download(
777+
_ = dependencies::resolve_and_download(
778778
paths,
779779
cli::Reporter::new(),
780780
None,

compiler-cli/src/remove.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,5 @@ pub fn command(paths: &ProjectPaths, packages: Vec<String>) -> Result<()> {
4646
fs::write(root_config.as_path(), &toml.to_string())?;
4747
_ = crate::dependencies::cleanup(paths, cli::Reporter::new())?;
4848

49-
for package_to_remove in packages {
50-
cli::print_removed(&package_to_remove);
51-
}
52-
5349
Ok(())
5450
}

compiler-core/src/build/telemetry.rs

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

6-
use crate::Warning;
6+
use crate::{Warning, manifest::Resolved};
77

88
pub trait Telemetry: Debug {
99
fn waiting_for_build_directory_lock(&self);
1010
fn running(&self, name: &str);
1111
fn resolving_package_versions(&self);
12+
fn resolved_package_versions(&self, resolved: &Resolved);
1213
fn downloading_package(&self, name: &str);
1314
fn packages_downloaded(&self, start: Instant, count: usize);
1415
fn compiled_package(&self, duration: Duration);
@@ -30,4 +31,5 @@ impl Telemetry for NullTelemetry {
3031
fn checked_package(&self, _duration: Duration) {}
3132
fn checking_package(&self, _name: &str) {}
3233
fn packages_downloaded(&self, _start: Instant, _count: usize) {}
34+
fn resolved_package_versions(&self, _resolved: &Resolved) {}
3335
}

0 commit comments

Comments
 (0)