Skip to content

Commit 63259bd

Browse files
committed
update: pass RootContext as parameter
Also remove duplicated sysroot as `openat::Dir::open("/")`
1 parent 1f6cad2 commit 63259bd

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

src/bootupd.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -216,16 +216,16 @@ fn ensure_writable_boot() -> Result<()> {
216216
}
217217

218218
/// daemon implementation of component update
219-
pub(crate) fn update(name: &str) -> Result<ComponentUpdateResult> {
220-
let mut state = SavedState::load_from_disk("/")?.unwrap_or_default();
219+
pub(crate) fn update(name: &str, rootcxt: &RootContext) -> Result<ComponentUpdateResult> {
220+
let mut state = SavedState::load_from_disk(&rootcxt.path)?.unwrap_or_default();
221221
let component = component::new_from_name(name)?;
222222
let inst = if let Some(inst) = state.installed.get(name) {
223223
inst.clone()
224224
} else {
225225
anyhow::bail!("Component {} is not installed", name);
226226
};
227-
let sysroot = openat::Dir::open("/")?;
228-
let update = component.query_update(&sysroot)?;
227+
let sysroot = &rootcxt.sysroot;
228+
let update = component.query_update(sysroot)?;
229229
let update = match update.as_ref() {
230230
Some(p) if inst.meta.can_upgrade_to(p) => p,
231231
_ => return Ok(ComponentUpdateResult::AtLatestVersion),
@@ -236,6 +236,7 @@ pub(crate) fn update(name: &str) -> Result<ComponentUpdateResult> {
236236
let mut pending_container = state.pending.take().unwrap_or_default();
237237
let interrupted = pending_container.get(component.name()).cloned();
238238
pending_container.insert(component.name().into(), update.clone());
239+
let sysroot = sysroot.try_clone()?;
239240
let mut state_guard =
240241
SavedState::acquire_write_lock(sysroot).context("Failed to acquire write lock")?;
241242
state_guard
@@ -257,19 +258,20 @@ pub(crate) fn update(name: &str) -> Result<ComponentUpdateResult> {
257258
}
258259

259260
/// daemon implementation of component adoption
260-
pub(crate) fn adopt_and_update(name: &str) -> Result<ContentMetadata> {
261-
let sysroot = openat::Dir::open("/")?;
262-
let mut state = SavedState::load_from_disk("/")?.unwrap_or_default();
261+
pub(crate) fn adopt_and_update(name: &str, rootcxt: &RootContext) -> Result<ContentMetadata> {
262+
let sysroot = &rootcxt.sysroot;
263+
let mut state = SavedState::load_from_disk(&rootcxt.path)?.unwrap_or_default();
263264
let component = component::new_from_name(name)?;
264265
if state.installed.contains_key(name) {
265266
anyhow::bail!("Component {} is already installed", name);
266267
};
267268

268269
ensure_writable_boot()?;
269270

270-
let Some(update) = component.query_update(&sysroot)? else {
271+
let Some(update) = component.query_update(sysroot)? else {
271272
anyhow::bail!("Component {} has no available update", name);
272273
};
274+
let sysroot = sysroot.try_clone()?;
273275
let mut state_guard =
274276
SavedState::acquire_write_lock(sysroot).context("Failed to acquire write lock")?;
275277

@@ -439,6 +441,7 @@ fn prep_before_update() -> Result<RootContext> {
439441

440442
pub(crate) fn client_run_update() -> Result<()> {
441443
crate::try_fail_point!("update");
444+
let rootcxt = prep_before_update()?;
442445
let status: Status = status()?;
443446
if status.components.is_empty() && status.adoptable.is_empty() {
444447
println!("No components installed.");
@@ -450,7 +453,7 @@ pub(crate) fn client_run_update() -> Result<()> {
450453
ComponentUpdatable::Upgradable => {}
451454
_ => continue,
452455
};
453-
match update(name)? {
456+
match update(name, &rootcxt)? {
454457
ComponentUpdateResult::AtLatestVersion => {
455458
// Shouldn't happen unless we raced with another client
456459
eprintln!(
@@ -478,7 +481,7 @@ pub(crate) fn client_run_update() -> Result<()> {
478481
}
479482
for (name, adoptable) in status.adoptable.iter() {
480483
if adoptable.confident {
481-
let r: ContentMetadata = adopt_and_update(name)?;
484+
let r: ContentMetadata = adopt_and_update(name, &rootcxt)?;
482485
println!("Adopted and updated: {}: {}", name, r.version);
483486
updated = true;
484487
} else {
@@ -492,12 +495,13 @@ pub(crate) fn client_run_update() -> Result<()> {
492495
}
493496

494497
pub(crate) fn client_run_adopt_and_update() -> Result<()> {
498+
let rootcxt = prep_before_update()?;
495499
let status: Status = status()?;
496500
if status.adoptable.is_empty() {
497501
println!("No components are adoptable.");
498502
} else {
499503
for (name, _) in status.adoptable.iter() {
500-
let r: ContentMetadata = adopt_and_update(name)?;
504+
let r: ContentMetadata = adopt_and_update(name, &rootcxt)?;
501505
println!("Adopted and updated: {}: {}", name, r.version);
502506
}
503507
}

0 commit comments

Comments
 (0)