From de038b746e267a4270cf4ac038fbfd92ce788526 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 31 Aug 2017 16:37:14 +0200 Subject: [PATCH] Add full git commit hash to release channel manifests The full hash is necessary to build the download URL for "alternate" compiler builds. This is a first step for https://github.com/rust-lang-nursery/rustup.rs/issues/1099 --- src/bootstrap/dist.rs | 2 ++ src/bootstrap/lib.rs | 5 +++ src/tools/build-manifest/src/main.rs | 53 +++++++++++++++++----------- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/bootstrap/dist.rs b/src/bootstrap/dist.rs index 746f85a9d59d..b7fcfc75c4f2 100644 --- a/src/bootstrap/dist.rs +++ b/src/bootstrap/dist.rs @@ -364,7 +364,9 @@ impl Step for Rustc { cp("README.md"); // tiny morsel of metadata is used by rust-packaging let version = build.rust_version(); + let sha = build.rust_sha().unwrap_or(""); t!(t!(File::create(overlay.join("version"))).write_all(version.as_bytes())); + t!(t!(File::create(overlay.join("git-commit-hash"))).write_all(sha.as_bytes())); // On MinGW we've got a few runtime DLL dependencies that we need to // include. The first argument to this script is where to put these DLLs diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index f21b382619d0..67791e8758c0 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -797,6 +797,11 @@ impl Build { self.rust_info.version(self, channel::CFG_RELEASE_NUM) } + /// Return the full commit hash + fn rust_sha(&self) -> Option<&str> { + self.rust_info.sha() + } + /// Returns the `a.b.c` version that the given package is at. fn release_num(&self, package: &str) -> String { let mut toml = String::new(); diff --git a/src/tools/build-manifest/src/main.rs b/src/tools/build-manifest/src/main.rs index e2be021e7cc3..39b5d275dffa 100644 --- a/src/tools/build-manifest/src/main.rs +++ b/src/tools/build-manifest/src/main.rs @@ -107,6 +107,7 @@ static MINGW: &'static [&'static str] = &[ struct Manifest { manifest_version: String, date: String, + git_commit_hash: String, pkg: BTreeMap, } @@ -205,15 +206,10 @@ impl Builder { self.digest_and_sign(); let manifest = self.build_manifest(); - let filename = format!("channel-rust-{}.toml", self.rust_release); - self.write_manifest(&toml::to_string(&manifest).unwrap(), &filename); - - let filename = format!("channel-rust-{}-date.txt", self.rust_release); - self.write_date_stamp(&manifest.date, &filename); + self.write_channel_files(&self.rust_release, &manifest); if self.rust_release != "beta" && self.rust_release != "nightly" { - self.write_manifest(&toml::to_string(&manifest).unwrap(), "channel-rust-stable.toml"); - self.write_date_stamp(&manifest.date, "channel-rust-stable-date.txt"); + self.write_channel_files("stable", &manifest); } } @@ -230,6 +226,7 @@ impl Builder { let mut manifest = Manifest { manifest_version: "2".to_string(), date: self.date.to_string(), + git_commit_hash: self.git_commit_hash("rust", "x86_64-unknown-linux-gnu"), pkg: BTreeMap::new(), }; @@ -382,14 +379,31 @@ impl Builder { .arg(self.input.join(&filename)) .arg(format!("{}/version", filename.replace(".tar.gz", ""))) .arg("-O"); - let version = t!(cmd.output()); - if !version.status.success() { + let output = t!(cmd.output()); + if !output.status.success() { panic!("failed to learn version:\n\n{:?}\n\n{}\n\n{}", cmd, - String::from_utf8_lossy(&version.stdout), - String::from_utf8_lossy(&version.stderr)); + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr)); } - String::from_utf8_lossy(&version.stdout).trim().to_string() + String::from_utf8_lossy(&output.stdout).trim().to_string() + } + + fn git_commit_hash(&self, component: &str, target: &str) -> String { + let mut cmd = Command::new("tar"); + let filename = self.filename(component, target); + cmd.arg("xf") + .arg(self.input.join(&filename)) + .arg(format!("{}/git-commit-hash", filename.replace(".tar.gz", ""))) + .arg("-O"); + let output = t!(cmd.output()); + if !output.status.success() { + panic!("failed to learn git commit hash:\n\n{:?}\n\n{}\n\n{}", + cmd, + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr)); + } + String::from_utf8_lossy(&output.stdout).trim().to_string() } fn hash(&self, path: &Path) -> String { @@ -425,16 +439,15 @@ impl Builder { assert!(t!(child.wait()).success()); } - fn write_manifest(&self, manifest: &str, name: &str) { - let dst = self.output.join(name); - t!(t!(File::create(&dst)).write_all(manifest.as_bytes())); - self.hash(&dst); - self.sign(&dst); + fn write_channel_files(&self, channel_name: &str, manifest: &Manifest) { + self.write(&toml::to_string(&manifest).unwrap(), channel_name, ".toml"); + self.write(&manifest.date, channel_name, "-date.txt"); + self.write(&manifest.git_commit_hash, channel_name, "-git-commit-hash.txt"); } - fn write_date_stamp(&self, date: &str, name: &str) { - let dst = self.output.join(name); - t!(t!(File::create(&dst)).write_all(date.as_bytes())); + fn write(&self, contents: &str, channel_name: &str, suffix: &str) { + let dst = self.output.join(format!("channel-rust-{}{}", channel_name, suffix)); + t!(t!(File::create(&dst)).write_all(contents.as_bytes())); self.hash(&dst); self.sign(&dst); }