diff --git a/oma-pm-operation-type/src/lib.rs b/oma-pm-operation-type/src/lib.rs index 1ae13113f..6efbf96ac 100644 --- a/oma-pm-operation-type/src/lib.rs +++ b/oma-pm-operation-type/src/lib.rs @@ -14,6 +14,7 @@ pub struct OmaOperation { pub total_download_size: u64, pub suggest: Vec<(String, String)>, pub recommend: Vec<(String, String)>, + pub max_old_installed_size: u64, } impl Display for OmaOperation { diff --git a/oma-pm/src/apt.rs b/oma-pm/src/apt.rs index 84b458bed..3fd93257b 100644 --- a/oma-pm/src/apt.rs +++ b/oma-pm/src/apt.rs @@ -846,6 +846,8 @@ impl OmaApt { let mut suggest = HashSet::with_hasher(ahash::RandomState::new()); let mut recommend = HashSet::with_hasher(ahash::RandomState::new()); + let mut max_old_installed_size = 0; + for pkg in changes { if pkg.marked_new_install() { let cand = pkg @@ -886,6 +888,8 @@ impl OmaApt { } if pkg.marked_upgrade() { + swap_max_old_instaalled_size(&mut max_old_installed_size, &pkg); + let install_entry = pkg_delta( &pkg, InstallOperation::Upgrade, @@ -952,6 +956,8 @@ impl OmaApt { } if pkg.marked_reinstall() { + swap_max_old_instaalled_size(&mut max_old_installed_size, &pkg); + // 如果一个包被标记为重装,则肯定已经安装 // 所以请求已安装版本应该直接 unwrap let version = pkg.installed().unwrap(); @@ -986,6 +992,8 @@ impl OmaApt { } if pkg.marked_downgrade() { + swap_max_old_instaalled_size(&mut max_old_installed_size, &pkg); + let install_entry = pkg_delta( &pkg, InstallOperation::Downgrade, @@ -1058,6 +1066,7 @@ impl OmaApt { autoremovable, suggest: suggest.into_iter().collect(), recommend: recommend.into_iter().collect(), + max_old_installed_size, }) } @@ -1065,7 +1074,9 @@ impl OmaApt { pub fn check_disk_size(&self, op: &OmaOperation) -> OmaAptResult<()> { let download_size = op.total_download_size as i64; - let need_space = download_size + op.disk_size_delta; + // dpkg 需要先解压新版本的文件,在删除老版本的文件 + // 所以要加上被卸载掉的包的 最大的包的安装大小 + let need_space = download_size + op.disk_size_delta + op.max_old_installed_size as i64; let available_disk_size = fs4::available_space(self.config.get("Dir").unwrap_or("/".to_string())) @@ -1110,6 +1121,14 @@ impl OmaApt { } } +fn swap_max_old_instaalled_size(max_old_installed_size: &mut u64, pkg: &Package<'_>) { + let installed_size = pkg.installed().unwrap().installed_size(); + + if installed_size > *max_old_installed_size { + *max_old_installed_size = installed_size; + } +} + fn dpkg_exit_status(mut cmd: std::process::Child) -> Result<(), OmaAptError> { match cmd.wait() { Ok(status) => match status.code() {