@@ -58,9 +58,7 @@ pub(crate) const META_MANIFEST_DIGEST: &str = "ostree.manifest-digest";
5858const META_MANIFEST : & str = "ostree.manifest" ;
5959/// The key injected into the merge commit with the image configuration serialized as JSON.
6060const META_CONFIG : & str = "ostree.container.image-config" ;
61- /// Value of type `a{sa{su}}` containing number of filtered out files
62- pub const META_FILTERED : & str = "ostree.tar-filtered" ;
63- /// The type used to store content filtering information with `META_FILTERED`.
61+ /// The type used to store content filtering information.
6462pub type MetaFilteredData = HashMap < String , HashMap < String , u32 > > ;
6563
6664/// The ref prefixes which point to ostree deployments. (TODO: Add an official API for this)
@@ -138,6 +136,8 @@ pub struct LayeredImageState {
138136 /// in the future we should probably instead just proxy a signature object
139137 /// instead, but this is sufficient for now.
140138 pub verify_text : Option < String > ,
139+ /// Files that were filtered out during the import.
140+ pub filtered_files : Option < MetaFilteredData > ,
141141}
142142
143143impl LayeredImageState {
@@ -969,7 +969,7 @@ impl ImageImporter {
969969 let ostree_ref = ref_for_image ( & target_imgref. imgref ) ?;
970970
971971 let mut layer_commits = Vec :: new ( ) ;
972- let mut layer_filtered_content: MetaFilteredData = HashMap :: new ( ) ;
972+ let mut layer_filtered_content: Option < MetaFilteredData > = None ;
973973 let have_derived_layers = !import. layers . is_empty ( ) ;
974974 tracing:: debug!( "Processing layers: {}" , import. layers. len( ) ) ;
975975 for layer in import. layers {
@@ -1024,7 +1024,9 @@ impl ImageImporter {
10241024 write ! ( msg, "...and {n_rest} more" ) . unwrap ( ) ;
10251025 }
10261026 tracing:: debug!( "Found filtered toplevels: {msg}" ) ;
1027- layer_filtered_content. insert ( layer. layer . digest ( ) . to_string ( ) , filtered_owned) ;
1027+ layer_filtered_content
1028+ . get_or_insert_default ( )
1029+ . insert ( layer. layer . digest ( ) . to_string ( ) , filtered_owned) ;
10281030 } else {
10291031 tracing:: debug!( "No filtered content" ) ;
10301032 }
@@ -1047,7 +1049,7 @@ impl ImageImporter {
10471049 let _ = self . layer_byte_progress . take ( ) ;
10481050 let _ = self . layer_progress . take ( ) ;
10491051
1050- let mut metadata = HashMap :: new ( ) ;
1052+ let mut metadata = BTreeMap :: new ( ) ;
10511053 metadata. insert (
10521054 META_MANIFEST_DIGEST ,
10531055 import. manifest_digest . to_string ( ) . to_variant ( ) ,
@@ -1064,8 +1066,6 @@ impl ImageImporter {
10641066 "ostree.importer.version" ,
10651067 env ! ( "CARGO_PKG_VERSION" ) . to_variant ( ) ,
10661068 ) ;
1067- let filtered = layer_filtered_content. to_variant ( ) ;
1068- metadata. insert ( META_FILTERED , filtered) ;
10691069 let metadata = metadata. to_variant ( ) ;
10701070
10711071 let timestamp = timestamp_of_manifest_or_config ( & import. manifest , & import. config )
@@ -1191,6 +1191,7 @@ impl ImageImporter {
11911191 . await ?;
11921192 // We can at least avoid re-verifying the base commit.
11931193 state. verify_text = import. verify_text ;
1194+ state. filtered_files = layer_filtered_content;
11941195 Ok ( state)
11951196 }
11961197}
@@ -1354,6 +1355,7 @@ pub fn query_image_commit(repo: &ostree::Repo, commit: &str) -> Result<Box<Layer
13541355 cached_update,
13551356 // we can't cross-reference with a remote here
13561357 verify_text : None ,
1358+ filtered_files : None ,
13571359 } ) ;
13581360 tracing:: debug!( "Wrote merge commit {}" , state. merge_commit) ;
13591361 Ok ( state)
@@ -1726,36 +1728,26 @@ pub fn count_layer_references(repo: &ostree::Repo) -> Result<u32> {
17261728 Ok ( n as u32 )
17271729}
17281730
1729- /// Given an image, if it has any non-ostree compatible content, return a suitable
1730- /// warning message.
1731+ /// Generate a suitable warning message from given list of filtered files, if any.
17311732pub fn image_filtered_content_warning (
1732- repo : & ostree:: Repo ,
1733- image : & ImageReference ,
1733+ filtered_files : & Option < MetaFilteredData > ,
17341734) -> Result < Option < String > > {
17351735 use std:: fmt:: Write ;
17361736
1737- let ostree_ref = ref_for_image ( image) ?;
1738- let rev = repo. require_rev ( & ostree_ref) ?;
1739- let commit_obj = repo. load_commit ( rev. as_str ( ) ) ?. 0 ;
1740- let commit_meta = & glib:: VariantDict :: new ( Some ( & commit_obj. child_value ( 0 ) ) ) ;
1741-
1742- let r = commit_meta
1743- . lookup :: < MetaFilteredData > ( META_FILTERED ) ?
1744- . filter ( |v| !v. is_empty ( ) )
1745- . map ( |v| {
1746- let mut filtered = HashMap :: < & String , u32 > :: new ( ) ;
1747- for paths in v. values ( ) {
1748- for ( k, v) in paths {
1749- let e = filtered. entry ( k) . or_default ( ) ;
1750- * e += v;
1751- }
1737+ let r = filtered_files. as_ref ( ) . map ( |v| {
1738+ let mut filtered = BTreeMap :: < & String , u32 > :: new ( ) ;
1739+ for paths in v. values ( ) {
1740+ for ( k, v) in paths {
1741+ let e = filtered. entry ( k) . or_default ( ) ;
1742+ * e += v;
17521743 }
1753- let mut buf = "Image contains non-ostree compatible file paths:" . to_string ( ) ;
1754- for ( k, v) in filtered {
1755- write ! ( buf, " {k}: {v}" ) . unwrap ( ) ;
1756- }
1757- buf
1758- } ) ;
1744+ }
1745+ let mut buf = "Image contains non-ostree compatible file paths:" . to_string ( ) ;
1746+ for ( k, v) in filtered {
1747+ write ! ( buf, " {k}: {v}" ) . unwrap ( ) ;
1748+ }
1749+ buf
1750+ } ) ;
17591751 Ok ( r)
17601752}
17611753
0 commit comments