@@ -23,9 +23,10 @@ use futures_util::TryFutureExt;
2323use oci_spec:: image:: {
2424 self as oci_image, Arch , Descriptor , Digest , History , ImageConfiguration , ImageManifest ,
2525} ;
26+ use ostree:: glib:: FromVariant ;
2627use ostree:: prelude:: { Cast , FileEnumeratorExt , FileExt , ToVariant } ;
2728use ostree:: { gio, glib} ;
28- use std:: collections:: { BTreeSet , HashMap } ;
29+ use std:: collections:: { BTreeMap , BTreeSet , HashMap } ;
2930use std:: iter:: FromIterator ;
3031use tokio:: sync:: mpsc:: { Receiver , Sender } ;
3132
@@ -1196,6 +1197,37 @@ fn parse_cached_update(meta: &glib::VariantDict) -> Result<Option<CachedImageUpd
11961197 } ) )
11971198}
11981199
1200+ /// Remove any cached
1201+ #[ context( "Clearing cached update {imgref}" ) ]
1202+ pub fn clear_cached_update ( repo : & ostree:: Repo , imgref : & ImageReference ) -> Result < ( ) > {
1203+ let cancellable = gio:: Cancellable :: NONE ;
1204+ let ostree_ref = ref_for_image ( imgref) ?;
1205+ let rev = repo. require_rev ( & ostree_ref) ?;
1206+ let Some ( commitmeta) = repo. read_commit_detached_metadata ( & rev, cancellable) ? else {
1207+ return Ok ( ( ) ) ;
1208+ } ;
1209+
1210+ // SAFETY: We know this is an a{sv}
1211+ let mut commitmeta: BTreeMap < String , glib:: Variant > =
1212+ BTreeMap :: from_variant ( & commitmeta) . unwrap ( ) ;
1213+ let mut changed = false ;
1214+ for key in [
1215+ ImageImporter :: CACHED_KEY_CONFIG ,
1216+ ImageImporter :: CACHED_KEY_MANIFEST ,
1217+ ImageImporter :: CACHED_KEY_MANIFEST_DIGEST ,
1218+ ] {
1219+ if commitmeta. remove ( key) . is_some ( ) {
1220+ changed = true ;
1221+ }
1222+ }
1223+ if !changed {
1224+ return Ok ( ( ) ) ;
1225+ }
1226+ let commitmeta = glib:: Variant :: from ( commitmeta) ;
1227+ repo. write_commit_detached_metadata ( & rev, Some ( & commitmeta) , cancellable) ?;
1228+ Ok ( ( ) )
1229+ }
1230+
11991231/// Query metadata for a pulled image via an OSTree commit digest.
12001232/// The digest must refer to a pulled container image's merge commit.
12011233pub fn query_image_commit ( repo : & ostree:: Repo , commit : & str ) -> Result < Box < LayeredImageState > > {
0 commit comments