History

Collect crates for manifest updates (#222)

Sebastian Thiel committed 5 years ago

Commit 56ccdd21 parent 07372dd2 files · +37 −10Browse files

Unified · Split

2 files
  1. cargo-smart-release/src/command/release/mod.rs +11 −5
  2. cargo-smart-release/src/traverse.rs +26 −5
cargo-smart-release/src/command/release/mod.rs+11−5
@@ -133,16 +133,16 @@ fn present_dependencies( · 132 unmodified lines
133133 .count();
134134 if num_skipped != 0 {
135135 log::info!(
136− "Skipped {} dependent crates as they didn't change since their last release. Use --verbose/-v to see much more.",
137− num_skipped
138− );
136+ "Skipped {} dependent crates as they didn't change since their last release.",
137+ num_skipped
138+ );
139139 }
140140
141141 let mut error = false;
142142 for dep in deps {
143143 let (bump_spec, kind) = match dep.kind {
144144 Kind::UserSelection => (ctx.base.bump, "provided"),
145− Kind::DependencyOfUserSelection => (ctx.base.bump_dependencies, "dependent"),
145+ Kind::DependencyOrDependentOfUserSelection => (ctx.base.bump_dependencies, "dependent"),
146146 };
147147 match &dep.mode {
148148 dependency::Mode::ToBePublished { adjustment } => {
@@ -223,7 +223,13 @@ fn present_dependencies( · 74 unmodified lines
223223 direct_dependency.name
224224 );
225225 }
226−
226+ dependency::Mode::ManifestNeedsUpdate => {
227+ log::info!(
228+ "Manifest of {} package '{}' will be adjusted as its dependencies see a version change",
229+ kind,
230+ dep.package.name
231+ );
232+ }
227233 dependency::Mode::Skipped { .. } => {}
228234 }
229235 }
cargo-smart-release/src/traverse.rs+26−5
@@ -5,7 +5,7 @@ use cargo_metadata::{DependencyKind, Metadata, Package, PackageId}; · 4 unmodified lines
55 use crate::{
66 git,
77 traverse::dependency::VersionAdjustment,
8− utils::{is_pre_release_version, package_by_name, workspace_package_by_name},
8+ utils::{is_pre_release_version, package_by_id, package_by_name, workspace_package_by_name},
99 version,
1010 };
1111
@@ -26,7 +26,7 @@ pub mod dependency { · 14 unmodified lines
2626 /// Initially selected by user
2727 UserSelection,
2828 /// A changed dependency of the user selected crate that thus needs publishing
29− DependencyOfUserSelection,
29+ DependencyOrDependentOfUserSelection,
3030 }
3131
3232 #[derive(Clone, Debug)]
@@ -53,6 +53,8 @@ pub mod dependency { · 20 unmodified lines
5353 reason: SkippedReason,
5454 adjustment: Option<VersionAdjustment<'meta>>,
5555 },
56+ /// One of our dependencies will see a version adjustment, which we must update in our manifest
57+ ManifestNeedsUpdate,
5658 }
5759 }
5860
@@ -121,6 +123,25 @@ pub fn dependencies( · 62 unmodified lines
121123 }
122124 }
123125 }
126+
127+ let crates_for_manifest_update = ctx
128+ .meta
129+ .workspace_members
130+ .iter()
131+ .map(|id| package_by_id(&ctx.meta, id))
132+ .filter(|wsp| crates.iter().all(|c| c.package.id != wsp.id))
133+ .filter(|wsp| {
134+ wsp.dependencies
135+ .iter()
136+ .any(|d| crates.iter().any(|c| c.package.name == d.name))
137+ })
138+ .map(|wsp| Dependency {
139+ kind: dependency::Kind::DependencyOrDependentOfUserSelection,
140+ package: wsp,
141+ mode: dependency::Mode::ManifestNeedsUpdate,
142+ })
143+ .collect::<Vec<_>>();
144+ crates.extend(crates_for_manifest_update);
124145 Ok(crates)
125146 }
126147
@@ -154,7 +175,7 @@ fn depth_first_traversal<'meta>( · 27 unmodified lines
154175 if is_pre_release_version(&workspace_dependency.version) || add_production_crates {
155176 crates.push(Dependency {
156177 package: workspace_dependency,
157− kind: dependency::Kind::DependencyOfUserSelection,
178+ kind: dependency::Kind::DependencyOrDependentOfUserSelection,
158179 mode: dependency::Mode::ToBePublished {
159180 adjustment: VersionAdjustment::Changed {
160181 change,
@@ -165,7 +186,7 @@ fn depth_first_traversal<'meta>( · 4 unmodified lines
165186 } else {
166187 crates.push(Dependency {
167188 package: workspace_dependency,
168− kind: dependency::Kind::DependencyOfUserSelection,
189+ kind: dependency::Kind::DependencyOrDependentOfUserSelection,
169190 mode: dependency::Mode::Skipped {
170191 reason: dependency::SkippedReason::DeniedAutopublishOfProductionCrate,
171192 adjustment: None,
@@ -175,7 +196,7 @@ fn depth_first_traversal<'meta>( · 3 unmodified lines
175196 } else {
176197 skipped.push(Dependency {
177198 package: workspace_dependency,
178− kind: dependency::Kind::DependencyOfUserSelection,
199+ kind: dependency::Kind::DependencyOrDependentOfUserSelection,
179200 mode: dependency::Mode::Skipped {
180201 reason: dependency::SkippedReason::Unchanged,
181202 adjustment: None,