enkore: I can has test case? ;)
ThomasWaldmann: btw, i also tried to add a test for the single --force delete, but it needs some different corruption code that cleanly removes an archive chunk from repo.
enkore: Suggestion: Don't corrupt the low-level structures for the tests, it is expected that only check--repair can fix it and that --force² might fail after the commit. Instead, write some invalid data via the Repository API, that way it's easier to test.
diff --git a/src/borg/archive.py b/src/borg/archive.py
index 07d62e16..4bebecd7 100644
--- a/src/borg/archive.py
+++ b/src/borg/archive.py
@@ -662,7 +662,7 @@ def chunk_decref(id, stats):
                 raise ChunksIndexError(cid)
             except Repository.ObjectNotFound as e:
                 # object not in repo - strange, but we wanted to delete it anyway.
-                if not forced:
+                if forced == 0:
                     raise
                 error = True
 
@@ -686,14 +686,14 @@ def chunk_decref(id, stats):
                 except (TypeError, ValueError):
                     # if items metadata spans multiple chunks and one chunk got dropped somehow,
                     # it could be that unpacker yields bad types
-                    if not forced:
+                    if forced == 0:
                         raise
                     error = True
             if progress:
                 pi.finish()
         except (msgpack.UnpackException, Repository.ObjectNotFound):
             # items metadata corrupted
-            if not forced:
+            if forced == 0:
                 raise
             error = True
         # in forced delete mode, we try hard to delete at least the manifest entry,
diff --git a/src/borg/archiver.py b/src/borg/archiver.py
index 041749a1..efdc16db 100644
--- a/src/borg/archiver.py
+++ b/src/borg/archiver.py
@@ -828,6 +828,26 @@ def _delete_archives(self, args, repository):
             if not archive_names:
                 return self.exit_code
 
+        if args.forced == 2:
+            deleted = False
+            for i, archive_name in enumerate(archive_names, 1):
+                try:
+                    del manifest.archives[archive_name]
+                except KeyError:
+                    self.exit_code = EXIT_WARNING
+                    logger.warning('Archive {} not found ({}/{}).'.format(archive_name, i, len(archive_names)))
+                else:
+                    deleted = True
+                    logger.info('Deleted {} ({}/{}).'.format(archive_name, i, len(archive_names)))
+            if deleted:
+                manifest.write()
+                # note: might crash in compact() after committing the repo
+                repository.commit()
+                logger.info('Done. Run "borg check --repair" to clean up the mess.')
+            else:
+                logger.warning('Aborted.')
+            return self.exit_code
+
         stats_logger = logging.getLogger('borg.output.stats')
         if args.stats:
             log_multi(DASHES, STATS_HEADER, logger=stats_logger)
@@ -845,7 +865,7 @@ def _delete_archives(self, args, repository):
                 if args.stats:
                     log_multi(stats.summary.format(label='Deleted data:', stats=stats),
                               DASHES, logger=stats_logger)
-                if not args.forced and self.exit_code:
+                if args.forced == 0 and self.exit_code:
                     break
             if args.stats:
                 stats_logger.info(str(cache))
@@ -2383,8 +2403,9 @@ def process_epilog(epilog):
                                action='store_true', default=False,
                                help='delete only the local cache for the given repository')
         subparser.add_argument('--force', dest='forced',
-                               action='store_true', default=False,
-                               help='force deletion of corrupted archives')
+                               action='count', default=0,
+                               help='force deletion of corrupted archives, '
+                                    'use --force --force in case --force does not work.')
         subparser.add_argument('--save-space', dest='save_space', action='store_true',
                                default=False,
                                help='work slower, but using less space')

Traceback when attempting to delete a corrupted .checkpoint archive
After upgrading to 1.0.9, I noticed the daily backup on one of the machines failed. I'm not sure 1.0.9 is the culprit here however, it may have just let me know about the corrupted archive since it looks like it rebuilt the indexes.

