@@ -58,9 +58,7 @@ pub(crate) const META_MANIFEST_DIGEST: &str = "ostree.manifest-digest";
58
58
const META_MANIFEST : & str = "ostree.manifest" ;
59
59
/// The key injected into the merge commit with the image configuration serialized as JSON.
60
60
const 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.
64
62
pub type MetaFilteredData = HashMap < String , HashMap < String , u32 > > ;
65
63
66
64
/// The ref prefixes which point to ostree deployments. (TODO: Add an official API for this)
@@ -138,6 +136,8 @@ pub struct LayeredImageState {
138
136
/// in the future we should probably instead just proxy a signature object
139
137
/// instead, but this is sufficient for now.
140
138
pub verify_text : Option < String > ,
139
+ /// Files that were filtered out during the import.
140
+ pub filtered_files : Option < MetaFilteredData > ,
141
141
}
142
142
143
143
impl LayeredImageState {
@@ -969,7 +969,7 @@ impl ImageImporter {
969
969
let ostree_ref = ref_for_image ( & target_imgref. imgref ) ?;
970
970
971
971
let mut layer_commits = Vec :: new ( ) ;
972
- let mut layer_filtered_content: MetaFilteredData = HashMap :: new ( ) ;
972
+ let mut layer_filtered_content: Option < MetaFilteredData > = None ;
973
973
let have_derived_layers = !import. layers . is_empty ( ) ;
974
974
tracing:: debug!( "Processing layers: {}" , import. layers. len( ) ) ;
975
975
for layer in import. layers {
@@ -1024,7 +1024,9 @@ impl ImageImporter {
1024
1024
write ! ( msg, "...and {n_rest} more" ) . unwrap ( ) ;
1025
1025
}
1026
1026
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) ;
1028
1030
} else {
1029
1031
tracing:: debug!( "No filtered content" ) ;
1030
1032
}
@@ -1047,7 +1049,7 @@ impl ImageImporter {
1047
1049
let _ = self . layer_byte_progress . take ( ) ;
1048
1050
let _ = self . layer_progress . take ( ) ;
1049
1051
1050
- let mut metadata = HashMap :: new ( ) ;
1052
+ let mut metadata = BTreeMap :: new ( ) ;
1051
1053
metadata. insert (
1052
1054
META_MANIFEST_DIGEST ,
1053
1055
import. manifest_digest . to_string ( ) . to_variant ( ) ,
@@ -1064,8 +1066,6 @@ impl ImageImporter {
1064
1066
"ostree.importer.version" ,
1065
1067
env ! ( "CARGO_PKG_VERSION" ) . to_variant ( ) ,
1066
1068
) ;
1067
- let filtered = layer_filtered_content. to_variant ( ) ;
1068
- metadata. insert ( META_FILTERED , filtered) ;
1069
1069
let metadata = metadata. to_variant ( ) ;
1070
1070
1071
1071
let timestamp = timestamp_of_manifest_or_config ( & import. manifest , & import. config )
@@ -1191,6 +1191,7 @@ impl ImageImporter {
1191
1191
. await ?;
1192
1192
// We can at least avoid re-verifying the base commit.
1193
1193
state. verify_text = import. verify_text ;
1194
+ state. filtered_files = layer_filtered_content;
1194
1195
Ok ( state)
1195
1196
}
1196
1197
}
@@ -1354,6 +1355,7 @@ pub fn query_image_commit(repo: &ostree::Repo, commit: &str) -> Result<Box<Layer
1354
1355
cached_update,
1355
1356
// we can't cross-reference with a remote here
1356
1357
verify_text : None ,
1358
+ filtered_files : None ,
1357
1359
} ) ;
1358
1360
tracing:: debug!( "Wrote merge commit {}" , state. merge_commit) ;
1359
1361
Ok ( state)
@@ -1726,36 +1728,26 @@ pub fn count_layer_references(repo: &ostree::Repo) -> Result<u32> {
1726
1728
Ok ( n as u32 )
1727
1729
}
1728
1730
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.
1731
1732
pub fn image_filtered_content_warning (
1732
- repo : & ostree:: Repo ,
1733
- image : & ImageReference ,
1733
+ filtered_files : & Option < MetaFilteredData > ,
1734
1734
) -> Result < Option < String > > {
1735
1735
use std:: fmt:: Write ;
1736
1736
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;
1752
1743
}
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
+ } ) ;
1759
1751
Ok ( r)
1760
1752
}
1761
1753
0 commit comments