Running rustfmt on Travis CI

rustfmt just added a small feature that will hopefully have great impact on the way people use it in the future.

rustfmt --write-mode=diff now returns an exit code of 4 if the code is not properly formatted, which will cause Travis and other CI tools to fail the build. That's great for checking if your contributors ran cargo fmt.

This is an example Travis configuration you can use:

language: rust
cache: cargo
before_script: (cargo install rustfmt || true)
- |
  cargo fmt -- --write-mode=diff &&
  cargo build &&
  cargo test

cache: cargo is highly suggested, compiling a fresh rustfmt on every run significantly slows down your CI. Since cargo returns an error if a package is installed already, I have to use (cargo install rustfmt || true). (If anyone wants to add support for a --update flag in cargo, I think they'd be happy to merge it).

You can obviously adjust the cargo fmt command to whatever custom rustfmt configuration you're using. Just remember to append --write-mode=diff. Also note that I'd like to discourage you from configuring your rustfmt. Instead, you could participate in the upcoming process outlined by RFC 1607 to decide on a common Rust style for everyone.

I already converted my liquid and Cobalt projects to automatically check if pull requests adhere to the rustfmt style and it works quite well. The program output even shows you a list of things you need to fix (example).

I hope this is useful to folks!