about summary refs log tree commit diff
path: root/src/bootstrap
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap')
-rw-r--r--src/bootstrap/setup.rs40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/bootstrap/setup.rs b/src/bootstrap/setup.rs
index 9d3a889aa00..f5ec1d6d247 100644
--- a/src/bootstrap/setup.rs
+++ b/src/bootstrap/setup.rs
@@ -46,6 +46,8 @@ pub fn setup(src_path: &Path, include_name: &str) {
         _ => return,
     };
 
+    t!(install_git_hook_maybe(src_path));
+
     println!("To get started, try one of the following commands:");
     for cmd in suggestions {
         println!("- `x.py {}`", cmd);
@@ -86,3 +88,41 @@ 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()?;
+        io::stdin().read_line(&mut input)?;
+        break match input.trim().to_lowercase().as_str() {
+            "y" | "yes" => true,
+            // is this the right way to check for "entered nothing"?
+            "n" | "no" | "" => false,
+            _ => {
+                println!("error: unrecognized option '{}'", input.trim());
+                println!("note: press Ctrl+C to exit");
+                continue;
+            }
+        };
+    };
+
+    if should_install {
+        let src = src_path.join("/etc/pre-commit.rs");
+        let dst = src_path.join("/.git/hooks/pre-commit");
+        fs::hard_link(src, dst)?;
+        println!("Linked `src/etc/pre-commit.sh` to `.git/hooks/pre-commit`");
+    } else {
+        println!("Ok, skipping installation!");
+    };
+
+    Ok(())
+}