Blame SOURCES/0001-reposync-Fix-delete-with-multiple-repos-RhBug1774103.patch

030877
From 8a9d9b7c09fb126baac22eda8ebb940412f4464c Mon Sep 17 00:00:00 2001
030877
From: Marek Blaha <mblaha@redhat.com>
030877
Date: Wed, 27 Nov 2019 13:43:58 +0100
030877
Subject: [PATCH] [reposync] Fix --delete with multiple repos (RhBug:1774103)
030877
030877
When reposync was used with --delete option and multiple repositories
030877
to sync, only packages from the latest repository were kept and all
030877
downloaded content from former repositories was imediately deleted.
030877
030877
Additionaly it fixes the problem with multiple packages having the same
030877
filename (in different subdirectories) in one repository. In this case
030877
when --delete option was used, only one of those files was kept and the
030877
others were deleted.
030877
030877
https://bugzilla.redhat.com/show_bug.cgi?id=1774103
030877
---
030877
 plugins/reposync.py | 35 +++++++++++++++--------------------
030877
 1 file changed, 15 insertions(+), 20 deletions(-)
030877
030877
diff --git a/plugins/reposync.py b/plugins/reposync.py
030877
index 10e9b0b5..fc612a7e 100644
030877
--- a/plugins/reposync.py
030877
+++ b/plugins/reposync.py
030877
@@ -145,7 +145,7 @@ def run(self):
030877
             else:
030877
                 self.download_packages(pkglist)
030877
             if self.opts.delete:
030877
-                self.delete_old_local_packages(pkglist)
030877
+                self.delete_old_local_packages(repo, pkglist)
030877
 
030877
     def repo_target(self, repo):
030877
         return _pkgdir(self.opts.destdir or self.opts.download_path, repo.id)
030877
@@ -169,25 +169,20 @@ def pkg_download_path(self, pkg):
030877
                     pkg_download_path, repo_target))
030877
         return pkg_download_path
030877
 
030877
-    def delete_old_local_packages(self, packages_to_download):
030877
-        download_map = dict()
030877
-        for pkg in packages_to_download:
030877
-            download_map[(pkg.repo.id, os.path.basename(pkg.location))] = pkg.location
030877
-        # delete any *.rpm file, that is not going to be downloaded from repository
030877
-        for repo in self.base.repos.iter_enabled():
030877
-            repo_target = self.repo_target(repo)
030877
-            for dirpath, dirnames, filenames in os.walk(repo_target):
030877
-                for filename in filenames:
030877
-                    path = os.path.join(dirpath, filename)
030877
-                    if filename.endswith('.rpm') and os.path.isfile(path):
030877
-                        location = download_map.get((repo.id, filename))
030877
-                        if location is None or os.path.join(repo_target, location) != path:
030877
-                            # Delete disappeared or relocated file
030877
-                            try:
030877
-                                os.unlink(path)
030877
-                                logger.info(_("[DELETED] %s"), path)
030877
-                            except OSError:
030877
-                                logger.error(_("failed to delete file %s"), path)
030877
+    def delete_old_local_packages(self, repo, pkglist):
030877
+        # delete any *.rpm file under target path, that was not downloaded from repository
030877
+        downloaded_files = set(self.pkg_download_path(pkg) for pkg in pkglist)
030877
+        for dirpath, dirnames, filenames in os.walk(self.repo_target(repo)):
030877
+            for filename in filenames:
030877
+                path = os.path.join(dirpath, filename)
030877
+                if filename.endswith('.rpm') and os.path.isfile(path):
030877
+                    if path not in downloaded_files:
030877
+                        # Delete disappeared or relocated file
030877
+                        try:
030877
+                            os.unlink(path)
030877
+                            logger.info(_("[DELETED] %s"), path)
030877
+                        except OSError:
030877
+                            logger.error(_("failed to delete file %s"), path)
030877
 
030877
     def getcomps(self, repo):
030877
         comps_fn = repo._repo.getCompsFn()