about summary refs log tree commit diff
path: root/rustc_tools_util
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2018-09-06 08:19:47 +0200
committerMatthias Krüger <matthias.krueger@famsik.de>2018-09-06 14:45:12 +0200
commitfa11aad92a20aaf64c1ee4f43015fba9b6d24b62 (patch)
treec418a18fa6dedce67e8eeace28097ae4f6f9eb12 /rustc_tools_util
parent3262f9283fd8753873545e2ebeb40dc49f351e18 (diff)
downloadrust-fa11aad92a20aaf64c1ee4f43015fba9b6d24b62.tar.gz
rust-fa11aad92a20aaf64c1ee4f43015fba9b6d24b62.zip
print git commit hash and commit date in version output
clippy 0.0.212 (964fcbe0 2018-09-06)
Diffstat (limited to 'rustc_tools_util')
-rw-r--r--rustc_tools_util/Cargo.toml8
-rw-r--r--rustc_tools_util/src/lib.rs82
2 files changed, 90 insertions, 0 deletions
diff --git a/rustc_tools_util/Cargo.toml b/rustc_tools_util/Cargo.toml
new file mode 100644
index 00000000000..01dca0a65b0
--- /dev/null
+++ b/rustc_tools_util/Cargo.toml
@@ -0,0 +1,8 @@
+cargo-features = ["edition"]
+
+[package]
+name = "rustc_tools_util"
+version = "0.1.0"
+authors = ["Matthias Krüger <matthias.krueger@famsik.de>"]
+edition = "2018"
+[dependencies]
diff --git a/rustc_tools_util/src/lib.rs b/rustc_tools_util/src/lib.rs
new file mode 100644
index 00000000000..20b598346f1
--- /dev/null
+++ b/rustc_tools_util/src/lib.rs
@@ -0,0 +1,82 @@
+#![feature(tool_lints)]
+
+use std::env;
+
+#[macro_export]
+macro_rules! get_version_info {
+    () => {{
+        let major = env!("CARGO_PKG_VERSION_MAJOR").parse::<u8>().unwrap();
+        let minor = env!("CARGO_PKG_VERSION_MINOR").parse::<u8>().unwrap();
+        let patch = env!("CARGO_PKG_VERSION_PATCH").parse::<u16>().unwrap();
+
+        let host_compiler = $crate::get_channel();
+        let commit_hash = option_env!("GIT_HASH").map(|s| s.to_string());
+        let commit_date = option_env!("COMMIT_DATE").map(|s| s.to_string());
+
+        VersionInfo {
+            major,
+            minor,
+            patch,
+            host_compiler,
+            commit_hash,
+            commit_date,
+        }
+    }};
+}
+
+// some code taken and adapted from RLS and cargo
+pub struct VersionInfo {
+    pub major: u8,
+    pub minor: u8,
+    pub patch: u16,
+    pub host_compiler: Option<String>,
+    pub commit_hash: Option<String>,
+    pub commit_date: Option<String>,
+}
+
+impl std::fmt::Display for VersionInfo {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        match self.commit_hash {
+            Some(_) => {
+                write!(
+                    f,
+                    "clippy {}.{}.{} ({} {})",
+                    self.major,
+                    self.minor,
+                    self.patch,
+                    self.commit_hash.clone().unwrap_or_default().trim(),
+                    self.commit_date.clone().unwrap_or_default().trim(),
+                )?;
+            },
+            None => {
+                write!(f, "clippy {}.{}.{}", self.major, self.minor, self.patch)?;
+            },
+        };
+        Ok(())
+    }
+}
+
+pub fn get_channel() -> Option<String> {
+    if let Ok(channel) = env::var("CFG_RELEASE_CHANNEL") {
+        Some(channel)
+    } else {
+        // we could ask ${RUSTC} -Vv and do some parsing and find out
+        Some(String::from("nightly"))
+    }
+}
+
+pub fn get_commit_hash() -> Option<String> {
+    std::process::Command::new("git")
+        .args(&["rev-parse", "--short", "HEAD"])
+        .output()
+        .ok()
+        .and_then(|r| String::from_utf8(r.stdout).ok())
+}
+
+pub fn get_commit_date() -> Option<String> {
+    std::process::Command::new("git")
+        .args(&["log", "-1", "--date=short", "--pretty=format:%cd"])
+        .output()
+        .ok()
+        .and_then(|r| String::from_utf8(r.stdout).ok())
+}