From 9d2229f2fdf59b1cc80aea8851e14db81c55c82f Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Mon, 26 Feb 2018 16:39:36 +1300 Subject: [PATCH] Remove rustfmt and cargo-fmt Moved them to the rustfmt-bin repo --- Cargo.lock | 129 ++--------- Cargo.toml | 6 +- README.md | 4 +- cargo-fmt/Cargo.toml | 17 -- cargo-fmt/src/main.rs | 373 ------------------------------- git-rustfmt/Cargo.toml | 4 +- rustfmt-bin/Cargo.toml | 20 -- rustfmt-bin/build.rs | 59 ----- rustfmt-bin/src/main.rs | 480 ---------------------------------------- 9 files changed, 20 insertions(+), 1072 deletions(-) delete mode 100644 cargo-fmt/Cargo.toml delete mode 100644 cargo-fmt/src/main.rs delete mode 100644 rustfmt-bin/Cargo.toml delete mode 100644 rustfmt-bin/build.rs delete mode 100644 rustfmt-bin/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 4d5d4d05aa0..97e76c68530 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,58 +6,11 @@ dependencies = [ "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "backtrace" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "backtrace-sys" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "bitflags" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "cargo-fmt" -version = "0.4.0" -dependencies = [ - "cargo_metadata 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "cargo_metadata" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "semver 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "cc" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "cfg-if" version = "0.1.2" @@ -88,15 +41,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "error-chain" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -200,20 +145,20 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot_core" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -223,16 +168,6 @@ name = "quote" version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "rand" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "rand" version = "0.4.2" @@ -245,7 +180,7 @@ dependencies = [ [[package]] name = "regex" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -276,8 +211,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-ap-serialize 29.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -326,21 +261,6 @@ dependencies = [ "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rustc-demangle" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "rustfmt-bin" -version = "0.4.0" -dependencies = [ - "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)", - "rustfmt-config 0.4.0", - "rustfmt-core 0.4.0", -] - [[package]] name = "rustfmt-config" version = "0.4.0" @@ -362,7 +282,7 @@ dependencies = [ "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-ap-rustc_errors 29.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-ap-syntax 29.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustfmt-config 0.4.0", @@ -378,26 +298,12 @@ dependencies = [ "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "semver" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "serde" version = "1.0.27" @@ -551,17 +457,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] "checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" -"checksum backtrace 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ebbbf59b1c43eefa8c3ede390fcc36820b4999f7914104015be25025e0d62af2" -"checksum backtrace-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "44585761d6161b0f57afc49482ab6bd067e4edef48c12a152c237eb0203f7661" "checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" -"checksum cargo_metadata 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f410f43295c912ae1328de55e5c050dbef882c17b836f5ed41cc8b96c40d6cc5" -"checksum cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "deaf9ec656256bb25b404c51ef50097207b9cbb29c933d31f92cae5a8a0ffee0" "checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" "checksum derive-new 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "415f627ab054041c3eb748c2e1da0ef751989f5f0c386b63a098e545854a98ba" "checksum diff 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "3c2b69f912779fbb121ceb775d74d51e915af17aaebc38d28a592843a2dd0a3a" "checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab" "checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b" -"checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "b900c08c1939860ce8b54dc6a89e26e00c04c380fd0e09796799bd7f12861e05" @@ -575,12 +476,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" "checksum num-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e7de20f146db9d920c45ee8ed8f71681fd9ade71909b48c3acbd766aa504cf10" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" -"checksum parking_lot 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3e7f7c9857874e54afeb950eebeae662b1e51a2493666d2ea4c0a5d91dcf0412" -"checksum parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "9f35048d735bb93dd115a0030498785971aab3234d311fbe273d020084d26bd8" +"checksum parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd9d732f2de194336fb02fe11f9eed13d9e76f13f4315b4d88a14ca411750cd" +"checksum parking_lot_core 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "538ef00b7317875071d5e00f603f24d16f0b474c1a5fc0ccb8b454ca72eafa79" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" -"checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" -"checksum regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "744554e01ccbd98fff8c457c3b092cd67af62a555a43bfe97ae8a0451f7799fa" +"checksum regex 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "5be5347bde0c48cfd8c3fdc0766cdfe9d8a755ef84d620d6794c778c91de8b2b" "checksum regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e" "checksum rustc-ap-rustc_cratesio_shim 29.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ad5e562044ea78a6764dd75ae8afe4b21fde49f4548024b5fdf6345c21fb524" "checksum rustc-ap-rustc_data_structures 29.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c0d65325492aba7db72899e3edbab34d39af98c42ab7c7e450c9a288ffe4ad" @@ -588,9 +488,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rustc-ap-serialize 29.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e0745fa445ff41c4b6699936cf35ce3ca49502377dd7b3929c829594772c3a7b" "checksum rustc-ap-syntax 29.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82efedabe30f393161e11214a9130edfa01ad476372d1c6f3fec1f8d30488c9d" "checksum rustc-ap-syntax_pos 29.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db9de2e927e280c75b8efab9c5f591ad31082d5d2c4c562c68fdba2ee77286b0" -"checksum rustc-demangle 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aee45432acc62f7b9a108cc054142dac51f979e69e71ddce7d6fc7adf29e817e" -"checksum semver 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bee2bc909ab2d8d60dab26e8cad85b25d795b14603a0dcb627b78b9d30b6454b" -"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "db99f3919e20faa51bb2996057f5031d8685019b5a06139b1ce761da671b8526" "checksum serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "f4ba7591cfe93755e89eeecdbcc668885624829b020050e6aec99c2a03bd3fd0" "checksum serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e03f1c9530c3fb0a0a5c9b826bdd9246a5921ae995d75f512ac917fc4dd55b5" diff --git a/Cargo.toml b/Cargo.toml index 63d3c534221..13d02242f09 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,11 @@ [workspace] members = [ - "cargo-fmt", "git-rustfmt", - "rustfmt-bin", "rustfmt-config", "rustfmt-core", "rustfmt-format-diff", ] + +[patch.crates-io] +rustfmt-config = { path = "rustfmt-config" } +rustfmt-core = { path = "rustfmt-core" } diff --git a/README.md b/README.md index 5e4e1da9204..6fff71760d2 100644 --- a/README.md +++ b/README.md @@ -146,9 +146,7 @@ script: `cargo test` to run all tests. -To run rustfmt after this, use `cargo run --bin rustfmt -- filename`. See the -notes above on running rustfmt. - +To run Rustfmt, you'll need the binaries repo: https://github.com/rust-lang-nursery/rustfmt-bin ## Configuring Rustfmt diff --git a/cargo-fmt/Cargo.toml b/cargo-fmt/Cargo.toml deleted file mode 100644 index 87142657231..00000000000 --- a/cargo-fmt/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "cargo-fmt" -version = "0.4.0" -authors = ["Nicholas Cameron ", "The Rustfmt developers"] -description = "Cargo frontend for rustfmt" -repository = "https://github.com/rust-lang-nursery/rustfmt" -readme = "README.md" -license = "Apache-2.0/MIT" -categories = ["development-tools"] - -[[bin]] -name = "cargo-fmt" - -[dependencies] -cargo_metadata = "0.4" -getopts = "0.2" -serde_json = "1.0" diff --git a/cargo-fmt/src/main.rs b/cargo-fmt/src/main.rs deleted file mode 100644 index 1acad99688a..00000000000 --- a/cargo-fmt/src/main.rs +++ /dev/null @@ -1,373 +0,0 @@ -// Copyright 2015-2016 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// Inspired by Paul Woolcock's cargo-fmt (https://github.com/pwoolcoc/cargo-fmt/) - -#![cfg(not(test))] -#![deny(warnings)] - -extern crate cargo_metadata; -extern crate getopts; -extern crate serde_json as json; - -use std::collections::HashSet; -use std::env; -use std::fs; -use std::hash::{Hash, Hasher}; -use std::io::{self, Write}; -use std::iter::FromIterator; -use std::path::{Path, PathBuf}; -use std::process::{Command, ExitStatus}; -use std::str; - -use getopts::{Matches, Options}; - -fn main() { - let exit_status = execute(); - std::io::stdout().flush().unwrap(); - std::process::exit(exit_status); -} - -const SUCCESS: i32 = 0; -const FAILURE: i32 = 1; - -fn execute() -> i32 { - let mut opts = getopts::Options::new(); - opts.optflag("h", "help", "show this message"); - opts.optflag("q", "quiet", "no output printed to stdout"); - opts.optflag("v", "verbose", "use verbose output"); - opts.optmulti( - "p", - "package", - "specify package to format (only usable in workspaces)", - "", - ); - opts.optflag("", "version", "print rustfmt version and exit"); - opts.optflag("", "all", "format all packages (only usable in workspaces)"); - - // If there is any invalid argument passed to `cargo fmt`, return without formatting. - let mut is_package_arg = false; - for arg in env::args().skip(2).take_while(|a| a != "--") { - if arg.starts_with('-') { - is_package_arg = arg.starts_with("--package"); - } else if !is_package_arg { - print_usage_to_stderr(&opts, &format!("Invalid argument: `{}`.", arg)); - return FAILURE; - } else { - is_package_arg = false; - } - } - - let matches = match opts.parse(env::args().skip(1).take_while(|a| a != "--")) { - Ok(m) => m, - Err(e) => { - print_usage_to_stderr(&opts, &e.to_string()); - return FAILURE; - } - }; - - let verbosity = match (matches.opt_present("v"), matches.opt_present("q")) { - (false, false) => Verbosity::Normal, - (false, true) => Verbosity::Quiet, - (true, false) => Verbosity::Verbose, - (true, true) => { - print_usage_to_stderr(&opts, "quiet mode and verbose mode are not compatible"); - return FAILURE; - } - }; - - if matches.opt_present("h") { - print_usage_to_stdout(&opts, ""); - return SUCCESS; - } - - if matches.opt_present("version") { - return handle_command_status(get_version(verbosity), &opts); - } - - let strategy = CargoFmtStrategy::from_matches(&matches); - handle_command_status(format_crate(verbosity, &strategy), &opts) -} - -macro_rules! print_usage { - ($print: ident, $opts: ident, $reason: expr) => {{ - let msg = format!("{}\nusage: cargo fmt [options]", $reason); - $print!( - "{}\nThis utility formats all bin and lib files of the current crate using rustfmt. \ - Arguments after `--` are passed to rustfmt.", - $opts.usage(&msg) - ); - }}; -} - -fn print_usage_to_stdout(opts: &Options, reason: &str) { - print_usage!(println, opts, reason); -} - -fn print_usage_to_stderr(opts: &Options, reason: &str) { - print_usage!(eprintln, opts, reason); -} - -#[derive(Debug, Clone, Copy, PartialEq)] -pub enum Verbosity { - Verbose, - Normal, - Quiet, -} - -fn handle_command_status(status: Result, opts: &getopts::Options) -> i32 { - match status { - Err(e) => { - print_usage_to_stderr(opts, &e.to_string()); - FAILURE - } - Ok(status) => { - if status.success() { - SUCCESS - } else { - status.code().unwrap_or(FAILURE) - } - } - } -} - -fn get_version(verbosity: Verbosity) -> Result { - run_rustfmt(&[], &[String::from("--version")], verbosity) -} - -fn format_crate( - verbosity: Verbosity, - strategy: &CargoFmtStrategy, -) -> Result { - let rustfmt_args = get_fmt_args(); - let targets = if rustfmt_args.iter().any(|s| s == "--dump-default-config") { - HashSet::new() - } else { - get_targets(strategy)? - }; - - // Currently only bin and lib files get formatted - let files: Vec<_> = targets - .into_iter() - .inspect(|t| { - if verbosity == Verbosity::Verbose { - println!("[{}] {:?}", t.kind, t.path) - } - }) - .map(|t| t.path) - .collect(); - - run_rustfmt(&files, &rustfmt_args, verbosity) -} - -fn get_fmt_args() -> Vec { - // All arguments after -- are passed to rustfmt - env::args().skip_while(|a| a != "--").skip(1).collect() -} - -/// Target uses a `path` field for equality and hashing. -#[derive(Debug)] -pub struct Target { - /// A path to the main source file of the target. - path: PathBuf, - /// A kind of target (e.g. lib, bin, example, ...). - kind: String, -} - -impl Target { - pub fn from_target(target: &cargo_metadata::Target) -> Self { - let path = PathBuf::from(&target.src_path); - let canonicalized = fs::canonicalize(&path).unwrap_or(path); - - Target { - path: canonicalized, - kind: target.kind[0].clone(), - } - } -} - -impl PartialEq for Target { - fn eq(&self, other: &Target) -> bool { - self.path == other.path - } -} - -impl Eq for Target {} - -impl Hash for Target { - fn hash(&self, state: &mut H) { - self.path.hash(state); - } -} - -#[derive(Debug, PartialEq, Eq)] -pub enum CargoFmtStrategy { - /// Format every packages and dependencies. - All, - /// Format pacakges that are specified by the command line argument. - Some(Vec), - /// Format the root packages only. - Root, -} - -impl CargoFmtStrategy { - pub fn from_matches(matches: &Matches) -> CargoFmtStrategy { - match (matches.opt_present("all"), matches.opt_present("p")) { - (false, false) => CargoFmtStrategy::Root, - (true, _) => CargoFmtStrategy::All, - (false, true) => CargoFmtStrategy::Some(matches.opt_strs("p")), - } - } -} - -/// Based on the specified `CargoFmtStrategy`, returns a set of main source files. -fn get_targets(strategy: &CargoFmtStrategy) -> Result, io::Error> { - let mut targets = HashSet::new(); - - match *strategy { - CargoFmtStrategy::Root => get_targets_root_only(&mut targets)?, - CargoFmtStrategy::All => get_targets_recursive(None, &mut targets, &mut HashSet::new())?, - CargoFmtStrategy::Some(ref hitlist) => get_targets_with_hitlist(hitlist, &mut targets)?, - } - - if targets.is_empty() { - Err(io::Error::new( - io::ErrorKind::Other, - "Failed to find targets".to_owned(), - )) - } else { - Ok(targets) - } -} - -fn get_targets_root_only(targets: &mut HashSet) -> Result<(), io::Error> { - let metadata = get_cargo_metadata(None)?; - - for package in metadata.packages { - for target in package.targets { - targets.insert(Target::from_target(&target)); - } - } - - Ok(()) -} - -fn get_targets_recursive( - manifest_path: Option<&Path>, - mut targets: &mut HashSet, - visited: &mut HashSet, -) -> Result<(), io::Error> { - let metadata = get_cargo_metadata(manifest_path)?; - - for package in metadata.packages { - add_targets(&package.targets, &mut targets); - - // Look for local dependencies. - for dependency in package.dependencies { - if dependency.source.is_some() || visited.contains(&dependency.name) { - continue; - } - - let mut manifest_path = PathBuf::from(&package.manifest_path); - - manifest_path.pop(); - manifest_path.push(&dependency.name); - manifest_path.push("Cargo.toml"); - - if manifest_path.exists() { - visited.insert(dependency.name); - get_targets_recursive(Some(&manifest_path), &mut targets, visited)?; - } - } - } - - Ok(()) -} - -fn get_targets_with_hitlist( - hitlist: &[String], - targets: &mut HashSet, -) -> Result<(), io::Error> { - let metadata = get_cargo_metadata(None)?; - - let mut workspace_hitlist: HashSet<&String> = HashSet::from_iter(hitlist); - - for package in metadata.packages { - if workspace_hitlist.remove(&package.name) { - for target in package.targets { - targets.insert(Target::from_target(&target)); - } - } - } - - if workspace_hitlist.is_empty() { - Ok(()) - } else { - let package = workspace_hitlist.iter().next().unwrap(); - Err(io::Error::new( - io::ErrorKind::InvalidInput, - format!("package `{}` is not a member of the workspace", package), - )) - } -} - -fn add_targets(target_paths: &[cargo_metadata::Target], targets: &mut HashSet) { - for target in target_paths { - targets.insert(Target::from_target(target)); - } -} - -fn run_rustfmt( - files: &[PathBuf], - fmt_args: &[String], - verbosity: Verbosity, -) -> Result { - let stdout = if verbosity == Verbosity::Quiet { - std::process::Stdio::null() - } else { - std::process::Stdio::inherit() - }; - - if verbosity == Verbosity::Verbose { - print!("rustfmt"); - for a in fmt_args { - print!(" {}", a); - } - for f in files { - print!(" {}", f.display()); - } - println!(); - } - - let mut command = Command::new("rustfmt") - .stdout(stdout) - .args(files) - .args(fmt_args) - .spawn() - .map_err(|e| match e.kind() { - io::ErrorKind::NotFound => io::Error::new( - io::ErrorKind::Other, - "Could not run rustfmt, please make sure it is in your PATH.", - ), - _ => e, - })?; - - command.wait() -} - -fn get_cargo_metadata(manifest_path: Option<&Path>) -> Result { - match cargo_metadata::metadata(manifest_path) { - Ok(metadata) => Ok(metadata), - Err(..) => Err(io::Error::new( - io::ErrorKind::Other, - "`cargo manifest` failed.", - )), - } -} diff --git a/git-rustfmt/Cargo.toml b/git-rustfmt/Cargo.toml index 1fcd1ccc613..030d09fc94b 100644 --- a/git-rustfmt/Cargo.toml +++ b/git-rustfmt/Cargo.toml @@ -15,5 +15,5 @@ name = "git-rustfmt" env_logger = "0.4" getopts = "0.2" log = "0.3" -rustfmt-config = { path = "../rustfmt-config" } -rustfmt-core = { path = "../rustfmt-core" } \ No newline at end of file +rustfmt-config = "0.4.0" +rustfmt-core = "0.4.0" diff --git a/rustfmt-bin/Cargo.toml b/rustfmt-bin/Cargo.toml deleted file mode 100644 index c07146dcb01..00000000000 --- a/rustfmt-bin/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "rustfmt-bin" -version = "0.4.0" -authors = ["Nicholas Cameron ", "The Rustfmt developers"] -description = "Tool to find and fix Rust formatting issues" -repository = "https://github.com/rust-lang-nursery/rustfmt" -readme = "README.md" -license = "Apache-2.0/MIT" -build = "build.rs" -categories = ["development-tools"] - -[[bin]] -name = "rustfmt" -path = "src/main.rs" - -[dependencies] -env_logger = "0.4" -getopts = "0.2" -rustfmt-config = { path = "../rustfmt-config" } -rustfmt-core = { path = "../rustfmt-core" } \ No newline at end of file diff --git a/rustfmt-bin/build.rs b/rustfmt-bin/build.rs deleted file mode 100644 index d72b44eb7f3..00000000000 --- a/rustfmt-bin/build.rs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2017 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use std::env; -use std::fs::File; -use std::io::Write; -use std::path::PathBuf; -use std::process::Command; - -fn main() { - let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap()); - - File::create(out_dir.join("commit-info.txt")) - .unwrap() - .write_all(commit_info().as_bytes()) - .unwrap(); -} - -// Try to get hash and date of the last commit on a best effort basis. If anything goes wrong -// (git not installed or if this is not a git repository) just return an empty string. -fn commit_info() -> String { - match (channel(), commit_hash(), commit_date()) { - (channel, Some(hash), Some(date)) => { - format!("{} ({} {})", channel, hash.trim_right(), date) - } - _ => String::new(), - } -} - -fn channel() -> String { - if let Ok(channel) = env::var("CFG_RELEASE_CHANNEL") { - channel - } else { - "nightly".to_owned() - } -} - -fn commit_hash() -> Option { - Command::new("git") - .args(&["rev-parse", "--short", "HEAD"]) - .output() - .ok() - .and_then(|r| String::from_utf8(r.stdout).ok()) -} - -fn commit_date() -> Option { - Command::new("git") - .args(&["log", "-1", "--date=short", "--pretty=format:%cd"]) - .output() - .ok() - .and_then(|r| String::from_utf8(r.stdout).ok()) -} diff --git a/rustfmt-bin/src/main.rs b/rustfmt-bin/src/main.rs deleted file mode 100644 index a058887a696..00000000000 --- a/rustfmt-bin/src/main.rs +++ /dev/null @@ -1,480 +0,0 @@ -// Copyright 2015 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -#![cfg(not(test))] - -extern crate env_logger; -extern crate getopts; -extern crate rustfmt_config as config; -extern crate rustfmt_core as rustfmt; - -use std::{env, error}; -use std::fs::File; -use std::io::{self, Read, Write}; -use std::path::{Path, PathBuf}; - -use getopts::{Matches, Options}; - -use config::{get_toml_path, Color, Config, WriteMode}; -use config::file_lines::FileLines; -use rustfmt::{run, FileName, Input, Summary}; - -use std::str::FromStr; - -type FmtError = Box; -type FmtResult = std::result::Result; - -/// Rustfmt operations. -enum Operation { - /// Format files and their child modules. - Format { - files: Vec, - config_path: Option, - minimal_config_path: Option, - }, - /// Print the help message. - Help, - // Print version information - Version, - /// Print detailed configuration help. - ConfigHelp, - /// Output default config to a file, or stdout if None - ConfigOutputDefault { - path: Option, - }, - /// No file specified, read from stdin - Stdin { - input: String, - config_path: Option, - }, -} - -/// Parsed command line options. -#[derive(Clone, Debug, Default)] -struct CliOptions { - skip_children: bool, - verbose: bool, - write_mode: Option, - color: Option, - file_lines: FileLines, // Default is all lines in all files. - unstable_features: bool, - error_on_unformatted: bool, -} - -impl CliOptions { - fn from_matches(matches: &Matches) -> FmtResult { - let mut options = CliOptions::default(); - options.skip_children = matches.opt_present("skip-children"); - options.verbose = matches.opt_present("verbose"); - let unstable_features = matches.opt_present("unstable-features"); - let rust_nightly = option_env!("CFG_RELEASE_CHANNEL") - .map(|c| c == "nightly") - .unwrap_or(false); - if unstable_features && !rust_nightly { - return Err(FmtError::from( - "Unstable features are only available on Nightly channel", - )); - } else { - options.unstable_features = unstable_features; - } - - if let Some(ref write_mode) = matches.opt_str("write-mode") { - if let Ok(write_mode) = WriteMode::from_str(write_mode) { - options.write_mode = Some(write_mode); - } else { - return Err(FmtError::from(format!( - "Invalid write-mode: {}", - write_mode - ))); - } - } - - if let Some(ref color) = matches.opt_str("color") { - match Color::from_str(color) { - Ok(color) => options.color = Some(color), - _ => return Err(FmtError::from(format!("Invalid color: {}", color))), - } - } - - if let Some(ref file_lines) = matches.opt_str("file-lines") { - options.file_lines = file_lines.parse()?; - } - - if matches.opt_present("error-on-unformatted") { - options.error_on_unformatted = true; - } - - Ok(options) - } - - fn apply_to(self, config: &mut Config) { - config.set().skip_children(self.skip_children); - config.set().verbose(self.verbose); - config.set().file_lines(self.file_lines); - config.set().unstable_features(self.unstable_features); - config.set().error_on_unformatted(self.error_on_unformatted); - if let Some(write_mode) = self.write_mode { - config.set().write_mode(write_mode); - } - if let Some(color) = self.color { - config.set().color(color); - } - } -} - -/// read the given config file path recursively if present else read the project file path -fn match_cli_path_or_file( - config_path: Option, - input_file: &Path, -) -> FmtResult<(Config, Option)> { - if let Some(config_file) = config_path { - let toml = Config::from_toml_path(config_file.as_ref())?; - return Ok((toml, Some(config_file))); - } - Config::from_resolved_toml_path(input_file).map_err(FmtError::from) -} - -fn make_opts() -> Options { - let mut opts = Options::new(); - - // Sorted in alphabetical order. - opts.optopt( - "", - "color", - "Use colored output (if supported)", - "[always|never|auto]", - ); - opts.optflag( - "", - "config-help", - "Show details of rustfmt configuration options", - ); - opts.optopt( - "", - "config-path", - "Recursively searches the given path for the rustfmt.toml config file. If not \ - found reverts to the input file path", - "[Path for the configuration file]", - ); - opts.optopt( - "", - "dump-default-config", - "Dumps default configuration to PATH. PATH defaults to stdout, if omitted.", - "PATH", - ); - opts.optopt( - "", - "dump-minimal-config", - "Dumps configuration options that were checked during formatting to a file.", - "PATH", - ); - opts.optflag( - "", - "error-on-unformatted", - "Error if unable to get comments or string literals within max_width, \ - or they are left with trailing whitespaces", - ); - opts.optopt( - "", - "file-lines", - "Format specified line ranges. See README for more detail on the JSON format.", - "JSON", - ); - opts.optflag("h", "help", "Show this message"); - opts.optflag("", "skip-children", "Don't reformat child modules"); - opts.optflag( - "", - "unstable-features", - "Enables unstable features. Only available on nightly channel", - ); - opts.optflag("v", "verbose", "Print verbose output"); - opts.optflag("V", "version", "Show version information"); - opts.optopt( - "", - "write-mode", - "How to write output (not usable when piping from stdin)", - "[replace|overwrite|display|plain|diff|coverage|checkstyle]", - ); - - opts -} - -fn execute(opts: &Options) -> FmtResult { - let matches = opts.parse(env::args().skip(1))?; - - match determine_operation(&matches)? { - Operation::Help => { - print_usage_to_stdout(opts, ""); - Summary::print_exit_codes(); - Ok(Summary::default()) - } - Operation::Version => { - print_version(); - Ok(Summary::default()) - } - Operation::ConfigHelp => { - Config::print_docs(); - Ok(Summary::default()) - } - Operation::ConfigOutputDefault { path } => { - let toml = Config::default().all_options().to_toml()?; - if let Some(path) = path { - let mut file = File::create(path)?; - file.write_all(toml.as_bytes())?; - } else { - io::stdout().write_all(toml.as_bytes())?; - } - Ok(Summary::default()) - } - Operation::Stdin { input, config_path } => { - // try to read config from local directory - let (mut config, _) = - match_cli_path_or_file(config_path, &env::current_dir().unwrap())?; - - // write_mode is always Plain for Stdin. - config.set().write_mode(WriteMode::Plain); - - // parse file_lines - if let Some(ref file_lines) = matches.opt_str("file-lines") { - config.set().file_lines(file_lines.parse()?); - for f in config.file_lines().files() { - match *f { - FileName::Custom(ref f) if f == "stdin" => {} - _ => eprintln!("Warning: Extra file listed in file_lines option '{}'", f), - } - } - } - - let mut error_summary = Summary::default(); - if config.version_meets_requirement(&mut error_summary) { - error_summary.add(run(Input::Text(input), &config)); - } - - Ok(error_summary) - } - Operation::Format { - files, - config_path, - minimal_config_path, - } => { - let options = CliOptions::from_matches(&matches)?; - - for f in options.file_lines.files() { - match *f { - FileName::Real(ref f) if files.contains(f) => {} - FileName::Real(_) => { - eprintln!("Warning: Extra file listed in file_lines option '{}'", f) - } - _ => eprintln!("Warning: Not a file '{}'", f), - } - } - - let mut config = Config::default(); - // Load the config path file if provided - if let Some(config_file) = config_path.as_ref() { - config = Config::from_toml_path(config_file.as_ref())?; - }; - - if options.verbose { - if let Some(path) = config_path.as_ref() { - println!("Using rustfmt config file {}", path.display()); - } - } - - let mut error_summary = Summary::default(); - for file in files { - if !file.exists() { - eprintln!("Error: file `{}` does not exist", file.to_str().unwrap()); - error_summary.add_operational_error(); - } else if file.is_dir() { - eprintln!("Error: `{}` is a directory", file.to_str().unwrap()); - error_summary.add_operational_error(); - } else { - // Check the file directory if the config-path could not be read or not provided - if config_path.is_none() { - let (config_tmp, path_tmp) = - Config::from_resolved_toml_path(file.parent().unwrap())?; - if options.verbose { - if let Some(path) = path_tmp.as_ref() { - println!( - "Using rustfmt config file {} for {}", - path.display(), - file.display() - ); - } - } - config = config_tmp; - } - - if !config.version_meets_requirement(&mut error_summary) { - break; - } - - options.clone().apply_to(&mut config); - error_summary.add(run(Input::File(file), &config)); - } - } - - // If we were given a path via dump-minimal-config, output any options - // that were used during formatting as TOML. - if let Some(path) = minimal_config_path { - let mut file = File::create(path)?; - let toml = config.used_options().to_toml()?; - file.write_all(toml.as_bytes())?; - } - - Ok(error_summary) - } - } -} - -fn main() { - let _ = env_logger::init(); - - let opts = make_opts(); - - let exit_code = match execute(&opts) { - Ok(summary) => { - if summary.has_operational_errors() { - 1 - } else if summary.has_parsing_errors() { - 2 - } else if summary.has_formatting_errors() { - 3 - } else if summary.has_diff { - // should only happen in diff mode - 4 - } else { - assert!(summary.has_no_errors()); - 0 - } - } - Err(e) => { - eprintln!("{}", e.to_string()); - 1 - } - }; - // Make sure standard output is flushed before we exit. - std::io::stdout().flush().unwrap(); - - // Exit with given exit code. - // - // NOTE: This immediately terminates the process without doing any cleanup, - // so make sure to finish all necessary cleanup before this is called. - std::process::exit(exit_code); -} - -fn print_usage_to_stdout(opts: &Options, reason: &str) { - let sep = if reason.is_empty() { - String::new() - } else { - format!("{}\n\n", reason) - }; - let msg = format!( - "{}Format Rust code\n\nusage: {} [options] ...", - sep, - env::args_os().next().unwrap().to_string_lossy() - ); - println!("{}", opts.usage(&msg)); -} - -fn print_version() { - let version_info = format!( - "{}{}{}", - option_env!("CARGO_PKG_VERSION").unwrap_or("unknown"), - "-", - include_str!(concat!(env!("OUT_DIR"), "/commit-info.txt")) - ); - - println!("rustfmt {}", version_info); -} - -fn determine_operation(matches: &Matches) -> FmtResult { - if matches.opt_present("h") { - return Ok(Operation::Help); - } - - if matches.opt_present("config-help") { - return Ok(Operation::ConfigHelp); - } - - if matches.opt_present("dump-default-config") { - // NOTE for some reason when configured with HasArg::Maybe + Occur::Optional opt_default - // doesn't recognize `--foo bar` as a long flag with an argument but as a long flag with no - // argument *plus* a free argument. Thus we check for that case in this branch -- this is - // required for backward compatibility. - if let Some(path) = matches.free.get(0) { - return Ok(Operation::ConfigOutputDefault { - path: Some(path.clone()), - }); - } else { - return Ok(Operation::ConfigOutputDefault { - path: matches.opt_str("dump-default-config"), - }); - } - } - - if matches.opt_present("version") { - return Ok(Operation::Version); - } - - let config_path_not_found = |path: &str| -> FmtResult { - Err(FmtError::from(format!( - "Error: unable to find a config file for the given path: `{}`", - path - ))) - }; - - // Read the config_path and convert to parent dir if a file is provided. - // If a config file cannot be found from the given path, return error. - let config_path: Option = match matches.opt_str("config-path").map(PathBuf::from) { - Some(ref path) if !path.exists() => return config_path_not_found(path.to_str().unwrap()), - Some(ref path) if path.is_dir() => { - let config_file_path = get_toml_path(path)?; - if config_file_path.is_some() { - config_file_path - } else { - return config_path_not_found(path.to_str().unwrap()); - } - } - path => path, - }; - - // If no path is given, we won't output a minimal config. - let minimal_config_path = matches.opt_str("dump-minimal-config"); - - // if no file argument is supplied, read from stdin - if matches.free.is_empty() { - let mut buffer = String::new(); - io::stdin().read_to_string(&mut buffer)?; - - return Ok(Operation::Stdin { - input: buffer, - config_path, - }); - } - - let files: Vec<_> = matches - .free - .iter() - .map(|s| { - let p = PathBuf::from(s); - // we will do comparison later, so here tries to canonicalize first - // to get the expected behavior. - p.canonicalize().unwrap_or(p) - }) - .collect(); - - Ok(Operation::Format { - files, - config_path, - minimal_config_path, - }) -}