diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs index c87476d8f58b8..4bc162abee6c1 100644 --- a/src/bootstrap/builder.rs +++ b/src/bootstrap/builder.rs @@ -477,7 +477,7 @@ impl<'a> Builder<'a> { install::Src, install::Rustc ), - Kind::Run => describe!(run::ExpandYamlAnchors, run::BuildManifest,), + Kind::Run => describe!(run::ExpandYamlAnchors, run::BuildManifest), } } diff --git a/src/bootstrap/setup.rs b/src/bootstrap/setup.rs index 9d3a889aa008e..cbf53dae80608 100644 --- a/src/bootstrap/setup.rs +++ b/src/bootstrap/setup.rs @@ -46,6 +46,12 @@ pub fn setup(src_path: &Path, include_name: &str) { _ => return, }; + println!(); + + t!(install_git_hook_maybe(src_path)); + + println!(); + println!("To get started, try one of the following commands:"); for cmd in suggestions { println!("- `x.py {}`", cmd); @@ -86,3 +92,44 @@ d) Install Rust from source" }; Ok(template.to_owned()) } + +// install a git hook to automatically run tidy --bless, if they want +fn install_git_hook_maybe(src_path: &Path) -> io::Result<()> { + let mut input = String::new(); + println!( + "Rust's CI will automatically fail if it doesn't pass `tidy`, the internal tool for ensuring code quality. +If you'd like, x.py can install a git hook for you that will automatically run `tidy --bless` on each commit +to ensure your code is up to par. If you decide later that this behavior is undesirable, +simply delete the `pre-commit` file from .git/hooks." + ); + + let should_install = loop { + print!("Would you like to install the git hook?: [y/N] "); + io::stdout().flush()?; + input.clear(); + io::stdin().read_line(&mut input)?; + break match input.trim().to_lowercase().as_str() { + "y" | "yes" => true, + "n" | "no" | "" => false, + _ => { + println!("error: unrecognized option '{}'", input.trim()); + println!("note: press Ctrl+C to exit"); + continue; + } + }; + }; + + Ok(if should_install { + let src = src_path.join("src").join("etc").join("pre-commit.sh"); + let dst = src_path.join(".git").join("hooks").join("pre-commit"); + match fs::hard_link(src, dst) { + Err(e) => println!( + "x.py encountered an error -- do you already have the git hook installed?\n{}", + e + ), + Ok(_) => println!("Linked `src/etc/pre-commit.sh` to `.git/hooks/pre-commit`"), + }; + } else { + println!("Ok, skipping installation!"); + }) +} diff --git a/src/etc/pre-commit.sh b/src/etc/pre-commit.sh new file mode 100755 index 0000000000000..5c5922a7e63ec --- /dev/null +++ b/src/etc/pre-commit.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# +# Call `tidy --bless` before each commit +# Copy this scripts to .git/hooks to activate, +# and remove it from .git/hooks to deactivate. +# + +set -Eeuo pipefail + +ROOT_DIR="$(git rev-parse --show-toplevel)"; +COMMAND="$ROOT_DIR/x.py test tidy --bless"; + +if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then + COMMAND="python $COMMAND" +fi + +echo "Running pre-commit script '$COMMAND'"; + +cd "$ROOT_DIR" + +$COMMAND;