about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPietro Albini <pietro@pietroalbini.org>2020-10-21 19:29:07 +0200
committerPietro Albini <pietro@pietroalbini.org>2020-10-26 10:47:45 +0100
commit0ee1e91c111e5383ddfa6e0c5adcc1084d12a9d6 (patch)
tree0515082ded415322d05e9e713b88352c0d0df87c
parent9832374f6e378971e1a933362cf9781b121bb845 (diff)
downloadrust-0ee1e91c111e5383ddfa6e0c5adcc1084d12a9d6.tar.gz
rust-0ee1e91c111e5383ddfa6e0c5adcc1084d12a9d6.zip
build-manifest: allow creating a list of files shipped in a release
-rw-r--r--src/tools/build-manifest/src/main.rs32
-rw-r--r--src/tools/build-manifest/src/manifest.rs21
2 files changed, 41 insertions, 12 deletions
diff --git a/src/tools/build-manifest/src/main.rs b/src/tools/build-manifest/src/main.rs
index 1b780110456..ffcf10571ca 100644
--- a/src/tools/build-manifest/src/main.rs
+++ b/src/tools/build-manifest/src/main.rs
@@ -186,6 +186,7 @@ macro_rules! t {
 
 struct Builder {
     versions: Versions,
+    shipped_files: HashSet<String>,
 
     input: PathBuf,
     output: PathBuf,
@@ -239,6 +240,7 @@ fn main() {
 
     Builder {
         versions: Versions::new(&channel, &input).unwrap(),
+        shipped_files: HashSet::new(),
 
         input,
         output,
@@ -259,16 +261,21 @@ impl Builder {
         }
         let manifest = self.build_manifest();
 
-        self.write_channel_files(self.versions.channel(), &manifest);
-        if self.versions.channel() == "stable" {
+        let channel = self.versions.channel().to_string();
+        self.write_channel_files(&channel, &manifest);
+        if channel == "stable" {
             // channel-rust-1.XX.YY.toml
-            let rust_version = self.versions.rustc_version();
-            self.write_channel_files(rust_version, &manifest);
+            let rust_version = self.versions.rustc_version().to_string();
+            self.write_channel_files(&rust_version, &manifest);
 
             // channel-rust-1.XX.toml
             let major_minor = rust_version.split('.').take(2).collect::<Vec<_>>().join(".");
             self.write_channel_files(&major_minor, &manifest);
         }
+
+        if let Some(path) = std::env::var_os("BUILD_MANIFEST_SHIPPED_FILES_PATH") {
+            self.write_shipped_files(&Path::new(&path));
+        }
     }
 
     /// If a tool does not pass its tests, don't ship it.
@@ -623,7 +630,7 @@ impl Builder {
         })
     }
 
-    fn write_channel_files(&self, channel_name: &str, manifest: &Manifest) {
+    fn write_channel_files(&mut 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(
@@ -633,14 +640,25 @@ impl Builder {
         );
     }
 
-    fn write(&self, contents: &str, channel_name: &str, suffix: &str) {
-        let dst = self.output.join(format!("channel-rust-{}{}", channel_name, suffix));
+    fn write(&mut self, contents: &str, channel_name: &str, suffix: &str) {
+        let name = format!("channel-rust-{}{}", channel_name, suffix);
+        self.shipped_files.insert(name.clone());
+
+        let dst = self.output.join(name);
         t!(fs::write(&dst, contents));
         if self.legacy {
             self.hash(&dst);
             self.sign(&dst);
         }
     }
+
+    fn write_shipped_files(&self, path: &Path) {
+        let mut files = self.shipped_files.iter().map(|s| s.as_str()).collect::<Vec<_>>();
+        files.sort();
+        let content = format!("{}\n", files.join("\n"));
+
+        t!(std::fs::write(path, content.as_bytes()));
+    }
 }
 
 fn fetch_hash(path: &Path) -> Result<String, Box<dyn Error>> {
diff --git a/src/tools/build-manifest/src/manifest.rs b/src/tools/build-manifest/src/manifest.rs
index 20e62abb54c..873f709a532 100644
--- a/src/tools/build-manifest/src/manifest.rs
+++ b/src/tools/build-manifest/src/manifest.rs
@@ -37,10 +37,10 @@ pub(crate) struct Target {
 }
 
 impl Target {
-    pub(crate) fn from_compressed_tar(builder: &Builder, base_path: &str) -> Self {
+    pub(crate) fn from_compressed_tar(builder: &mut Builder, base_path: &str) -> Self {
         let base_path = builder.input.join(base_path);
-        let gz = Self::tarball_variant(&base_path, "gz");
-        let xz = Self::tarball_variant(&base_path, "xz");
+        let gz = Self::tarball_variant(builder, &base_path, "gz");
+        let xz = Self::tarball_variant(builder, &base_path, "xz");
 
         if gz.is_none() {
             return Self::unavailable();
@@ -59,10 +59,21 @@ impl Target {
         }
     }
 
-    fn tarball_variant(base: &Path, ext: &str) -> Option<PathBuf> {
+    fn tarball_variant(builder: &mut Builder, base: &Path, ext: &str) -> Option<PathBuf> {
         let mut path = base.to_path_buf();
         path.set_extension(ext);
-        if path.is_file() { Some(path) } else { None }
+        if path.is_file() {
+            builder.shipped_files.insert(
+                path.file_name()
+                    .expect("missing filename")
+                    .to_str()
+                    .expect("non-utf-8 filename")
+                    .to_string(),
+            );
+            Some(path)
+        } else {
+            None
+        }
     }
 
     pub(crate) fn unavailable() -> Self {