Skip to content

Should borg-2 error on repo-delete if the top-level can't be deleted? #9037

@cr1901

Description

@cr1901

Consider the following directory layout, where I own a directory wjones-2, but cannot delete/create files/directories in its parent:

william@xubuntu-dtrain:/shares/borg/v2-testing$ ls -ld . wjones-2
drwxr-xr-x 5 root    root    5 Oct  3 16:53 .
drwxr-xr-x 2 william william 2 Oct  3 16:54 wjones-2

As of commit 0ee5d6f, I can create a repository just fine:

william@xubuntu-dtrain:/shares/borg/v2-testing$ borg-2 repo-create -r wjones-2 -e none

Reserve some repository storage space now for emergencies like 'disk full'
by running:
    borg repo-space --reserve 1G

OTOH, I cannot delete said repository without the final rmdir for the top-level repo dir failing, due to not having permissions in the parent:

william@xubuntu-dtrain:/shares/borg/v2-testing$ borg-2 repo-delete -r wjones-2
You requested to DELETE the following repository completely *including* 0 archives it contains:
------------------------------------------------------------------------------
Repository ID: 850879baec49dd84eeabefcf4df5979eb4f5e4c9e6aa14cbceab56f25ec8fd82
Location: /shares/borg/v2-testing/wjones-2
------------------------------------------------------------------------------
Type 'YES' if you understand this and want to continue: YES
Local Exception

Error:

PermissionError: [Errno 13] Permission denied: '/shares/borg/v2-testing/wjones-2'

If reporting bugs, please include the following:

Traceback (most recent call last):
  File "/home/william/.local/pipx/venvs/borgbackup-2/lib/python3.10/site-packages/borg/archiver/__init__.py", line 647, in main
    exit_code = archiver.run(args)
  File "/home/william/.local/pipx/venvs/borgbackup-2/lib/python3.10/site-packages/borg/archiver/__init__.py", line 541, in run
    rc = func(args)
  File "/home/william/.local/pipx/venvs/borgbackup-2/lib/python3.10/site-packages/borg/archiver/_common.py", line 145, in wrapper
    return method(self, args, repository=repository, **kwargs)
  File "/home/william/.local/pipx/venvs/borgbackup-2/lib/python3.10/site-packages/borg/archiver/repo_delete_cmd.py", line 77, in do_repo_delete
    repository.destroy()
  File "/home/william/.local/pipx/venvs/borgbackup-2/lib/python3.10/site-packages/borg/repository.py", line 247, in destroy
    self.store.destroy()
  File "/home/william/.local/pipx/venvs/borgbackup-2/lib/python3.10/site-packages/borgstore/store.py", line 119, in destroy
    self.backend.destroy()
  File "/home/william/.local/pipx/venvs/borgbackup-2/lib/python3.10/site-packages/borgstore/backends/posixfs.py", line 115, in destroy
    shutil.rmtree(os.fspath(self.base_path))
  File "/usr/lib/python3.10/shutil.py", line 731, in rmtree
    onerror(os.rmdir, path, sys.exc_info())
  File "/usr/lib/python3.10/shutil.py", line 729, in rmtree
    os.rmdir(path)
PermissionError: [Errno 13] Permission denied: '/shares/borg/v2-testing/wjones-2'

Platform: Linux xubuntu-dtrain 5.15.0-134-generic #145-Ubuntu SMP Wed Feb 12 20:08:39 UTC 2025 x86_64
Linux: Unknown Linux
Borg: 2.0.0b16.dev329+g0ee5d6f01.d20250928  Python: CPython 3.10.12 msgpack: 1.1.1 fuse: pyfuse3 3.2.0 [pyfuse3,llfuse]
PID: 3508980  CWD: /shares/borg/v2-testing
sys.argv: ['/home/william/.local/bin/borg-2', 'repo-delete', '-r', 'wjones-2']
SSH_ORIGINAL_COMMAND: None

My question is: is this intentional? Since we can successfully create a repo in an existing directory, shouldn't deleting everything up to but not including the top-level be a harmless exception (caught by an except block, and not returning an error)?

(This also applies to borg v1.4.1 and can prob be backported.)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions