6363from .utils import password_to_key
6464from .validate import SCHEMA_BACKUP
6565
66+ IGNORED_COMPARISON_FIELDS = {ATTR_PROTECTED , ATTR_CRYPTO , ATTR_DOCKER }
67+
6668_LOGGER : logging .Logger = logging .getLogger (__name__ )
6769
6870
@@ -265,7 +267,7 @@ def __eq__(self, other: Any) -> bool:
265267
266268 # Compare all fields except ones about protection. Current encryption status does not affect equality
267269 keys = self ._data .keys () | other ._data .keys ()
268- for k in keys - { ATTR_PROTECTED , ATTR_CRYPTO , ATTR_DOCKER } :
270+ for k in keys - IGNORED_COMPARISON_FIELDS :
269271 if (
270272 k not in self ._data
271273 or k not in other ._data
@@ -577,13 +579,21 @@ def _add_backup_json():
577579 @Job (name = "backup_addon_save" , cleanup = False )
578580 async def _addon_save (self , addon : Addon ) -> asyncio .Task | None :
579581 """Store an add-on into backup."""
580- self .sys_jobs .current .reference = addon .slug
582+ self .sys_jobs .current .reference = slug = addon .slug
581583 if not self ._outer_secure_tarfile :
582584 raise RuntimeError (
583585 "Cannot backup components without initializing backup tar"
584586 )
585587
586- tar_name = f"{ addon .slug } .tar{ '.gz' if self .compressed else '' } "
588+ # Ensure it is still installed and get current data before proceeding
589+ if not (curr_addon := self .sys_addons .get_local_only (slug )):
590+ _LOGGER .warning (
591+ "Skipping backup of add-on %s because it has been uninstalled" ,
592+ slug ,
593+ )
594+ return None
595+
596+ tar_name = f"{ slug } .tar{ '.gz' if self .compressed else '' } "
587597
588598 addon_file = self ._outer_secure_tarfile .create_inner_tar (
589599 f"./{ tar_name } " ,
@@ -592,16 +602,16 @@ async def _addon_save(self, addon: Addon) -> asyncio.Task | None:
592602 )
593603 # Take backup
594604 try :
595- start_task = await addon .backup (addon_file )
605+ start_task = await curr_addon .backup (addon_file )
596606 except AddonsError as err :
597607 raise BackupError (str (err )) from err
598608
599609 # Store to config
600610 self ._data [ATTR_ADDONS ].append (
601611 {
602- ATTR_SLUG : addon . slug ,
603- ATTR_NAME : addon .name ,
604- ATTR_VERSION : addon .version ,
612+ ATTR_SLUG : slug ,
613+ ATTR_NAME : curr_addon .name ,
614+ ATTR_VERSION : curr_addon .version ,
605615 # Bug - addon_file.size used to give us this information
606616 # It always returns 0 in current securetar. Skipping until fixed
607617 ATTR_SIZE : 0 ,
0 commit comments