Remove rustfmt and cargo-fmt
Moved them to the rustfmt-bin repo
This commit is contained in:
parent
f1281cb440
commit
9d2229f2fd
129
Cargo.lock
generated
129
Cargo.lock
generated
@ -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"
|
||||
|
@ -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" }
|
||||
|
@ -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
|
||||
|
||||
|
@ -1,17 +0,0 @@
|
||||
[package]
|
||||
name = "cargo-fmt"
|
||||
version = "0.4.0"
|
||||
authors = ["Nicholas Cameron <ncameron@mozilla.com>", "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"
|
@ -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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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)",
|
||||
"<package>",
|
||||
);
|
||||
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<ExitStatus, io::Error>, 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<ExitStatus, io::Error> {
|
||||
run_rustfmt(&[], &[String::from("--version")], verbosity)
|
||||
}
|
||||
|
||||
fn format_crate(
|
||||
verbosity: Verbosity,
|
||||
strategy: &CargoFmtStrategy,
|
||||
) -> Result<ExitStatus, io::Error> {
|
||||
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<String> {
|
||||
// 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<H: Hasher>(&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<String>),
|
||||
/// 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<HashSet<Target>, 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<Target>) -> 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<Target>,
|
||||
visited: &mut HashSet<String>,
|
||||
) -> 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<Target>,
|
||||
) -> 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<Target>) {
|
||||
for target in target_paths {
|
||||
targets.insert(Target::from_target(target));
|
||||
}
|
||||
}
|
||||
|
||||
fn run_rustfmt(
|
||||
files: &[PathBuf],
|
||||
fmt_args: &[String],
|
||||
verbosity: Verbosity,
|
||||
) -> Result<ExitStatus, io::Error> {
|
||||
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<cargo_metadata::Metadata, io::Error> {
|
||||
match cargo_metadata::metadata(manifest_path) {
|
||||
Ok(metadata) => Ok(metadata),
|
||||
Err(..) => Err(io::Error::new(
|
||||
io::ErrorKind::Other,
|
||||
"`cargo manifest` failed.",
|
||||
)),
|
||||
}
|
||||
}
|
@ -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" }
|
||||
rustfmt-config = "0.4.0"
|
||||
rustfmt-core = "0.4.0"
|
||||
|
@ -1,20 +0,0 @@
|
||||
[package]
|
||||
name = "rustfmt-bin"
|
||||
version = "0.4.0"
|
||||
authors = ["Nicholas Cameron <ncameron@mozilla.com>", "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" }
|
@ -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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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<String> {
|
||||
Command::new("git")
|
||||
.args(&["rev-parse", "--short", "HEAD"])
|
||||
.output()
|
||||
.ok()
|
||||
.and_then(|r| String::from_utf8(r.stdout).ok())
|
||||
}
|
||||
|
||||
fn commit_date() -> Option<String> {
|
||||
Command::new("git")
|
||||
.args(&["log", "-1", "--date=short", "--pretty=format:%cd"])
|
||||
.output()
|
||||
.ok()
|
||||
.and_then(|r| String::from_utf8(r.stdout).ok())
|
||||
}
|
@ -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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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<error::Error + Send + Sync>;
|
||||
type FmtResult<T> = std::result::Result<T, FmtError>;
|
||||
|
||||
/// Rustfmt operations.
|
||||
enum Operation {
|
||||
/// Format files and their child modules.
|
||||
Format {
|
||||
files: Vec<PathBuf>,
|
||||
config_path: Option<PathBuf>,
|
||||
minimal_config_path: Option<String>,
|
||||
},
|
||||
/// 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<String>,
|
||||
},
|
||||
/// No file specified, read from stdin
|
||||
Stdin {
|
||||
input: String,
|
||||
config_path: Option<PathBuf>,
|
||||
},
|
||||
}
|
||||
|
||||
/// Parsed command line options.
|
||||
#[derive(Clone, Debug, Default)]
|
||||
struct CliOptions {
|
||||
skip_children: bool,
|
||||
verbose: bool,
|
||||
write_mode: Option<WriteMode>,
|
||||
color: Option<Color>,
|
||||
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<CliOptions> {
|
||||
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<PathBuf>,
|
||||
input_file: &Path,
|
||||
) -> FmtResult<(Config, Option<PathBuf>)> {
|
||||
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<Summary> {
|
||||
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] <file>...",
|
||||
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<Operation> {
|
||||
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<Operation> {
|
||||
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<PathBuf> = 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,
|
||||
})
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user