Skip to content

Commit d541f1a

Browse files
committed
unify line processing for lockfile generation and dependency fetching
to prevent them from diverging in the future - adjust Command::process_lines to change the 'pl lifetime when changing the processing function
1 parent bfb6ab8 commit d541f1a

File tree

3 files changed

+33
-39
lines changed

3 files changed

+33
-39
lines changed

src/cmd/mod.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -329,9 +329,14 @@ impl<'w, 'pl> Command<'w, 'pl> {
329329
/// # Ok(())
330330
/// # }
331331
/// ```
332-
pub fn process_lines(mut self, f: &'pl mut dyn FnMut(&str, &mut ProcessLinesActions)) -> Self {
333-
self.process_lines = Some(f);
334-
self
332+
pub fn process_lines<'pl2>(
333+
self,
334+
f: &'pl2 mut dyn FnMut(&str, &mut ProcessLinesActions),
335+
) -> Command<'w, 'pl2> {
336+
Command {
337+
process_lines: Some(f),
338+
..self
339+
}
335340
}
336341

337342
/// Enable or disable logging all the output lines to the [`log` crate][log]. By default

src/prepare.rs

Lines changed: 23 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::cmd::{Command, CommandError};
1+
use crate::cmd::{Command, CommandError, ProcessLinesActions};
22
use crate::{build::CratePatch, Crate, Toolchain, Workspace};
33
use anyhow::Context as _;
44
use log::info;
@@ -101,8 +101,6 @@ impl<'a> Prepare<'a> {
101101
return Ok(());
102102
}
103103

104-
let mut yanked_deps = false;
105-
let mut missing_deps = false;
106104
let mut cmd = Command::new(self.workspace, self.toolchain.cargo()).args(&[
107105
"generate-lockfile",
108106
"--manifest-path",
@@ -114,28 +112,7 @@ impl<'a> Prepare<'a> {
114112
.env("__CARGO_TEST_CHANNEL_OVERRIDE_DO_NOT_USE_THIS", "nightly");
115113
}
116114

117-
match cmd
118-
.cd(self.source_dir)
119-
.process_lines(&mut |line, _| {
120-
if line.contains("failed to select a version for the requirement") {
121-
yanked_deps = true;
122-
} else if line.contains("failed to load source for dependency")
123-
|| line.contains("no matching package named")
124-
{
125-
missing_deps = true;
126-
}
127-
})
128-
.run_capture()
129-
{
130-
Ok(_) => Ok(()),
131-
Err(CommandError::ExecutionFailed { status: _, stderr }) if yanked_deps => {
132-
Err(PrepareError::YankedDependencies(stderr).into())
133-
}
134-
Err(CommandError::ExecutionFailed { status: _, stderr }) if missing_deps => {
135-
Err(PrepareError::MissingDependencies(stderr).into())
136-
}
137-
Err(err) => Err(err.into()),
138-
}
115+
run_command(cmd.cd(self.source_dir))
139116
}
140117

141118
fn fetch_deps(&mut self) -> anyhow::Result<()> {
@@ -149,7 +126,6 @@ pub(crate) fn fetch_deps(
149126
source_dir: &Path,
150127
fetch_build_std_targets: &[&str],
151128
) -> anyhow::Result<()> {
152-
let mut missing_deps = false;
153129
let mut cmd = Command::new(workspace, toolchain.cargo())
154130
.args(&["fetch", "--manifest-path", "Cargo.toml"])
155131
.cd(source_dir);
@@ -163,15 +139,28 @@ pub(crate) fn fetch_deps(
163139
cmd = cmd.args(&["--target", target]);
164140
}
165141

166-
match cmd
167-
.process_lines(&mut |line, _| {
168-
if line.contains("failed to load source for dependency") {
169-
missing_deps = true;
170-
}
171-
})
172-
.run_capture()
173-
{
142+
run_command(cmd)
143+
}
144+
145+
fn run_command(cmd: Command) -> anyhow::Result<()> {
146+
let mut yanked_deps = false;
147+
let mut missing_deps = false;
148+
149+
let mut process = |line: &str, _: &mut ProcessLinesActions| {
150+
if line.contains("failed to select a version for the requirement") {
151+
yanked_deps = true;
152+
} else if line.contains("failed to load source for dependency")
153+
|| line.contains("no matching package named")
154+
{
155+
missing_deps = true;
156+
}
157+
};
158+
159+
match cmd.process_lines(&mut process).run_capture() {
174160
Ok(_) => Ok(()),
161+
Err(CommandError::ExecutionFailed { status: _, stderr }) if yanked_deps => {
162+
Err(PrepareError::YankedDependencies(stderr).into())
163+
}
175164
Err(CommandError::ExecutionFailed { status: _, stderr }) if missing_deps => {
176165
Err(PrepareError::MissingDependencies(stderr).into())
177166
}

tests/buildtest/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,10 +317,10 @@ test_prepare_unknown_err!(
317317
"no matching package for override `https://github.com/rust-lang/crates.io-index#build-rs@0.1.2` found"
318318
);
319319

320-
test_prepare_unknown_err!(
320+
test_prepare_error_stderr!(
321321
test_missing_deps_registry_version,
322322
"missing-deps-registry-version",
323-
MissingDependencies,
323+
YankedDependencies,
324324
"error: failed to select a version for the requirement `empty-library = \"=0.5.0\"`"
325325
);
326326

0 commit comments

Comments
 (0)