| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- /// The version string isn’t the simplest: we want to show the version,
- /// current Git hash, and compilation date when building *debug* versions, but
- /// just the version for *release* versions so the builds are reproducible.
- ///
- /// This script generates the string from the environment variables that Cargo
- /// adds (http://doc.crates.io/environment-variables.html) and runs `git` to
- /// get the SHA1 hash. It then writes the string into a file, which exa then
- /// includes at build-time.
- ///
- /// - https://stackoverflow.com/q/43753491/3484614
- /// - https://crates.io/crates/vergen
- extern crate datetime;
- use std::io::Result as IOResult;
- use std::env;
- fn git_hash() -> String {
- use std::process::Command;
- String::from_utf8_lossy(
- &Command::new("git")
- .args(&["rev-parse", "--short", "HEAD"])
- .output().unwrap()
- .stdout).trim().to_string()
- }
- fn main() {
- write_statics().unwrap();
- }
- fn is_development_version() -> bool {
- // Both weekly releases and actual releases are --release releases,
- // but actual releases will have a proper version number
- cargo_version().ends_with("-pre") || env::var("PROFILE").unwrap() == "debug"
- }
- fn cargo_version() -> String {
- env::var("CARGO_PKG_VERSION").unwrap()
- }
- fn build_date() -> String {
- use datetime::{LocalDateTime, ISO};
- let now = LocalDateTime::now();
- format!("{}", now.date().iso())
- }
- fn write_statics() -> IOResult<()> {
- use std::fs::File;
- use std::io::Write;
- use std::path::PathBuf;
- let ver = match is_development_version() {
- true => format!("exa v{} ({} built on {})", cargo_version(), git_hash(), build_date()),
- false => format!("exa v{}", cargo_version()),
- };
- let out = PathBuf::from(env::var("OUT_DIR").unwrap());
- let mut f = File::create(&out.join("version_string.txt"))?;
- write!(f, "{:?}", ver)
- }
|