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
154 let (bump, breaking_dependency) = match adjustment {154 let (bump, breaking_dependency) = match adjustment {
155 VersionAdjustment::Breakage {155 VersionAdjustment::Breakage {
156 bump,156 bump,
157 direct_dependency,157 causing_dependency: direct_dependency,
158 ..158 ..
159 } => (bump, Some(direct_dependency)),159 } => (bump, Some(direct_dependency)),
160 VersionAdjustment::Changed { bump, .. } => (bump, None),160 VersionAdjustment::Changed { bump, .. } => (bump, None),
@@ -213,7 +213,7 @@ fn present_dependencies( · 52 unmodified lines
213 adjustment:213 adjustment:
214 Some(VersionAdjustment::Breakage {214 Some(VersionAdjustment::Breakage {
215 bump,215 bump,
216 direct_dependency,216 causing_dependency: direct_dependency,
217 ..217 ..
218 }),218 }),
219 ..219 ..
cargo-smart-release/src/traverse.rs+26−36
@@ -3,7 +3,6 @@ use std::collections::BTreeSet; · 2 unmodified lines
3use cargo_metadata::{DependencyKind, Metadata, Package, PackageId};3use cargo_metadata::{DependencyKind, Metadata, Package, PackageId};
4 4
5use crate::utils::package_eq_dependency;5use crate::utils::package_eq_dependency;
6use crate::version::rhs_is_breaking_bump_for_lhs;
7use crate::{6use crate::{
8 git,7 git,
9 traverse::dependency::VersionAdjustment,8 traverse::dependency::VersionAdjustment,
@@ -35,19 +34,19 @@ pub mod dependency { · 25 unmodified lines
35 pub enum VersionAdjustment<'meta> {34 pub enum VersionAdjustment<'meta> {
36 Changed {35 Changed {
37 change: git::PackageChangeKind,36 change: git::PackageChangeKind,
38 bump: version::bump::Outcome,37 bump: version::Bump,
39 },38 },
40 Breakage {39 Breakage {
41 bump: version::bump::Outcome,40 bump: version::Bump,
42 /// Set if there is a change at all, which might not be the case for previously skipped crates.41 /// Set if there is a change at all, which might not be the case for previously skipped crates.
43 change: Option<git::PackageChangeKind>,42 change: Option<git::PackageChangeKind>,
44 /// The direct dependency causing the breakage because it's breaking itself43 /// The direct dependency causing the breakage because it's breaking itself
45 direct_dependency: &'meta Package,44 causing_dependency: &'meta Package,
46 },45 },
47 }46 }
48 47
49 impl<'meta> VersionAdjustment<'meta> {48 impl<'meta> VersionAdjustment<'meta> {
50 pub fn bump(&self) -> &version::bump::Outcome {49 pub fn bump(&self) -> &version::Bump {
51 match self {50 match self {
52 VersionAdjustment::Breakage { bump, .. } | VersionAdjustment::Changed { bump, .. } => bump,51 VersionAdjustment::Breakage { bump, .. } | VersionAdjustment::Changed { bump, .. } => bump,
53 }52 }
@@ -69,7 +68,7 @@ pub mod dependency { · 15 unmodified lines
69 }68 }
70 69
71 impl<'meta> Mode<'meta> {70 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> {
73 match self {72 match self {
74 Mode::ToBePublished { adjustment }73 Mode::ToBePublished { adjustment }
75 | Mode::Skipped {74 | Mode::Skipped {
@@ -186,26 +185,28 @@ pub fn dependencies( · 110 unmodified lines
186 Ok(crates)185 Ok(crates)
187}186}
188 187
189struct EditForPublish {188struct EditForPublish<'a, 'meta> {
190 crates_idx: usize,189 crates_idx: usize,
191 bump: Option<version::bump::Outcome>,190 dependency: &'a Dependency<'meta>,
191 causing_dependency: &'meta Package,
192}192}
193 193
194impl EditForPublish {194impl<'a, 'meta> EditForPublish<'a, 'meta> {
195 fn breaking_release(idx: usize, _existing: Option<&version::bump::Outcome>) -> Self {195 fn from(idx: usize, dependency: &'a Dependency<'meta>, causing_dependency: &'meta Package) -> Self {
196 EditForPublish {196 EditForPublish {
197 crates_idx: idx,197 crates_idx: idx,
198 bump: todo!("breaking change"),198 dependency,
199 causing_dependency,
199 }200 }
200 }201 }
201}202}
202 203
203fn find_safety_bump_edits_backwards_from_crates_for_publish(204fn find_safety_bump_edits_backwards_from_crates_for_publish<'a, 'meta>(
204 crates: &[Dependency<'_>],205 crates: &'a [Dependency<'meta>],
205 start: (usize, &Dependency<'_>),206 start: (usize, &'a Dependency<'meta>),
206 seen: &mut BTreeSet<usize>,207 seen: &mut BTreeSet<usize>,
207 edits: &mut Vec<EditForPublish>,208 edits: &mut Vec<EditForPublish<'a, 'meta>>,
208) -> bool {209) -> Option<&'meta Package> {
209 let (current_idx, current) = start;210 let (current_idx, current) = start;
210 for (dep_idx, dep) in current.package.dependencies.iter().filter_map(|dep| {211 for (dep_idx, dep) in current.package.dependencies.iter().filter_map(|dep| {
211 crates212 crates
@@ -214,37 +215,26 @@ fn find_safety_bump_edits_backwards_from_crates_for_publish( · 2 unmodified lines
214 .find(|(_, c)| package_eq_dependency(c.package, dep))215 .find(|(_, c)| package_eq_dependency(c.package, dep))
215 }) {216 }) {
216 if seen.contains(&dep_idx) {217 if seen.contains(&dep_idx) {
217 return false;218 continue;
218 }219 }
219 seen.insert(dep_idx);220 seen.insert(dep_idx);
220 221
221 match dep.mode.version_adjustment_bump() {222 match dep.mode.version_adjustment_bump() {
222 Some(dep_bump)223 Some(dep_bump) if dep_bump.is_breaking() => {
223 if rhs_is_breaking_bump_for_lhs(224 edits.push(EditForPublish::from(current_idx, current, dep.package));
224 &dep.package.version,225 return Some(dep.package);
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;
233 }226 }
234 _ => {227 _ => {
235 let has_breaking_in_dependencies =228 let root_cause_of_breakage =
236 find_safety_bump_edits_backwards_from_crates_for_publish(crates, (dep_idx, dep), seen, edits);229 find_safety_bump_edits_backwards_from_crates_for_publish(crates, (dep_idx, dep), seen, edits);
237 if has_breaking_in_dependencies {230 if let Some(breaking_package) = root_cause_of_breakage {
238 edits.push(EditForPublish::breaking_release(231 edits.push(EditForPublish::from(current_idx, current, breaking_package));
239 current_idx,232 return breaking_package.into();
240 current.mode.version_adjustment_bump(),
241 ));
242 return true;
243 }233 }
244 }234 }
245 }235 }
246 }236 }
247 false237 None
248}238}
249 239
250fn depth_first_traversal<'meta>(240fn depth_first_traversal<'meta>(
cargo-smart-release/src/version.rs+19−7
@@ -65,15 +65,26 @@ pub mod bump { · 64 unmodified lines
65 pub enum Error {65 pub enum Error {
66 LatestReleaseMoreRecentThanDesiredOne(semver::Version),66 LatestReleaseMoreRecentThanDesiredOne(semver::Version),
67 }67 }
68 #[derive(Clone, Debug)]68}
69 pub struct Outcome {69
70 pub next_release: Result<semver::Version, Error>,70#[derive(Clone, Debug)]
71 pub latest_release: Option<semver::Version>,71pub struct Bump {
72 pub desired_release: semver::Version,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
78impl 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 )
73 }84 }
74}85}
75 86
76pub(crate) fn bump_package(package: &Package, ctx: &Context, bump_when_needed: bool) -> anyhow::Result<bump::Outcome> {87pub(crate) fn bump_package(package: &Package, ctx: &Context, bump_when_needed: bool) -> anyhow::Result<Bump> {
77 let mut v = package.version.clone();88 let mut v = package.version.clone();
78 let bump_spec = select_publishee_bump_spec(&package.name, ctx);89 let bump_spec = select_publishee_bump_spec(&package.name, ctx);
79 use BumpSpec::*;90 use BumpSpec::*;
@@ -156,8 +167,9 @@ pub(crate) fn bump_package(package: &Package, ctx: &Context, bump_when_needed: b · 76 unmodified lines
156 }),167 }),
157 ),168 ),
158 };169 };
159 Ok(bump::Outcome {170 Ok(Bump {
160 next_release,171 next_release,
172 package_version: package.version.clone(),
161 desired_release,173 desired_release,
162 latest_release,174 latest_release,
163 })175 })

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