4
4
5
5
use std:: ffi:: { CString , OsStr , OsString } ;
6
6
use std:: io:: Seek ;
7
- use std:: os:: unix:: process:: CommandExt ;
8
- use std:: process:: Command ;
9
7
10
8
use anyhow:: { ensure, Context , Result } ;
11
9
use camino:: Utf8PathBuf ;
@@ -26,11 +24,11 @@ use schemars::schema_for;
26
24
use serde:: { Deserialize , Serialize } ;
27
25
28
26
use crate :: deploy:: RequiredHostSpec ;
29
- use crate :: lints;
30
27
use crate :: progress_jsonl:: { ProgressWriter , RawProgressFd } ;
31
- use crate :: spec:: Host ;
32
28
use crate :: spec:: ImageReference ;
29
+ use crate :: spec:: { FilesystemOverlay , Host } ;
33
30
use crate :: utils:: sigpolicy_from_opt;
31
+ use crate :: { lints, overlay} ;
34
32
35
33
/// Shared progress options
36
34
#[ derive( Debug , Parser , PartialEq , Eq ) ]
@@ -968,23 +966,25 @@ async fn edit(opts: EditOpts) -> Result<()> {
968
966
println ! ( "Edit cancelled, no changes made." ) ;
969
967
return Ok ( ( ) ) ;
970
968
}
969
+
971
970
host. spec . verify_transition ( & new_host. spec ) ?;
972
971
let new_spec = RequiredHostSpec :: from_spec ( & new_host. spec ) ?;
973
972
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 ?;
980
987
}
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 ?;
988
988
989
989
sysroot. update_mtime ( ) ?;
990
990
@@ -993,12 +993,7 @@ async fn edit(opts: EditOpts) -> Result<()> {
993
993
994
994
/// Implementation of `bootc usroverlay`
995
995
async 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 )
1002
997
}
1003
998
1004
999
/// Perform process global initialization. This should be called as early as possible
0 commit comments