2 use std::io::{self, Write};
4 use crate::checkstyle::output_checkstyle_file;
5 use crate::config::{Config, EmitMode, FileName, Verbosity};
6 use crate::rustfmt_diff::{make_diff, output_modified, print_diff};
9 use crate::formatting::FileRecord;
11 // Append a newline to the end of each file.
12 pub fn append_newline(s: &mut String) {
17 pub(crate) fn write_all_files<T>(
18 source_file: &[FileRecord],
21 ) -> Result<(), io::Error>
25 if config.emit_mode() == EmitMode::Checkstyle {
26 write!(out, "{}", crate::checkstyle::header())?;
28 for &(ref filename, ref text) in source_file {
29 write_file(text, filename, out, config)?;
31 if config.emit_mode() == EmitMode::Checkstyle {
32 write!(out, "{}", crate::checkstyle::footer())?;
43 ) -> Result<bool, io::Error>
47 let filename_to_path = || match *filename {
48 FileName::Real(ref path) => path,
49 _ => panic!("cannot format `{}` and emit to files", filename),
52 match config.emit_mode() {
53 EmitMode::Files if config.make_backup() => {
54 let filename = filename_to_path();
55 let ori = fs::read_to_string(filename)?;
56 if ori != formatted_text {
57 // Do a little dance to make writing safer - write to a temp file
58 // rename the original to a .bk, then rename the temp file to the
60 let tmp_name = filename.with_extension("tmp");
61 let bk_name = filename.with_extension("bk");
63 fs::write(&tmp_name, formatted_text)?;
64 fs::rename(filename, bk_name)?;
65 fs::rename(tmp_name, filename)?;
69 // Write text directly over original file if there is a diff.
70 let filename = filename_to_path();
71 let ori = fs::read_to_string(filename)?;
72 if ori != formatted_text {
73 fs::write(filename, formatted_text)?;
76 EmitMode::Stdout | EmitMode::Coverage => {
77 if config.verbose() != Verbosity::Quiet {
78 println!("{}:\n", filename);
80 write!(out, "{}", formatted_text)?;
82 EmitMode::ModifiedLines => {
83 let filename = filename_to_path();
84 let ori = fs::read_to_string(filename)?;
85 let mismatch = make_diff(&ori, formatted_text, 0);
86 let has_diff = !mismatch.is_empty();
87 output_modified(out, mismatch);
90 EmitMode::Checkstyle => {
91 let filename = filename_to_path();
92 let ori = fs::read_to_string(filename)?;
93 let diff = make_diff(&ori, formatted_text, 3);
94 output_checkstyle_file(out, filename, diff)?;
97 let filename = filename_to_path();
98 let ori = fs::read_to_string(filename)?;
99 let mismatch = make_diff(&ori, formatted_text, 3);
100 let has_diff = !mismatch.is_empty();
103 |line_num| format!("Diff in {} at line {}:", filename.display(), line_num),
110 // when we are not in diff mode, don't indicate differing files