Implement compression
Summary: Compresses artifacts with LZMA by default. `--no-compression` can be used to skip the quite time-intensive task to just quickly check if the archives still add up to a full distribution. Reviewed By: jknoxville Differential Revision: D21456052 fbshipit-source-id: dfa4686f3fe7ce342b62dab4b5203bc0aad37d9a
This commit is contained in:
committed by
Facebook GitHub Bot
parent
5fe3e9a44a
commit
6355076c90
33
packer/Cargo.lock
generated
33
packer/Cargo.lock
generated
@@ -100,6 +100,12 @@ version = "1.3.4"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
|
checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cc"
|
||||||
|
version = "1.0.52"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c3d87b23d6a92cd03af510a5ade527033f6aa6fa92161e2d5863a907d4c5e31d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cfg-if"
|
name = "cfg-if"
|
||||||
version = "0.1.10"
|
version = "0.1.10"
|
||||||
@@ -280,6 +286,7 @@ dependencies = [
|
|||||||
"shellexpand",
|
"shellexpand",
|
||||||
"tar",
|
"tar",
|
||||||
"tempdir",
|
"tempdir",
|
||||||
|
"xz2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -353,6 +360,17 @@ version = "0.5.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83"
|
checksum = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lzma-sys"
|
||||||
|
version = "0.1.15"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "53e48818fd597d46155132bbbb9505d6d1b3d360b4ee25cfa91c406f8a90fe91"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
"libc",
|
||||||
|
"pkg-config",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "maybe-uninit"
|
name = "maybe-uninit"
|
||||||
version = "2.0.0"
|
version = "2.0.0"
|
||||||
@@ -390,6 +408,12 @@ version = "0.2.3"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
|
checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pkg-config"
|
||||||
|
version = "0.3.17"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.10"
|
version = "1.0.10"
|
||||||
@@ -735,6 +759,15 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "xz2"
|
||||||
|
version = "0.1.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c179869f34fc7c01830d3ce7ea2086bc3a07e0d35289b667d0a8bf910258926c"
|
||||||
|
dependencies = [
|
||||||
|
"lzma-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "yaml-rust"
|
name = "yaml-rust"
|
||||||
version = "0.4.3"
|
version = "0.4.3"
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ data-encoding = "^2.2.0"
|
|||||||
serde_json = "^1.0.52"
|
serde_json = "^1.0.52"
|
||||||
rayon = "^1.3.0"
|
rayon = "^1.3.0"
|
||||||
indicatif = "^0.14.0"
|
indicatif = "^0.14.0"
|
||||||
|
xz2 = "^0.1.6"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tempdir = "^0.3.7"
|
tempdir = "^0.3.7"
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ use clap::value_t_or_exit;
|
|||||||
use rayon::prelude::{IntoParallelIterator, ParallelIterator};
|
use rayon::prelude::{IntoParallelIterator, ParallelIterator};
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::{BufReader, Read, Write};
|
use std::io::{BufReader, BufWriter, Read, Write};
|
||||||
use std::path;
|
use std::path;
|
||||||
use types::{PackType, Platform};
|
use types::{PackType, Platform};
|
||||||
|
|
||||||
@@ -146,6 +146,9 @@ fn main() -> Result<(), anyhow::Error> {
|
|||||||
.arg(clap::Arg::from_usage(
|
.arg(clap::Arg::from_usage(
|
||||||
"-p, --packlist=packlist.yaml 'Custom list of files to pack.'",
|
"-p, --packlist=packlist.yaml 'Custom list of files to pack.'",
|
||||||
))
|
))
|
||||||
|
.arg(clap::Arg::from_usage(
|
||||||
|
"--no-compression 'Skip compressing the archives (for debugging)'",
|
||||||
|
))
|
||||||
.arg(
|
.arg(
|
||||||
clap::Arg::from_usage("[PLATFORM] 'Platform to build for'")
|
clap::Arg::from_usage("[PLATFORM] 'Platform to build for'")
|
||||||
.case_insensitive(true)
|
.case_insensitive(true)
|
||||||
@@ -158,6 +161,7 @@ fn main() -> Result<(), anyhow::Error> {
|
|||||||
let dist_dir = path::PathBuf::from(
|
let dist_dir = path::PathBuf::from(
|
||||||
shellexpand::tilde(args.value_of("dist").expect("argument has default")).to_string(),
|
shellexpand::tilde(args.value_of("dist").expect("argument has default")).to_string(),
|
||||||
);
|
);
|
||||||
|
let compress = !args.is_present("no-compression");
|
||||||
let pack_list_str = args
|
let pack_list_str = args
|
||||||
.value_of("packlist")
|
.value_of("packlist")
|
||||||
.map(|f| std::fs::read_to_string(f).expect(&format!("Failed to open packfile {}.", f)))
|
.map(|f| std::fs::read_to_string(f).expect(&format!("Failed to open packfile {}.", f)))
|
||||||
@@ -173,11 +177,55 @@ fn main() -> Result<(), anyhow::Error> {
|
|||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
let archive_paths = pack(&platform, &dist_dir, &pack_list, output_directory)?;
|
let archive_paths = pack(&platform, &dist_dir, &pack_list, output_directory)?;
|
||||||
manifest(&archive_paths, &output_directory)?;
|
let compressed_archive_paths = if compress {
|
||||||
|
compress_paths(&archive_paths)?
|
||||||
|
} else {
|
||||||
|
archive_paths
|
||||||
|
};
|
||||||
|
manifest(&compressed_archive_paths, &output_directory)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Takes a list of archive paths, compresses them with LZMA and returns
|
||||||
|
/// the updated paths.
|
||||||
|
/// TODO: Remove compressed artifacts.
|
||||||
|
fn compress_paths(
|
||||||
|
archive_paths: &[(PackType, path::PathBuf)],
|
||||||
|
) -> Result<Vec<(PackType, path::PathBuf)>> {
|
||||||
|
let pb = default_progress_bar(archive_paths.len() as u64 - 1);
|
||||||
|
pb.set_prefix(&format!(
|
||||||
|
"{:width$}",
|
||||||
|
"Compressing archives",
|
||||||
|
width = PROGRESS_PREFIX_LEN
|
||||||
|
));
|
||||||
|
let res = archive_paths
|
||||||
|
.into_par_iter()
|
||||||
|
.map(|(pack_type, path)| {
|
||||||
|
let input_file = File::open(&path).with_context(|| {
|
||||||
|
format!("Failed to open archive '{}'.", &path.to_string_lossy())
|
||||||
|
})?;
|
||||||
|
let mut reader = BufReader::new(input_file);
|
||||||
|
let mut output_path = path::PathBuf::from(path);
|
||||||
|
output_path.set_extension("tar.xz");
|
||||||
|
let output_file: File = File::create(&output_path).with_context(|| {
|
||||||
|
format!(
|
||||||
|
"Failed opening compressed archive '{}' for writing.",
|
||||||
|
&output_path.to_string_lossy()
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
let writer = BufWriter::new(output_file);
|
||||||
|
let mut encoder = xz2::write::XzEncoder::new(writer, 9);
|
||||||
|
std::io::copy(&mut reader, &mut encoder)?;
|
||||||
|
pb.inc(1);
|
||||||
|
Ok((*pack_type, output_path))
|
||||||
|
})
|
||||||
|
.collect::<Result<Vec<(PackType, path::PathBuf)>>>()?;
|
||||||
|
pb.finish();
|
||||||
|
|
||||||
|
Ok(res)
|
||||||
|
}
|
||||||
|
|
||||||
fn manifest(
|
fn manifest(
|
||||||
archive_paths: &[(PackType, path::PathBuf)],
|
archive_paths: &[(PackType, path::PathBuf)],
|
||||||
output_directory: &path::PathBuf,
|
output_directory: &path::PathBuf,
|
||||||
|
|||||||
Reference in New Issue
Block a user