# Copyright 2013 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 import logging import stat from portage import os from .DeletionTask import DeletionTask class DeletionIterator(object): def __init__(self, config): self._config = config def __iter__(self): distdir = self._config.options.distfiles file_owners = self._config.file_owners whitelist = self._config.whitelist distfiles_local = self._config.options.distfiles_local deletion_db = self._config.deletion_db deletion_delay = self._config.options.deletion_delay start_time = self._config.start_time distfiles_set = set(os.listdir(self._config.options.distfiles)) for filename in distfiles_set: try: st = os.stat(os.path.join(distdir, filename)) except OSError as e: logging.error("stat failed on '%s' in distfiles: %s\n" % (filename, e)) continue if not stat.S_ISREG(st.st_mode): continue elif filename in file_owners: if deletion_db is not None: try: del deletion_db[filename] except KeyError: pass elif whitelist is not None and filename in whitelist: if deletion_db is not None: try: del deletion_db[filename] except KeyError: pass elif distfiles_local is not None and \ os.path.exists(os.path.join(distfiles_local, filename)): if deletion_db is not None: try: del deletion_db[filename] except KeyError: pass else: self._config.scheduled_deletion_count += 1 if deletion_db is None or deletion_delay is None: yield DeletionTask(background=True, distfile=filename, config=self._config) else: deletion_entry = deletion_db.get(filename) if deletion_entry is None: logging.debug("add '%s' to deletion db" % filename) deletion_db[filename] = start_time elif deletion_entry + deletion_delay <= start_time: yield DeletionTask(background=True, distfile=filename, config=self._config) if deletion_db is not None: for filename in list(deletion_db): if filename not in distfiles_set: try: del deletion_db[filename] except KeyError: pass else: logging.debug("drop '%s' from deletion db" % filename)