Skip to content

Commit e40a446

Browse files
Support loading version information from xz tarballs
1 parent d0f204e commit e40a446

File tree

3 files changed

+31
-7
lines changed

3 files changed

+31
-7
lines changed

Cargo.lock

+5-4
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ dependencies = [
288288
"sha2",
289289
"tar",
290290
"toml",
291+
"xz2",
291292
]
292293

293294
[[package]]
@@ -1939,9 +1940,9 @@ dependencies = [
19391940

19401941
[[package]]
19411942
name = "lzma-sys"
1942-
version = "0.1.16"
1943+
version = "0.1.20"
19431944
source = "registry+https://github.com/rust-lang/crates.io-index"
1944-
checksum = "f24f76ec44a8ac23a31915d6e326bca17ce88da03096f1ff194925dc714dac99"
1945+
checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27"
19451946
dependencies = [
19461947
"cc",
19471948
"libc",
@@ -5386,9 +5387,9 @@ dependencies = [
53865387

53875388
[[package]]
53885389
name = "xz2"
5389-
version = "0.1.6"
5390+
version = "0.1.7"
53905391
source = "registry+https://github.com/rust-lang/crates.io-index"
5391-
checksum = "c179869f34fc7c01830d3ce7ea2086bc3a07e0d35289b667d0a8bf910258926c"
5392+
checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2"
53925393
dependencies = [
53935394
"lzma-sys",
53945395
]

src/tools/build-manifest/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ serde = { version = "1.0", features = ["derive"] }
99
serde_json = "1.0"
1010
anyhow = "1.0.32"
1111
flate2 = "1.0.16"
12+
xz2 = "0.1.7"
1213
tar = "0.4.29"
1314
sha2 = "0.10.1"
1415
rayon = "1.5.1"

src/tools/build-manifest/src/versions.rs

+25-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::fs::File;
55
use std::io::Read;
66
use std::path::{Path, PathBuf};
77
use tar::Archive;
8+
use xz2::read::XzDecoder;
89

910
const DEFAULT_TARGET: &str = "x86_64-unknown-linux-gnu";
1011

@@ -175,9 +176,23 @@ impl Versions {
175176
}
176177

177178
fn load_version_from_tarball(&mut self, package: &PkgType) -> Result<VersionInfo, Error> {
178-
let tarball_name = self.tarball_name(package, DEFAULT_TARGET)?;
179-
let tarball = self.dist_path.join(tarball_name);
179+
for ext in ["xz", "gz"] {
180+
let info =
181+
self.load_version_from_tarball_inner(&self.dist_path.join(self.archive_name(
182+
package,
183+
DEFAULT_TARGET,
184+
&format!("tar.{}", ext),
185+
)?))?;
186+
if info.present {
187+
return Ok(info);
188+
}
189+
}
190+
191+
// If neither tarball is present, we fallback to returning the non-present info.
192+
Ok(VersionInfo::default())
193+
}
180194

195+
fn load_version_from_tarball_inner(&mut self, tarball: &Path) -> Result<VersionInfo, Error> {
181196
let file = match File::open(&tarball) {
182197
Ok(file) => file,
183198
Err(err) if err.kind() == std::io::ErrorKind::NotFound => {
@@ -187,7 +202,14 @@ impl Versions {
187202
}
188203
Err(err) => return Err(err.into()),
189204
};
190-
let mut tar = Archive::new(GzDecoder::new(file));
205+
let mut tar: Archive<Box<dyn std::io::Read>> =
206+
Archive::new(if tarball.extension().map_or(false, |e| e == "gz") {
207+
Box::new(GzDecoder::new(file))
208+
} else if tarball.extension().map_or(false, |e| e == "xz") {
209+
Box::new(XzDecoder::new(file))
210+
} else {
211+
unimplemented!("tarball extension not recognized: {}", tarball.display())
212+
});
191213

192214
let mut version = None;
193215
let mut git_commit = None;

0 commit comments

Comments
 (0)