When attempting the delete the corrupted archive, I receive the following traceback, even when using --force. Any ideas?

```
Error: Did not get expected metadata dict - archive corrupted!
Local Exception.
Traceback (most recent call last):
  File "borg/archiver.py", line 2052, in main
  File "borg/archiver.py", line 1997, in run
  File "borg/archiver.py", line 90, in wrapper
  File "borg/archiver.py", line 498, in do_delete
  File "borg/cache.py", line 97, in __init__
  File "borg/cache.py", line 391, in sync
  File "borg/cache.py", line 358, in create_master_idx
  File "borg/cache.py", line 315, in fetch_and_build_idx
  File "msgpack/_unpacker.pyx", line 469, in msgpack._unpacker.Unpacker.__next__ (msgpack/_unpacker.cpp:5459)
  File "msgpack/_unpacker.pyx", line 400, in msgpack._unpacker.Unpacker._unpack (msgpack/_unpacker.cpp:4483)
TypeError: unhashable type: 'dict'

Platform: Linux machinename 2.6.32-642.11.1.el6.i686 #1 SMP Fri Nov 18 18:48:28 UTC 2016 i686 i686
Linux: CentOS 6.8 Final
Borg: 1.0.9  Python: CPython 3.5.2
PID: 15290  CWD: /usr/local/bin
sys.argv: ['/usr/local/bin/borg', 'delete', 'user@machine:/location::machine_2016-07-18-23:45:02.checkpoint']
SSH_ORIGINAL_COMMAND: None
```

---

