]> git.lizzy.rs Git - rust.git/blobdiff - src/bootstrap/channel.rs
Rollup merge of #87780 - est31:intra_doc_links, r=jyn514
[rust.git] / src / bootstrap / channel.rs
index 6e65be93fecc8a19365acbb80f1e5483c2e0d78f..6478578c3c402cd3ab6625d8cb60729aa50b7c4a 100644 (file)
 
 use crate::Build;
 
-pub struct GitInfo {
-    inner: Option<Info>,
+pub enum GitInfo {
+    /// This is not a git repository.
+    Absent,
+    /// This is a git repository.
+    /// If the info should be used (`ignore_git` is false), this will be
+    /// `Some`, otherwise it will be `None`.
+    Present(Option<Info>),
 }
 
-struct Info {
+pub struct Info {
     commit_date: String,
     sha: String,
     short_sha: String,
@@ -25,14 +30,20 @@ struct Info {
 impl GitInfo {
     pub fn new(ignore_git: bool, dir: &Path) -> GitInfo {
         // See if this even begins to look like a git dir
-        if ignore_git || !dir.join(".git").exists() {
-            return GitInfo { inner: None };
+        if !dir.join(".git").exists() {
+            return GitInfo::Absent;
         }
 
         // Make sure git commands work
         match Command::new("git").arg("rev-parse").current_dir(dir).output() {
             Ok(ref out) if out.status.success() => {}
-            _ => return GitInfo { inner: None },
+            _ => return GitInfo::Absent,
+        }
+
+        // If we're ignoring the git info, we don't actually need to collect it, just make sure this
+        // was a git repo in the first place.
+        if ignore_git {
+            return GitInfo::Present(None);
         }
 
         // Ok, let's scrape some info
@@ -48,30 +59,35 @@ pub fn new(ignore_git: bool, dir: &Path) -> GitInfo {
         let short_ver_hash = output(
             Command::new("git").current_dir(dir).arg("rev-parse").arg("--short=9").arg("HEAD"),
         );
-        GitInfo {
-            inner: Some(Info {
-                commit_date: ver_date.trim().to_string(),
-                sha: ver_hash.trim().to_string(),
-                short_sha: short_ver_hash.trim().to_string(),
-            }),
+        GitInfo::Present(Some(Info {
+            commit_date: ver_date.trim().to_string(),
+            sha: ver_hash.trim().to_string(),
+            short_sha: short_ver_hash.trim().to_string(),
+        }))
+    }
+
+    fn info(&self) -> Option<&Info> {
+        match self {
+            GitInfo::Present(info) => info.as_ref(),
+            GitInfo::Absent => None,
         }
     }
 
     pub fn sha(&self) -> Option<&str> {
-        self.inner.as_ref().map(|s| &s.sha[..])
+        self.info().map(|s| &s.sha[..])
     }
 
     pub fn sha_short(&self) -> Option<&str> {
-        self.inner.as_ref().map(|s| &s.short_sha[..])
+        self.info().map(|s| &s.short_sha[..])
     }
 
     pub fn commit_date(&self) -> Option<&str> {
-        self.inner.as_ref().map(|s| &s.commit_date[..])
+        self.info().map(|s| &s.commit_date[..])
     }
 
     pub fn version(&self, build: &Build, num: &str) -> String {
         let mut version = build.release(num);
-        if let Some(ref inner) = self.inner {
+        if let Some(ref inner) = self.info() {
             version.push_str(" (");
             version.push_str(&inner.short_sha);
             version.push(' ');
@@ -82,6 +98,9 @@ pub fn version(&self, build: &Build, num: &str) -> String {
     }
 
     pub fn is_git(&self) -> bool {
-        self.inner.is_some()
+        match self {
+            GitInfo::Absent => false,
+            GitInfo::Present(_) => true,
+        }
     }
 }