From ca55e68c898c16fb9fe6706abc0fc1c40d92e2a5 Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Tue, 23 Mar 2021 13:26:31 -0700 Subject: [PATCH] Set up infra for different packing mode Summary: Electron 12 broke packing again because one file was renamed. I'm now setting up a separate mode for using globs and ignores to create artifact bundles. This will work like a reverse gitignore file. However, to keep the logic simple, I'll keep the old mode for MacOS where the folder structure lends itself to comprehensive, exact lists. **This doesn't actually change anything just yet apart from the "packfile" format. The next diff will add the new packing mode. Feedback is always welcome but there's no need for super close scrutiny.** Reviewed By: mweststrate Differential Revision: D27191506 fbshipit-source-id: 663cef8b93eef6c2dbb56ef66de51ea9551412dd --- packer/src/main.rs | 34 +++++++++----- packer/src/packlist.yaml | 96 +++++++++++++++++++++------------------- packer/src/types.rs | 20 +++++++++ 3 files changed, 93 insertions(+), 57 deletions(-) diff --git a/packer/src/main.rs b/packer/src/main.rs index 3d036bc34..7e971bc59 100644 --- a/packer/src/main.rs +++ b/packer/src/main.rs @@ -20,7 +20,7 @@ use std::collections::BTreeMap; use std::fs::File; use std::io::{self, BufReader, BufWriter, Write}; use std::path; -use types::{HashSum, PackType, Platform}; +use types::{HashSum, PackMode, PackType, Platform}; const DEFAULT_PACKLIST: &str = include_str!("packlist.yaml"); // This is to ensure that all progress bar prefixes are aligned. @@ -29,7 +29,13 @@ const PROGRESS_PREFIX_LEN: usize = 24; type PackListPlatform = BTreeMap>; #[derive(Debug, serde::Deserialize)] -struct PackList(pub BTreeMap); +struct PackListSpec { + mode: PackMode, + files: PackListPlatform, +} + +#[derive(Debug, serde::Deserialize)] +struct PackList(pub BTreeMap); #[derive(Debug, serde::Serialize)] struct PackFile { @@ -61,16 +67,18 @@ fn pack( output_directory: &std::path::Path, ) -> Result> { let pb = default_progress_bar(pack_list.0.len() as u64 * 2 - 1); + let base_dir = platform_base_dir(dist_dir, platform); pb.set_prefix(&format!( "{:width$}", "Packing archives", width = PROGRESS_PREFIX_LEN )); - let packtype_paths = pack_list + let packlist_spec = pack_list .0 .get(&platform) .ok_or(error::Error::MissingPlatformDefinition(platform))?; - let res = packtype_paths + let files = &packlist_spec.files; + let res = files .into_par_iter() .map(|(&pack_type, pack_files)| { let output_path = path::Path::new(output_directory).join(format!("{}.tar", pack_type)); @@ -83,7 +91,7 @@ fn pack( // MacOS uses symlinks for bundling multiple framework versions and pointing // to the "Current" one. tar.follow_symlinks(false); - pack_platform(platform, dist_dir, pack_files, pack_type, &mut tar)?; + pack_platform(platform, &base_dir, pack_files, pack_type, &mut tar)?; pb.inc(1); tar.finish()?; pb.inc(1); @@ -96,19 +104,21 @@ fn pack( res } +fn platform_base_dir(dist_dir: &path::Path, platform: Platform) -> path::PathBuf { + match platform { + Platform::Mac => path::Path::new(dist_dir).join("mac"), + Platform::Linux => path::Path::new(dist_dir).join("linux-unpacked"), + Platform::Windows => path::Path::new(dist_dir).join("win-unpacked"), + } +} + fn pack_platform>( platform: Platform, - dist_dir: &std::path::Path, + base_dir: &path::Path, pack_files: &[P], pack_type: PackType, tar_builder: &mut tar::Builder, ) -> Result<()> { - let base_dir = match platform { - Platform::Mac => path::Path::new(dist_dir).join("mac"), - Platform::Linux => path::Path::new(dist_dir).join("linux-unpacked"), - Platform::Windows => path::Path::new(dist_dir).join("win-unpacked"), - }; - for f in pack_files { let full_path = path::Path::new(&base_dir).join(f); if !full_path.exists() { diff --git a/packer/src/packlist.yaml b/packer/src/packlist.yaml index 60682fb09..70f0c3043 100644 --- a/packer/src/packlist.yaml +++ b/packer/src/packlist.yaml @@ -1,50 +1,56 @@ mac: - frameworks: - - Flipper.app/Contents/Frameworks/ - - Flipper.app/Contents/MacOS - - Flipper.app/Contents/PkgInfo - core: - - Flipper.app/Contents/Resources - - Flipper.app/Contents/Info.plist + mode: exact + files: + frameworks: + - Flipper.app/Contents/Frameworks/ + - Flipper.app/Contents/MacOS + - Flipper.app/Contents/PkgInfo + core: + - Flipper.app/Contents/Resources + - Flipper.app/Contents/Info.plist linux: - frameworks: - - chrome-sandbox - - chrome_100_percent.pak - - chrome_200_percent.pak - - flipper - - icudtl.dat - - libEGL.so - - libffmpeg.so - - libGLESv2.so - - libvk_swiftshader.so - - libvulkan.so.1 - - locales - - resources.pak - - snapshot_blob.bin - - swiftshader - - v8_context_snapshot.bin - - vk_swiftshader_icd.json - core: - - resources + mode: exact + files: + frameworks: + - chrome-sandbox + - chrome_100_percent.pak + - chrome_200_percent.pak + - flipper + - icudtl.dat + - libEGL.so + - libffmpeg.so + - libGLESv2.so + - libvk_swiftshader.so + - libvulkan.so.1 + - locales + - resources.pak + - snapshot_blob.bin + - swiftshader + - v8_context_snapshot.bin + - vk_swiftshader_icd.json + core: + - resources windows: - frameworks: - - chrome_100_percent.pak - - chrome_200_percent.pak - - d3dcompiler_47.dll - - ffmpeg.dll - - Flipper.exe - - icudtl.dat - - libEGL.dll - - libGLESv2.dll - - locales - - resources.pak - - snapshot_blob.bin - - swiftshader - - v8_context_snapshot.bin - - vk_swiftshader.dll - - vk_swiftshader_icd.json - - vulkan-1.dll - core: - - resources + mode: exact + files: + frameworks: + - chrome_100_percent.pak + - chrome_200_percent.pak + - d3dcompiler_47.dll + - ffmpeg.dll + - Flipper.exe + - icudtl.dat + - libEGL.dll + - libGLESv2.dll + - locales + - resources.pak + - snapshot_blob.bin + - swiftshader + - v8_context_snapshot.bin + - vk_swiftshader.dll + - vk_swiftshader_icd.json + - vulkan-1.dll + core: + - resources diff --git a/packer/src/types.rs b/packer/src/types.rs index c20c3d632..90e8930ce 100644 --- a/packer/src/types.rs +++ b/packer/src/types.rs @@ -35,6 +35,26 @@ pub enum PackType { Core, } +#[derive( + Debug, + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + serde::Deserialize, + serde::Serialize +)] +#[serde(rename_all = "lowercase")] +pub enum PackMode { + /// All paths need to be specified. + Exact, + /// Can use `*` and `!` syntax to specify patterns for inclusion and exclusion. + /// Only works on the root folder level. + Glob, +} + impl Display for PackType { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self {