@@ -21,6 +21,24 @@ import (
2121 "github.com/linuxdeepin/go-lib/gettext"
2222)
2323
24+ // calculateTotalDownloadSize calculates the total download size for all packages under the specified update mode
25+ func calculateTotalDownloadSize (mode system.UpdateType , updatablePkgsMap map [system.UpdateType ][]string ) (float64 , []error ) {
26+ totalNeedDownloadSize := 0.0
27+ var errs []error
28+ for _ , updateType := range system .AllUpdateType () {
29+ if mode & updateType == 0 {
30+ continue
31+ }
32+ updatablePkgs := updatablePkgsMap [updateType ]
33+ if needDownloadSize , _ , err := system .QuerySourceDownloadSize (updateType , updatablePkgs ); err == nil {
34+ totalNeedDownloadSize += needDownloadSize
35+ } else {
36+ errs = append (errs , err )
37+ }
38+ }
39+ return totalNeedDownloadSize , errs
40+ }
41+
2442func (m * Manager ) prepareDistUpgrade (sender dbus.Sender , origin system.UpdateType , initiator Initiator ) (* Job , error ) {
2543 if m .ImmutableAutoRecovery {
2644 logger .Info ("immutable auto recovery is enabled, don't allow to exec prepareDistUpgrade" )
@@ -46,16 +64,17 @@ func (m *Manager) prepareDistUpgrade(sender dbus.Sender, origin system.UpdateTyp
4664 }
4765 }
4866
49- packages := m .updater .getUpdatablePackagesByType (mode )
67+ packages , updatablePkgsMap := m .updater .getUpdatablePackagesWithClassification (mode )
5068 if len (packages ) == 0 {
5169 return nil , system .NotFoundError ("empty UpgradableApps" )
5270 }
53- var needDownloadSize float64
54- needDownloadSize , _ , _ = system .QueryPackageDownloadSize (mode , packages ... )
71+
72+ // Calculate the total download size required
73+ totalNeedDownloadSize , _ := calculateTotalDownloadSize (mode , updatablePkgsMap )
5574 // 不再处理needDownloadSize == 0的情况,因为有可能是其他仓库包含了该仓库的包,导致该仓库无需下载,可以直接继续后续流程,用来切换该仓库的状态
5675 // 下载前检查/var分区的磁盘空间是否足够下载,
5776 isInsufficientSpace := false
58- if needDownloadSize > 0 {
77+ if totalNeedDownloadSize > 0 {
5978 content , err := exec .Command ("/bin/sh" , []string {
6079 "-c" ,
6180 "df -BK --output='avail' /var|awk 'NR==2'" ,
@@ -70,7 +89,7 @@ func (m *Manager) prepareDistUpgrade(sender dbus.Sender, origin system.UpdateTyp
7089 logger .Warning (err )
7190 } else {
7291 spaceNum = spaceNum * 1000
73- isInsufficientSpace = spaceNum < int (needDownloadSize )
92+ isInsufficientSpace = spaceNum < int (totalNeedDownloadSize )
7493 }
7594 }
7695 }
@@ -81,7 +100,7 @@ func (m *Manager) prepareDistUpgrade(sender dbus.Sender, origin system.UpdateTyp
81100 ErrDetail : "You don't have enough free space to download" ,
82101 IsCheckError : true ,
83102 }
84- msg := fmt .Sprintf (gettext .Tr ("Downloading updates failed. Please free up %g GB disk space first." ), needDownloadSize / (1000 * 1000 * 1000 ))
103+ msg := fmt .Sprintf (gettext .Tr ("Downloading updates failed. Please free up %g GB disk space first." ), totalNeedDownloadSize / (1000 * 1000 * 1000 ))
85104 go m .sendNotify (updateNotifyShowOptional , 0 , "preferences-system" , "" , msg , nil , nil , system .NotifyExpireTimeoutDefault )
86105 logger .Warning (dbusError .Error ())
87106 errStr , _ := json .Marshal (dbusError )
@@ -150,24 +169,22 @@ func (m *Manager) prepareDistUpgrade(sender dbus.Sender, origin system.UpdateTyp
150169 return nil
151170 },
152171 string (system .FailedStatus ): func () error {
153- m .PropsMu .Lock ()
154- packages := m .UpgradableApps
155- m .PropsMu .Unlock ()
156172 // 失败的单独设置失败类型的状态,其他的还原成未下载(其中下载完成的由于限制不会被修改)
157173 m .statusManager .SetUpdateStatus (j .updateTyp , system .DownloadErr )
158174 m .statusManager .SetUpdateStatus (mode , system .NotDownload )
159175 var errorContent system.JobError
160176 err = json .Unmarshal ([]byte (j .Description ), & errorContent )
161177 if err == nil {
162178 if strings .Contains (errorContent .ErrType .String (), system .ErrorInsufficientSpace .String ()) {
163- var msg string
164- size , _ , err := system .QueryPackageDownloadSize (mode , packages ... )
165- if err != nil {
166- logger .Warning (err )
167- size = needDownloadSize
179+ _ , updatablePkgsMap := m .updater .getUpdatablePackagesWithClassification (mode )
180+ size , errs := calculateTotalDownloadSize (mode , updatablePkgsMap )
181+ if size == 0 && len (errs ) > 0 {
182+ size = totalNeedDownloadSize
183+ }
184+ if size > 0 {
185+ msg := fmt .Sprintf (gettext .Tr ("Downloading updates failed. Please free up %g GB disk space first." ), size / (1000 * 1000 * 1000 ))
186+ go m .sendNotify (updateNotifyShowOptional , 0 , "preferences-system" , "" , msg , nil , nil , system .NotifyExpireTimeoutDefault )
168187 }
169- msg = fmt .Sprintf (gettext .Tr ("Downloading updates failed. Please free up %g GB disk space first." ), size / (1000 * 1000 * 1000 ))
170- go m .sendNotify (updateNotifyShowOptional , 0 , "preferences-system" , "" , msg , nil , nil , system .NotifyExpireTimeoutDefault )
171188 } else if strings .Contains (errorContent .ErrType .String (), system .ErrorDamagePackage .String ()) {
172189 // 下载更新失败,需要apt-get clean后重新下载
173190 cleanAllCache ()
0 commit comments