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 {