Skip to content

Commit 88197e4

Browse files
committed
Distinguish between "nothing to pull" and "pull error" in josh-sync
1 parent f61d56b commit 88197e4

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

Diff for: josh-sync/src/main.rs

+13-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use clap::Parser;
2-
use crate::sync::GitSync;
2+
use crate::sync::{GitSync, RustcPullError};
33

44
mod sync;
55

@@ -22,7 +22,18 @@ fn main() -> anyhow::Result<()> {
2222
let sync = GitSync::from_current_dir()?;
2323
match args {
2424
Args::RustcPull => {
25-
sync.rustc_pull(None)?;
25+
if let Err(error) = sync.rustc_pull(None) {
26+
match error {
27+
RustcPullError::NothingToPull => {
28+
eprintln!("Nothing to pull");
29+
std::process::exit(2);
30+
}
31+
RustcPullError::PullFailed(error) => {
32+
eprintln!("Pull failure: {error:?}");
33+
std::process::exit(1);
34+
}
35+
}
36+
}
2637
}
2738
Args::RustcPush { github_username, branch } => {
2839
sync.rustc_push(github_username, branch)?;

Diff for: josh-sync/src/sync.rs

+19-5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,19 @@ const JOSH_FILTER: &str = ":/src/doc/rustc-dev-guide";
1111
const JOSH_PORT: u16 = 42042;
1212
const UPSTREAM_REPO: &str = "rust-lang/rust";
1313

14+
pub enum RustcPullError {
15+
/// No changes are available to be pulled.
16+
NothingToPull,
17+
/// A rustc-pull has failed, probably a git operation error has occurred.
18+
PullFailed(anyhow::Error)
19+
}
20+
21+
impl<E> From<E> for RustcPullError where E: Into<anyhow::Error> {
22+
fn from(error: E) -> Self {
23+
Self::PullFailed(error.into())
24+
}
25+
}
26+
1427
pub struct GitSync {
1528
dir: PathBuf,
1629
}
@@ -24,7 +37,7 @@ impl GitSync {
2437
})
2538
}
2639

27-
pub fn rustc_pull(&self, commit: Option<String>) -> anyhow::Result<()> {
40+
pub fn rustc_pull(&self, commit: Option<String>) -> Result<(), RustcPullError> {
2841
let sh = Shell::new()?;
2942
sh.change_dir(&self.dir);
3043
let commit = commit.map(Ok).unwrap_or_else(|| {
@@ -38,7 +51,7 @@ impl GitSync {
3851
})?;
3952
// Make sure the repo is clean.
4053
if cmd!(sh, "git status --untracked-files=no --porcelain").read()?.is_empty().not() {
41-
bail!("working directory must be clean before performing rustc pull");
54+
return Err(anyhow::anyhow!("working directory must be clean before performing rustc pull").into());
4255
}
4356
// Make sure josh is running.
4457
let josh = Self::start_josh()?;
@@ -47,7 +60,7 @@ impl GitSync {
4760

4861
let previous_base_commit = sh.read_file("rust-version")?.trim().to_string();
4962
if previous_base_commit == commit {
50-
return Err(anyhow::anyhow!("No changes since last pull"));
63+
return Err(RustcPullError::NothingToPull);
5164
}
5265

5366
// Update rust-version file. As a separate commit, since making it part of
@@ -94,12 +107,13 @@ impl GitSync {
94107
cmd!(sh, "git reset --hard HEAD^")
95108
.run()
96109
.expect("FAILED to clean up after creating the preparation commit");
97-
return Err(anyhow::anyhow!("No merge was performed, nothing to pull. Rolled back the preparation commit."));
110+
eprintln!("No merge was performed, no changes to pull were found. Rolled back the preparation commit.");
111+
return Err(RustcPullError::NothingToPull);
98112
}
99113

100114
// Check that the number of roots did not increase.
101115
if num_roots()? != num_roots_before {
102-
bail!("Josh created a new root commit. This is probably not the history you want.");
116+
return Err(anyhow::anyhow!("Josh created a new root commit. This is probably not the history you want.").into());
103117
}
104118

105119
drop(josh);

0 commit comments

Comments
 (0)