Distinguish between "nothing to pull" and "pull error" in josh-sync
This commit is contained in:
parent
f61d56ba4d
commit
88197e4182
|
|
@ -1,5 +1,5 @@
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use crate::sync::GitSync;
|
use crate::sync::{GitSync, RustcPullError};
|
||||||
|
|
||||||
mod sync;
|
mod sync;
|
||||||
|
|
||||||
|
|
@ -22,7 +22,18 @@ fn main() -> anyhow::Result<()> {
|
||||||
let sync = GitSync::from_current_dir()?;
|
let sync = GitSync::from_current_dir()?;
|
||||||
match args {
|
match args {
|
||||||
Args::RustcPull => {
|
Args::RustcPull => {
|
||||||
sync.rustc_pull(None)?;
|
if let Err(error) = sync.rustc_pull(None) {
|
||||||
|
match error {
|
||||||
|
RustcPullError::NothingToPull => {
|
||||||
|
eprintln!("Nothing to pull");
|
||||||
|
std::process::exit(2);
|
||||||
|
}
|
||||||
|
RustcPullError::PullFailed(error) => {
|
||||||
|
eprintln!("Pull failure: {error:?}");
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Args::RustcPush { github_username, branch } => {
|
Args::RustcPush { github_username, branch } => {
|
||||||
sync.rustc_push(github_username, branch)?;
|
sync.rustc_push(github_username, branch)?;
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,19 @@ const JOSH_FILTER: &str = ":/src/doc/rustc-dev-guide";
|
||||||
const JOSH_PORT: u16 = 42042;
|
const JOSH_PORT: u16 = 42042;
|
||||||
const UPSTREAM_REPO: &str = "rust-lang/rust";
|
const UPSTREAM_REPO: &str = "rust-lang/rust";
|
||||||
|
|
||||||
|
pub enum RustcPullError {
|
||||||
|
/// No changes are available to be pulled.
|
||||||
|
NothingToPull,
|
||||||
|
/// A rustc-pull has failed, probably a git operation error has occurred.
|
||||||
|
PullFailed(anyhow::Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<E> From<E> for RustcPullError where E: Into<anyhow::Error> {
|
||||||
|
fn from(error: E) -> Self {
|
||||||
|
Self::PullFailed(error.into())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct GitSync {
|
pub struct GitSync {
|
||||||
dir: PathBuf,
|
dir: PathBuf,
|
||||||
}
|
}
|
||||||
|
|
@ -24,7 +37,7 @@ impl GitSync {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn rustc_pull(&self, commit: Option<String>) -> anyhow::Result<()> {
|
pub fn rustc_pull(&self, commit: Option<String>) -> Result<(), RustcPullError> {
|
||||||
let sh = Shell::new()?;
|
let sh = Shell::new()?;
|
||||||
sh.change_dir(&self.dir);
|
sh.change_dir(&self.dir);
|
||||||
let commit = commit.map(Ok).unwrap_or_else(|| {
|
let commit = commit.map(Ok).unwrap_or_else(|| {
|
||||||
|
|
@ -38,7 +51,7 @@ impl GitSync {
|
||||||
})?;
|
})?;
|
||||||
// Make sure the repo is clean.
|
// Make sure the repo is clean.
|
||||||
if cmd!(sh, "git status --untracked-files=no --porcelain").read()?.is_empty().not() {
|
if cmd!(sh, "git status --untracked-files=no --porcelain").read()?.is_empty().not() {
|
||||||
bail!("working directory must be clean before performing rustc pull");
|
return Err(anyhow::anyhow!("working directory must be clean before performing rustc pull").into());
|
||||||
}
|
}
|
||||||
// Make sure josh is running.
|
// Make sure josh is running.
|
||||||
let josh = Self::start_josh()?;
|
let josh = Self::start_josh()?;
|
||||||
|
|
@ -47,7 +60,7 @@ impl GitSync {
|
||||||
|
|
||||||
let previous_base_commit = sh.read_file("rust-version")?.trim().to_string();
|
let previous_base_commit = sh.read_file("rust-version")?.trim().to_string();
|
||||||
if previous_base_commit == commit {
|
if previous_base_commit == commit {
|
||||||
return Err(anyhow::anyhow!("No changes since last pull"));
|
return Err(RustcPullError::NothingToPull);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update rust-version file. As a separate commit, since making it part of
|
// Update rust-version file. As a separate commit, since making it part of
|
||||||
|
|
@ -94,12 +107,13 @@ impl GitSync {
|
||||||
cmd!(sh, "git reset --hard HEAD^")
|
cmd!(sh, "git reset --hard HEAD^")
|
||||||
.run()
|
.run()
|
||||||
.expect("FAILED to clean up after creating the preparation commit");
|
.expect("FAILED to clean up after creating the preparation commit");
|
||||||
return Err(anyhow::anyhow!("No merge was performed, nothing to pull. Rolled back the preparation commit."));
|
eprintln!("No merge was performed, no changes to pull were found. Rolled back the preparation commit.");
|
||||||
|
return Err(RustcPullError::NothingToPull);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check that the number of roots did not increase.
|
// Check that the number of roots did not increase.
|
||||||
if num_roots()? != num_roots_before {
|
if num_roots()? != num_roots_before {
|
||||||
bail!("Josh created a new root commit. This is probably not the history you want.");
|
return Err(anyhow::anyhow!("Josh created a new root commit. This is probably not the history you want.").into());
|
||||||
}
|
}
|
||||||
|
|
||||||
drop(josh);
|
drop(josh);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue