Perform a set of checks on 'repository' :param repair: enable repair mode, write updated or corrected data into repository :param find_lost_archives: create archive directory entries that are missing :param first/last/sort_by: only check this number of first/last archives or
(
self,
repository,
*,
verify_data=False,
repair=False,
find_lost_archives=False,
match=None,
sort_by="",
first=0,
last=0,
older=None,
newer=None,
oldest=None,
newest=None,
)
| 1742 | self.key = None |
| 1743 | |
| 1744 | def check( |
| 1745 | self, |
| 1746 | repository, |
| 1747 | *, |
| 1748 | verify_data=False, |
| 1749 | repair=False, |
| 1750 | find_lost_archives=False, |
| 1751 | match=None, |
| 1752 | sort_by="", |
| 1753 | first=0, |
| 1754 | last=0, |
| 1755 | older=None, |
| 1756 | newer=None, |
| 1757 | oldest=None, |
| 1758 | newest=None, |
| 1759 | ): |
| 1760 | """Perform a set of checks on 'repository' |
| 1761 | |
| 1762 | :param repair: enable repair mode, write updated or corrected data into repository |
| 1763 | :param find_lost_archives: create archive directory entries that are missing |
| 1764 | :param first/last/sort_by: only check this number of first/last archives ordered by sort_by |
| 1765 | :param match: only check archives matching this pattern |
| 1766 | :param older/newer: only check archives older/newer than timedelta from now |
| 1767 | :param oldest/newest: only check archives older/newer than timedelta from oldest/newest archive timestamp |
| 1768 | :param verify_data: integrity verification of data referenced by archives |
| 1769 | """ |
| 1770 | if not isinstance(repository, (Repository, RemoteRepository)): |
| 1771 | logger.error("Checking legacy repositories is not supported.") |
| 1772 | return False |
| 1773 | logger.info("Starting archive consistency check...") |
| 1774 | self.check_all = not any((first, last, match, older, newer, oldest, newest)) |
| 1775 | self.repair = repair |
| 1776 | self.repository = repository |
| 1777 | # Repository.check already did a full repository-level check and has built and cached a fresh chunkindex - |
| 1778 | # we can use that here, so we don't disable the caches (also no need to cache immediately, again): |
| 1779 | self.chunks = build_chunkindex_from_repo(self.repository, disable_caches=False, cache_immediately=False) |
| 1780 | if self.key is None: |
| 1781 | self.key = self.make_key(repository) |
| 1782 | self.repo_objs = RepoObj(self.key) |
| 1783 | if verify_data: |
| 1784 | self.verify_data() |
| 1785 | rebuild_manifest = False |
| 1786 | try: |
| 1787 | repository.get_manifest() |
| 1788 | except NoManifestError: |
| 1789 | logger.error("Repository manifest is missing.") |
| 1790 | self.error_found = True |
| 1791 | rebuild_manifest = True |
| 1792 | else: |
| 1793 | try: |
| 1794 | self.manifest = Manifest.load(repository, (Manifest.Operation.CHECK,), key=self.key) |
| 1795 | except IntegrityErrorBase as exc: |
| 1796 | logger.error("Repository manifest is corrupted: %s", exc) |
| 1797 | self.error_found = True |
| 1798 | rebuild_manifest = True |
| 1799 | if rebuild_manifest: |
| 1800 | self.manifest = self.rebuild_manifest() |
| 1801 | if find_lost_archives: |
no test coverage detected