44
55use std:: ffi:: { CString , OsStr , OsString } ;
66use std:: io:: Seek ;
7- use std:: os:: unix:: process:: CommandExt ;
8- use std:: process:: Command ;
97
108use anyhow:: { ensure, Context , Result } ;
119use camino:: Utf8PathBuf ;
@@ -26,11 +24,11 @@ use schemars::schema_for;
2624use serde:: { Deserialize , Serialize } ;
2725
2826use crate :: deploy:: RequiredHostSpec ;
29- use crate :: lints;
3027use crate :: progress_jsonl:: { ProgressWriter , RawProgressFd } ;
31- use crate :: spec:: Host ;
3228use crate :: spec:: ImageReference ;
29+ use crate :: spec:: { FilesystemOverlay , Host } ;
3330use crate :: utils:: sigpolicy_from_opt;
31+ use crate :: { lints, overlay} ;
3432
3533/// Shared progress options
3634#[ derive( Debug , Parser , PartialEq , Eq ) ]
@@ -968,23 +966,25 @@ async fn edit(opts: EditOpts) -> Result<()> {
968966 println ! ( "Edit cancelled, no changes made." ) ;
969967 return Ok ( ( ) ) ;
970968 }
969+
971970 host. spec . verify_transition ( & new_host. spec ) ?;
972971 let new_spec = RequiredHostSpec :: from_spec ( & new_host. spec ) ?;
973972
974- let prog = ProgressWriter :: default ( ) ;
975-
976- // We only support two state transitions right now; switching the image,
977- // or flipping the bootloader ordering.
978- if host. spec . boot_order != new_host. spec . boot_order {
979- return crate :: deploy:: rollback ( sysroot) . await ;
973+ if new_host. spec . usr_overlay != host. spec . usr_overlay {
974+ if let Some ( overlay) = new_host. spec . usr_overlay {
975+ crate :: overlay:: set_usr_overlay ( overlay) ?;
976+ }
977+ }
978+ if new_host. spec . boot_order != host. spec . boot_order {
979+ crate :: deploy:: rollback ( sysroot) . await ?;
980+ }
981+ if new_host. spec . image != host. spec . image {
982+ let prog = ProgressWriter :: default ( ) ;
983+ let fetched =
984+ crate :: deploy:: pull ( repo, new_spec. image , None , opts. quiet , prog. clone ( ) ) . await ?;
985+ let stateroot = booted_deployment. osname ( ) ;
986+ crate :: deploy:: stage ( sysroot, & stateroot, & fetched, & new_spec, prog. clone ( ) ) . await ?;
980987 }
981-
982- let fetched = crate :: deploy:: pull ( repo, new_spec. image , None , opts. quiet , prog. clone ( ) ) . await ?;
983-
984- // TODO gc old layers here
985-
986- let stateroot = booted_deployment. osname ( ) ;
987- crate :: deploy:: stage ( sysroot, & stateroot, & fetched, & new_spec, prog. clone ( ) ) . await ?;
988988
989989 sysroot. update_mtime ( ) ?;
990990
@@ -993,12 +993,7 @@ async fn edit(opts: EditOpts) -> Result<()> {
993993
994994/// Implementation of `bootc usroverlay`
995995async fn usroverlay ( ) -> Result < ( ) > {
996- // This is just a pass-through today. At some point we may make this a libostree API
997- // or even oxidize it.
998- Err ( Command :: new ( "ostree" )
999- . args ( [ "admin" , "unlock" ] )
1000- . exec ( )
1001- . into ( ) )
996+ overlay:: set_usr_overlay ( FilesystemOverlay :: ReadWrite )
1002997}
1003998
1004999/// Perform process global initialization. This should be called as early as possible
0 commit comments