History

track root-cause as well (#222)

Sebastian Thiel committed 5 years ago

Commit 7f8e7201 parent 0b018c03 files · +47 −45Browse files

Unified · Split

3 files
  1. cargo-smart-release/src/command/release/mod.rs +2 −2
  2. cargo-smart-release/src/traverse.rs +26 −36
  3. cargo-smart-release/src/version.rs +19 −7
cargo-smart-release/src/command/release/mod.rs+2−2
@@ -154,7 +154,7 @@ fn present_dependencies( · 153 unmodified lines
154154 let (bump, breaking_dependency) = match adjustment {
155155 VersionAdjustment::Breakage {
156156 bump,
157− direct_dependency,
157+ causing_dependency: direct_dependency,
158158 ..
159159 } => (bump, Some(direct_dependency)),
160160 VersionAdjustment::Changed { bump, .. } => (bump, None),
@@ -213,7 +213,7 @@ fn present_dependencies( · 52 unmodified lines
213213 adjustment:
214214 Some(VersionAdjustment::Breakage {
215215 bump,
216− direct_dependency,
216+ causing_dependency: direct_dependency,
217217 ..
218218 }),
219219 ..
cargo-smart-release/src/traverse.rs+26−36
@@ -3,7 +3,6 @@ use std::collections::BTreeSet; · 2 unmodified lines
33 use cargo_metadata::{DependencyKind, Metadata, Package, PackageId};
44
55 use crate::utils::package_eq_dependency;
6−use crate::version::rhs_is_breaking_bump_for_lhs;
76 use crate::{
87 git,
98 traverse::dependency::VersionAdjustment,
@@ -35,19 +34,19 @@ pub mod dependency { · 25 unmodified lines
3534 pub enum VersionAdjustment<'meta> {
3635 Changed {
3736 change: git::PackageChangeKind,
38− bump: version::bump::Outcome,
37+ bump: version::Bump,
3938 },
4039 Breakage {
41− bump: version::bump::Outcome,
40+ bump: version::Bump,
4241 /// Set if there is a change at all, which might not be the case for previously skipped crates.
4342 change: Option<git::PackageChangeKind>,
4443 /// The direct dependency causing the breakage because it's breaking itself
45− direct_dependency: &'meta Package,
44+ causing_dependency: &'meta Package,
4645 },
4746 }
4847
4948 impl<'meta> VersionAdjustment<'meta> {
50− pub fn bump(&self) -> &version::bump::Outcome {
49+ pub fn bump(&self) -> &version::Bump {
5150 match self {
5251 VersionAdjustment::Breakage { bump, .. } | VersionAdjustment::Changed { bump, .. } => bump,
5352 }
@@ -69,7 +68,7 @@ pub mod dependency { · 15 unmodified lines
6968 }
7069
7170 impl<'meta> Mode<'meta> {
72− pub fn version_adjustment_bump(&self) -> Option<&version::bump::Outcome> {
71+ pub fn version_adjustment_bump(&self) -> Option<&version::Bump> {
7372 match self {
7473 Mode::ToBePublished { adjustment }
7574 | Mode::Skipped {
@@ -186,26 +185,28 @@ pub fn dependencies( · 110 unmodified lines
186185 Ok(crates)
187186 }
188187
189−struct EditForPublish {
188+struct EditForPublish<'a, 'meta> {
190189 crates_idx: usize,
191− bump: Option<version::bump::Outcome>,
190+ dependency: &'a Dependency<'meta>,
191+ causing_dependency: &'meta Package,
192192 }
193193
194−impl EditForPublish {
195− fn breaking_release(idx: usize, _existing: Option<&version::bump::Outcome>) -> Self {
194+impl<'a, 'meta> EditForPublish<'a, 'meta> {
195+ fn from(idx: usize, dependency: &'a Dependency<'meta>, causing_dependency: &'meta Package) -> Self {
196196 EditForPublish {
197197 crates_idx: idx,
198− bump: todo!("breaking change"),
198+ dependency,
199+ causing_dependency,
199200 }
200201 }
201202 }
202203
203−fn find_safety_bump_edits_backwards_from_crates_for_publish(
204− crates: &[Dependency<'_>],
205− start: (usize, &Dependency<'_>),
204+fn find_safety_bump_edits_backwards_from_crates_for_publish<'a, 'meta>(
205+ crates: &'a [Dependency<'meta>],
206+ start: (usize, &'a Dependency<'meta>),
206207 seen: &mut BTreeSet<usize>,
207− edits: &mut Vec<EditForPublish>,
208−) -> bool {
208+ edits: &mut Vec<EditForPublish<'a, 'meta>>,
209+) -> Option<&'meta Package> {
209210 let (current_idx, current) = start;
210211 for (dep_idx, dep) in current.package.dependencies.iter().filter_map(|dep| {
211212 crates
@@ -214,37 +215,26 @@ fn find_safety_bump_edits_backwards_from_crates_for_publish( · 2 unmodified lines
214215 .find(|(_, c)| package_eq_dependency(c.package, dep))
215216 }) {
216217 if seen.contains(&dep_idx) {
217− return false;
218+ continue;
218219 }
219220 seen.insert(dep_idx);
220221
221222 match dep.mode.version_adjustment_bump() {
222− Some(dep_bump)
223− if rhs_is_breaking_bump_for_lhs(
224− &dep.package.version,
225− dep_bump.next_release.as_ref().expect("only valid versions here"),
226− ) =>
227− {
228− edits.push(EditForPublish::breaking_release(
229− current_idx,
230− current.mode.version_adjustment_bump(),
231− ));
232− return true;
223+ Some(dep_bump) if dep_bump.is_breaking() => {
224+ edits.push(EditForPublish::from(current_idx, current, dep.package));
225+ return Some(dep.package);
233226 }
234227 _ => {
235− let has_breaking_in_dependencies =
228+ let root_cause_of_breakage =
236229 find_safety_bump_edits_backwards_from_crates_for_publish(crates, (dep_idx, dep), seen, edits);
237− if has_breaking_in_dependencies {
238− edits.push(EditForPublish::breaking_release(
239− current_idx,
240− current.mode.version_adjustment_bump(),
241− ));
242− return true;
230+ if let Some(breaking_package) = root_cause_of_breakage {
231+ edits.push(EditForPublish::from(current_idx, current, breaking_package));
232+ return breaking_package.into();
243233 }
244234 }
245235 }
246236 }
247− false
237+ None
248238 }
249239
250240 fn depth_first_traversal<'meta>(
cargo-smart-release/src/version.rs+19−7
@@ -65,15 +65,26 @@ pub mod bump { · 64 unmodified lines
6565 pub enum Error {
6666 LatestReleaseMoreRecentThanDesiredOne(semver::Version),
6767 }
68− #[derive(Clone, Debug)]
69− pub struct Outcome {
70− pub next_release: Result<semver::Version, Error>,
71− pub latest_release: Option<semver::Version>,
72− pub desired_release: semver::Version,
68+}
69+
70+#[derive(Clone, Debug)]
71+pub struct Bump {
72+ pub next_release: Result<semver::Version, bump::Error>,
73+ pub package_version: semver::Version,
74+ pub latest_release: Option<semver::Version>,
75+ pub desired_release: semver::Version,
76+}
77+
78+impl Bump {
79+ pub fn is_breaking(&self) -> bool {
80+ rhs_is_breaking_bump_for_lhs(
81+ &self.package_version,
82+ self.next_release.as_ref().expect("only valid versions here"),
83+ )
7384 }
7485 }
7586
76−pub(crate) fn bump_package(package: &Package, ctx: &Context, bump_when_needed: bool) -> anyhow::Result<bump::Outcome> {
87+pub(crate) fn bump_package(package: &Package, ctx: &Context, bump_when_needed: bool) -> anyhow::Result<Bump> {
7788 let mut v = package.version.clone();
7889 let bump_spec = select_publishee_bump_spec(&package.name, ctx);
7990 use BumpSpec::*;
@@ -156,8 +167,9 @@ pub(crate) fn bump_package(package: &Package, ctx: &Context, bump_when_needed: b · 76 unmodified lines
156167 }),
157168 ),
158169 };
159− Ok(bump::Outcome {
170+ Ok(Bump {
160171 next_release,
172+ package_version: package.version.clone(),
161173 desired_release,
162174 latest_release,
163175 })

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t