:moneybag: [there is a bounty for this](https://www.bountysource.com/issues/40319126-traceback-when-attempting-to-delete-a-corrupted-checkpoint-archive)
diff --git a/src/borg/testsuite/archiver.py b/src/borg/testsuite/archiver.py
index cce0c92f..d13dee4c 100644
--- a/src/borg/testsuite/archiver.py
+++ b/src/borg/testsuite/archiver.py
@@ -1166,6 +1166,20 @@ def test_delete_repo(self):
         # Make sure the repo is gone
         self.assertFalse(os.path.exists(self.repository_path))
 
+    def test_delete_double_force(self):
+        self.cmd('init', '--encryption=none', self.repository_location)
+        self.create_src_archive('test')
+        with Repository(self.repository_path, exclusive=True) as repository:
+            manifest, key = Manifest.load(repository)
+            archive = Archive(repository, key, manifest, 'test')
+            id = archive.metadata.items[0]
+            repository.put(id, b'corrupted items metadata stream chunk')
+            repository.commit()
+        self.cmd('delete', '--force', '--force', self.repository_location + '::test')
+        self.cmd('check', '--repair', self.repository_location)
+        output = self.cmd('list', self.repository_location)
+        self.assert_not_in('test', output)
+
     def test_corrupted_repository(self):
         self.cmd('init', '--encryption=repokey', self.repository_location)
         self.create_src_archive('test')

pip install -e .[fuse]
parse_log_pytest
requirements.txt
pytest pytest-xdist pytest-cov pytest-benchmark
apt-get update apt-get install -y gcc python3-dev libssl-dev libacl1-dev liblz4-dev libfuse-dev fuse pkg-config
3.9
requirements.d/development.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/borgbackup/borg.git@4862efe718797e9fff6ca0dbfa24e8af8491be09#egg=borgbackup
cachetools==5.5.2
chardet==5.2.0
colorama==0.4.6
coverage==7.8.0
Cython==3.0.12
distlib==0.3.9
exceptiongroup==1.2.2
execnet==2.1.1
filelock==3.18.0
iniconfig==2.1.0
llfuse==1.5.1
msgpack-python==0.5.6
packaging==24.2
platformdirs==4.3.7
pluggy==1.5.0
py-cpuinfo==9.0.0
pyproject-api==1.9.0
pytest==8.3.5
pytest-benchmark==5.1.0
pytest-cov==6.0.0
pytest-xdist==3.6.1
tomli==2.2.1
tox==4.25.0
typing_extensions==4.13.0
virtualenv==20.29.3

name: borg
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - cachetools==5.5.2
      - chardet==5.2.0
      - colorama==0.4.6
      - coverage==7.8.0
      - cython==3.0.12
      - distlib==0.3.9
      - exceptiongroup==1.2.2
      - execnet==2.1.1
      - filelock==3.18.0
      - iniconfig==2.1.0
      - llfuse==1.5.1
      - msgpack-python==0.5.6
      - packaging==24.2
      - platformdirs==4.3.7
      - pluggy==1.5.0
      - py-cpuinfo==9.0.0
      - pyproject-api==1.9.0
      - pytest==8.3.5
      - pytest-benchmark==5.1.0
      - pytest-cov==6.0.0
      - pytest-xdist==3.6.1
      - tomli==2.2.1
      - tox==4.25.0
      - typing-extensions==4.13.0
      - virtualenv==20.29.3
prefix: /opt/conda/envs/borg

src/borg/testsuite/archiver.py::ArchiverTestCase::test_delete_double_force src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_delete_double_force
src/borg/testsuite/archiver.py::test_return_codes[python] src/borg/testsuite/archiver.py::ArchiverTestCase::test_aes_counter_uniqueness_keyfile src/borg/testsuite/archiver.py::ArchiverTestCase::test_aes_counter_uniqueness_passphrase src/borg/testsuite/archiver.py::ArchiverTestCase::test_atime src/borg/testsuite/archiver.py::ArchiverTestCase::test_bad_filters src/borg/testsuite/archiver.py::ArchiverTestCase::test_basic_functionality src/borg/testsuite/archiver.py::ArchiverTestCase::test_break_lock src/borg/testsuite/archiver.py::ArchiverTestCase::test_change_passphrase src/borg/testsuite/archiver.py::ArchiverTestCase::test_check_cache src/borg/testsuite/archiver.py::ArchiverTestCase::test_comment src/borg/testsuite/archiver.py::ArchiverTestCase::test_compression_auto_compressible src/borg/testsuite/archiver.py::ArchiverTestCase::test_compression_auto_uncompressible src/borg/testsuite/archiver.py::ArchiverTestCase::test_compression_lz4_compressible src/borg/testsuite/archiver.py::ArchiverTestCase::test_compression_lzma_compressible src/borg/testsuite/archiver.py::ArchiverTestCase::test_compression_none_compressible src/borg/testsuite/archiver.py::ArchiverTestCase::test_compression_none_uncompressible src/borg/testsuite/archiver.py::ArchiverTestCase::test_compression_zlib_compressible src/borg/testsuite/archiver.py::ArchiverTestCase::test_corrupted_repository src/borg/testsuite/archiver.py::ArchiverTestCase::test_create_dry_run src/borg/testsuite/archiver.py::ArchiverTestCase::test_create_pattern src/borg/testsuite/archiver.py::ArchiverTestCase::test_create_pattern_root src/borg/testsuite/archiver.py::ArchiverTestCase::test_create_read_special_broken_symlink src/borg/testsuite/archiver.py::ArchiverTestCase::test_create_topical src/borg/testsuite/archiver.py::ArchiverTestCase::test_create_without_root src/borg/testsuite/archiver.py::ArchiverTestCase::test_debug_dump_archive src/borg/testsuite/archiver.py::ArchiverTestCase::test_debug_dump_archive_items src/borg/testsuite/archiver.py::ArchiverTestCase::test_debug_dump_manifest src/borg/testsuite/archiver.py::ArchiverTestCase::test_debug_dump_repo_objs src/borg/testsuite/archiver.py::ArchiverTestCase::test_debug_put_get_delete_obj src/borg/testsuite/archiver.py::ArchiverTestCase::test_delete src/borg/testsuite/archiver.py::ArchiverTestCase::test_delete_repo src/borg/testsuite/archiver.py::ArchiverTestCase::test_exclude_caches src/borg/testsuite/archiver.py::ArchiverTestCase::test_exclude_keep_tagged src/borg/testsuite/archiver.py::ArchiverTestCase::test_exclude_keep_tagged_deprecation src/borg/testsuite/archiver.py::ArchiverTestCase::test_exclude_normalization src/borg/testsuite/archiver.py::ArchiverTestCase::test_exclude_tagged src/borg/testsuite/archiver.py::ArchiverTestCase::test_extract_hardlinks src/borg/testsuite/archiver.py::ArchiverTestCase::test_extract_include_exclude src/borg/testsuite/archiver.py::ArchiverTestCase::test_extract_include_exclude_regex src/borg/testsuite/archiver.py::ArchiverTestCase::test_extract_include_exclude_regex_from_file src/borg/testsuite/archiver.py::ArchiverTestCase::test_extract_list_output src/borg/testsuite/archiver.py::ArchiverTestCase::test_extract_pattern_opt src/borg/testsuite/archiver.py::ArchiverTestCase::test_extract_progress src/borg/testsuite/archiver.py::ArchiverTestCase::test_extract_with_pattern src/borg/testsuite/archiver.py::ArchiverTestCase::test_file_status src/borg/testsuite/archiver.py::ArchiverTestCase::test_file_status_excluded src/borg/testsuite/archiver.py::ArchiverTestCase::test_fuse src/borg/testsuite/archiver.py::ArchiverTestCase::test_fuse_allow_damaged_files src/borg/testsuite/archiver.py::ArchiverTestCase::test_fuse_mount_options src/borg/testsuite/archiver.py::ArchiverTestCase::test_fuse_versions_view src/borg/testsuite/archiver.py::ArchiverTestCase::test_info src/borg/testsuite/archiver.py::ArchiverTestCase::test_key_export_keyfile src/borg/testsuite/archiver.py::ArchiverTestCase::test_key_export_paperkey src/borg/testsuite/archiver.py::ArchiverTestCase::test_key_export_qr src/borg/testsuite/archiver.py::ArchiverTestCase::test_key_export_repokey src/borg/testsuite/archiver.py::ArchiverTestCase::test_key_import_errors src/borg/testsuite/archiver.py::ArchiverTestCase::test_list_chunk_counts src/borg/testsuite/archiver.py::ArchiverTestCase::test_list_format src/borg/testsuite/archiver.py::ArchiverTestCase::test_list_hash src/borg/testsuite/archiver.py::ArchiverTestCase::test_list_prefix src/borg/testsuite/archiver.py::ArchiverTestCase::test_list_repository_format src/borg/testsuite/archiver.py::ArchiverTestCase::test_list_size src/borg/testsuite/archiver.py::ArchiverTestCase::test_overwrite src/borg/testsuite/archiver.py::ArchiverTestCase::test_path_normalization src/borg/testsuite/archiver.py::ArchiverTestCase::test_progress_off src/borg/testsuite/archiver.py::ArchiverTestCase::test_progress_on src/borg/testsuite/archiver.py::ArchiverTestCase::test_prune_repository src/borg/testsuite/archiver.py::ArchiverTestCase::test_prune_repository_prefix src/borg/testsuite/archiver.py::ArchiverTestCase::test_prune_repository_save_space src/borg/testsuite/archiver.py::ArchiverTestCase::test_recreate_basic src/borg/testsuite/archiver.py::ArchiverTestCase::test_recreate_dry_run src/borg/testsuite/archiver.py::ArchiverTestCase::test_recreate_exclude_caches src/borg/testsuite/archiver.py::ArchiverTestCase::test_recreate_exclude_keep_tagged src/borg/testsuite/archiver.py::ArchiverTestCase::test_recreate_exclude_tagged src/borg/testsuite/archiver.py::ArchiverTestCase::test_recreate_list_output src/borg/testsuite/archiver.py::ArchiverTestCase::test_recreate_rechunkify src/borg/testsuite/archiver.py::ArchiverTestCase::test_recreate_recompress src/borg/testsuite/archiver.py::ArchiverTestCase::test_recreate_skips_nothing_to_do src/borg/testsuite/archiver.py::ArchiverTestCase::test_recreate_subtree_hardlinks src/borg/testsuite/archiver.py::ArchiverTestCase::test_recreate_target src/borg/testsuite/archiver.py::ArchiverTestCase::test_recreate_target_rc src/borg/testsuite/archiver.py::ArchiverTestCase::test_rename src/borg/testsuite/archiver.py::ArchiverTestCase::test_repeated_files src/borg/testsuite/archiver.py::ArchiverTestCase::test_repository_move src/borg/testsuite/archiver.py::ArchiverTestCase::test_repository_swap_detection src/borg/testsuite/archiver.py::ArchiverTestCase::test_repository_swap_detection2 src/borg/testsuite/archiver.py::ArchiverTestCase::test_repository_swap_detection2_no_cache src/borg/testsuite/archiver.py::ArchiverTestCase::test_repository_swap_detection_no_cache src/borg/testsuite/archiver.py::ArchiverTestCase::test_security_dir_compat src/borg/testsuite/archiver.py::ArchiverTestCase::test_sparse_file src/borg/testsuite/archiver.py::ArchiverTestCase::test_strip_components src/borg/testsuite/archiver.py::ArchiverTestCase::test_strip_components_links src/borg/testsuite/archiver.py::ArchiverTestCase::test_symlink_extract src/borg/testsuite/archiver.py::ArchiverTestCase::test_umask src/borg/testsuite/archiver.py::ArchiverTestCase::test_unix_socket src/borg/testsuite/archiver.py::ArchiverTestCase::test_unusual_filenames src/borg/testsuite/archiver.py::ArchiverTestCase::test_with_lock src/borg/testsuite/archiver.py::ArchiverCheckTestCase::test_attic013_acl_bug src/borg/testsuite/archiver.py::ArchiverCheckTestCase::test_check_usage src/borg/testsuite/archiver.py::ArchiverCheckTestCase::test_corrupted_manifest src/borg/testsuite/archiver.py::ArchiverCheckTestCase::test_empty_repository src/borg/testsuite/archiver.py::ArchiverCheckTestCase::test_extra_chunks src/borg/testsuite/archiver.py::ArchiverCheckTestCase::test_manifest_rebuild_corrupted_chunk src/borg/testsuite/archiver.py::ArchiverCheckTestCase::test_manifest_rebuild_duplicate_archive src/borg/testsuite/archiver.py::ArchiverCheckTestCase::test_missing_archive_item_chunk src/borg/testsuite/archiver.py::ArchiverCheckTestCase::test_missing_archive_metadata src/borg/testsuite/archiver.py::ArchiverCheckTestCase::test_missing_file_chunk src/borg/testsuite/archiver.py::ArchiverCheckTestCase::test_missing_manifest src/borg/testsuite/archiver.py::ArchiverCheckTestCase::test_verify_data src/borg/testsuite/archiver.py::ArchiverCheckTestCase::test_verify_data_unencrypted src/borg/testsuite/archiver.py::ManifestAuthenticationTest::test_disable src/borg/testsuite/archiver.py::ManifestAuthenticationTest::test_disable2 src/borg/testsuite/archiver.py::ManifestAuthenticationTest::test_fresh_init_tam_required src/borg/testsuite/archiver.py::ManifestAuthenticationTest::test_not_required src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_aes_counter_uniqueness_keyfile src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_aes_counter_uniqueness_passphrase src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_atime src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_bad_filters src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_basic_functionality src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_break_lock src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_change_passphrase src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_check_cache src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_comment src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_compression_auto_compressible src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_compression_auto_uncompressible src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_compression_lz4_compressible src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_compression_lz4_uncompressible src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_compression_lzma_compressible src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_compression_lzma_uncompressible src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_compression_none_compressible src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_compression_none_uncompressible src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_compression_zlib_compressible src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_compression_zlib_uncompressible src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_corrupted_repository src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_create_dry_run src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_create_pattern src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_create_pattern_root src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_create_read_special_broken_symlink src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_create_topical src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_create_without_root src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_debug_dump_archive src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_debug_dump_archive_items src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_debug_dump_manifest src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_debug_dump_repo_objs src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_delete src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_delete_repo src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_exclude_caches src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_exclude_keep_tagged src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_exclude_keep_tagged_deprecation src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_exclude_normalization src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_exclude_tagged src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_extract_hardlinks src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_extract_include_exclude src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_extract_include_exclude_regex src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_extract_include_exclude_regex_from_file src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_extract_list_output src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_extract_pattern_opt src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_extract_progress src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_extract_with_pattern src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_file_status src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_file_status_excluded src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_fuse src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_fuse_allow_damaged_files src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_fuse_mount_options src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_fuse_versions_view src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_info src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_key_export_keyfile src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_key_export_paperkey src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_key_export_qr src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_key_export_repokey src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_key_import_errors src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_list_chunk_counts src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_list_format src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_list_hash src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_list_prefix src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_list_repository_format src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_list_size src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_overwrite src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_path_normalization src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_progress_off src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_progress_on src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_prune_repository src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_prune_repository_prefix src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_prune_repository_save_space src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_recreate_basic src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_recreate_dry_run src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_recreate_exclude_caches src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_recreate_exclude_keep_tagged src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_recreate_exclude_tagged src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_recreate_list_output src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_recreate_rechunkify src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_recreate_recompress src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_recreate_skips_nothing_to_do src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_recreate_subtree_hardlinks src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_recreate_target src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_recreate_target_rc src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_remote_repo_restrict_to_path src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_rename src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_repeated_files src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_repository_move src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_repository_swap_detection src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_repository_swap_detection2 src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_repository_swap_detection2_no_cache src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_repository_swap_detection_no_cache src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_security_dir_compat src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_sparse_file src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_strip_components src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_strip_components_doesnt_leak src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_strip_components_links src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_symlink_extract src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_umask src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_unix_socket src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_unusual_filenames src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_with_lock src/borg/testsuite/archiver.py::DiffArchiverTestCase::test_basic_functionality src/borg/testsuite/archiver.py::DiffArchiverTestCase::test_sort_option
src/borg/testsuite/archiver.py::ArchiverTestCase::test_compression_lz4_uncompressible src/borg/testsuite/archiver.py::ArchiverTestCase::test_compression_lzma_uncompressible src/borg/testsuite/archiver.py::ArchiverTestCase::test_compression_zlib_uncompressible src/borg/testsuite/archiver.py::ArchiverTestCase::test_help src/borg/testsuite/archiver.py::ArchiverTestCase::test_init_interrupt src/borg/testsuite/archiver.py::ArchiverTestCase::test_init_requires_encryption_option src/borg/testsuite/archiver.py::ArchiverTestCase::test_unknown_unencrypted src/borg/testsuite/archiver.py::ArchiverTestCase::test_usage src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_help src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_init_interrupt src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_init_requires_encryption_option src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_unknown_unencrypted src/borg/testsuite/archiver.py::RemoteArchiverTestCase::test_usage src/borg/testsuite/archiver.py::test_get_args src/borg/testsuite/archiver.py::test_compare_chunk_contents src/borg/testsuite/archiver.py::TestBuildFilter::test_basic src/borg/testsuite/archiver.py::TestBuildFilter::test_empty src/borg/testsuite/archiver.py::TestBuildFilter::test_strip_components
src/borg/archive.py src/borg/archiver.py
src/borg/archive.py src/borg/archiver.py