From e823db06985d6782ff3803d3a4dea67a3c18426c Mon Sep 17 00:00:00 2001 From: DJMcNab <36049421+DJMcNab@users.noreply.github.com> Date: Sun, 9 Dec 2018 10:29:13 +0000 Subject: Implement and test format hook --- crates/tools/src/lib.rs | 29 ++++++++++++++++++++++++++++- crates/tools/src/main.rs | 17 +++++++++++------ 2 files changed, 39 insertions(+), 7 deletions(-) (limited to 'crates/tools') diff --git a/crates/tools/src/lib.rs b/crates/tools/src/lib.rs index 674b9d11f..d6c448f3b 100644 --- a/crates/tools/src/lib.rs +++ b/crates/tools/src/lib.rs @@ -1,7 +1,11 @@ use std::{ path::{Path, PathBuf}, process::{Command, Stdio}, + fs::OpenOptions, + io::{Write, Error, ErrorKind} }; +#[cfg(unix)] +use std::os::unix::fs::OpenOptionsExt; use failure::bail; use itertools::Itertools; @@ -39,7 +43,7 @@ pub fn collect_tests(s: &str) -> Vec<(usize, Test)> { let (start_line, name) = loop { match block.next() { Some((idx, line)) if line.starts_with("test ") => { - break (idx, line["test ".len()..].to_string()) + break (idx, line["test ".len()..].to_string()); } Some(_) => (), None => continue 'outer, @@ -116,3 +120,26 @@ fn install_rustfmt() -> Result<()> { ".", ) } + +pub fn install_format_hook() -> Result<()> { + let path = Path::new("./.git/hooks/pre-commit"); + if !path.exists() { + let mut open_options = OpenOptions::new(); + #[cfg(unix)] + { + // Set as executable + open_options.mode(0o770); + } + let mut file = open_options.write(true).create(true).open(path)?; + write!( + file, + r#"#!/bin/sh + +cargo format +git update-index --add ."# + )?; + } else { + return Err(Error::new(ErrorKind::AlreadyExists, "Git hook already created").into()); + } + Ok(()) +} diff --git a/crates/tools/src/main.rs b/crates/tools/src/main.rs index 36a7c83e2..9e90ac5c2 100644 --- a/crates/tools/src/main.rs +++ b/crates/tools/src/main.rs @@ -7,7 +7,7 @@ use std::{ use clap::{App, Arg, SubCommand}; use failure::bail; -use tools::{collect_tests, generate, run, run_rustfmt, Mode, Overwrite, Result, Test, Verify}; +use tools::{collect_tests, generate, install_format_hook, run, run_rustfmt, Mode, Overwrite, Result, Test, Verify}; const GRAMMAR_DIR: &str = "./crates/ra_syntax/src/grammar"; const INLINE_TESTS_DIR: &str = "./crates/ra_syntax/tests/data/parser/inline"; @@ -25,17 +25,22 @@ fn main() -> Result<()> { .subcommand(SubCommand::with_name("gen-tests")) .subcommand(SubCommand::with_name("install-code")) .subcommand(SubCommand::with_name("format")) + .subcommand(SubCommand::with_name("format-hook")) .get_matches(); let mode = if matches.is_present("verify") { Verify } else { Overwrite }; - match matches.subcommand() { - ("install-code", _) => install_code_extension()?, - ("gen-tests", _) => gen_tests(mode)?, - ("gen-syntax", _) => generate(Overwrite)?, - ("format", _) => run_rustfmt(Overwrite)?, + match matches + .subcommand_name() + .expect("Subcommand must be specified") + { + "install-code" => install_code_extension()?, + "gen-tests" => gen_tests(mode)?, + "gen-syntax" => generate(Overwrite)?, + "format" => run_rustfmt(mode)?, + "format-hook" => install_format_hook()?, _ => unreachable!(), } Ok(()) -- cgit v1.2.3