This is on RHEL
(venv) myuser@vscode-btp-dev-01:~/volto> pipx run cookieplone volto-project
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /usr/lib64/python3.11/shutil.py:665 in _rmtree_safe_fd │
│ │
│ 662 │ │ │ │ │ continue │
│ 663 │ │ if is_dir: │
│ 664 │ │ │ try: │
│ ❱ 665 │ │ │ │ dirfd = os.open(entry.name, os.O_RDONLY | os.O_NONBLOCK, dir_fd=topfd) │
│ 666 │ │ │ │ dirfd_closed = False │
│ 667 │ │ │ except OSError: │
│ 668 │ │ │ │ onerror(os.open, fullname, sys.exc_info()) │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ entries = [<DirEntry 'pack'>, <DirEntry 'info'>] │ │
│ │ entry = <DirEntry 'pack'> │ │
│ │ fullname = '/home/myuser/.cookiecutters/cookieplone-templates/.git/objects/pack' │ │
│ │ is_dir = True │ │
│ │ orig_st = os.stat_result(st_mode=16512, st_ino=11244477, st_dev=58, st_nlink=2, │ │
│ │ st_uid=1574, st_gid=100, st_size=4096, st_atime=1738164697, │ │
│ │ st_mtime=1738164698, st_ctime=1738165356) │ │
│ │ path = '/home/myuser/.cookiecutters/cookieplone-templates/.git/objects' │ │
│ │ scandir_it = <posix.ScandirIterator object at 0x7f7a85f03600> │ │
│ │ topfd = 5 │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
PermissionError: [Errno 13] Permission denied: 'pack'
During handling of the above exception, another exception occurred:
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /home/myuser/.cache/pipx/ff7797bb943bb34/lib64/python3.11/site-packages/cookieplone/cli.py:140 │
│ in cli │
│ │
│ 137 │ │ console.info_screen(repository=repository, passwd=passwd, tag=tag) │
│ 138 │ │ raise typer.Exit() │
│ 139 │ │
│ ❱ 140 │ repo_path = get_base_repository(repository) │
│ 141 │ if not template: │
│ 142 │ │ # Display template options │
│ 143 │ │ template = prompt_for_template(repo_path) │
│ │
│ ╭────────────────────────── locals ──────────────────────────╮ │
│ │ config_file = None │ │
│ │ debug_file = None │ │
│ │ default_config = False │ │
│ │ extra_context = None │ │
│ │ info = False │ │
│ │ keep_project_on_failure = False │ │
│ │ no_input = False │ │
│ │ output_dir = None │ │
│ │ overwrite_if_exists = False │ │
│ │ passwd = None │ │
│ │ replay = False │ │
│ │ replay_file = None │ │
│ │ repository = 'gh:plone/cookieplone-templates' │ │
│ │ skip_if_file_exists = False │ │
│ │ tag = 'main' │ │
│ │ template = 'volto-project' │ │
│ │ verbose = False │ │
│ │ version = False │ │
│ ╰────────────────────────────────────────────────────────────╯ │
│ │
│ /home/myuser/.cache/pipx/ff7797bb943bb34/lib64/python3.11/site-packages/cookieplone/repository │
│ .py:24 in get_base_repository │
│ │
│ 21 │ │ config_file=config_file, │
│ 22 │ │ default_config=default_config, │
│ 23 │ ) │
│ ❱ 24 │ base_repo_dir, _ = determine_repo_dir( │
│ 25 │ │ template=repository, │
│ 26 │ │ abbreviations=config_dict["abbreviations"], │
│ 27 │ │ clone_to_dir=config_dict["cookiecutters_dir"], │
│ │
│ ╭────────────────────────────────── locals ───────────────────────────────────╮ │
│ │ config_dict = { │ │
│ │ │ 'cookiecutters_dir': '/home/myuser/.cookiecutters/', │ │
│ │ │ 'replay_dir': '/home/myuser/.cookiecutter_replay/', │ │
│ │ │ 'default_context': OrderedDict(), │ │
│ │ │ 'abbreviations': { │ │
│ │ │ │ 'gh': 'https://github.com/{0}.git', │ │
│ │ │ │ 'gl': 'https://gitlab.com/{0}.git', │ │
│ │ │ │ 'bb': 'https://bitbucket.org/{0}' │ │
│ │ │ } │ │
│ │ } │ │
│ │ config_file = None │ │
│ │ default_config = False │ │
│ │ password = '' │ │
│ │ repository = 'gh:plone/cookieplone-templates' │ │
│ │ tag = None │ │
│ ╰─────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/myuser/.cache/pipx/ff7797bb943bb34/lib64/python3.11/site-packages/cookiecutter/repositor │
│ y.py:108 in determine_repo_dir │
│ │
│ 105 │ │ repository_candidates = [unzipped_dir] │
│ 106 │ │ cleanup = True │
│ 107 │ elif is_repo_url(template): │
│ ❱ 108 │ │ cloned_repo = clone( │
│ 109 │ │ │ repo_url=template, │
│ 110 │ │ │ checkout=checkout, │
│ 111 │ │ │ clone_to_dir=clone_to_dir, │
│ │
│ ╭─────────────────────────────── locals ───────────────────────────────╮ │
│ │ abbreviations = { │ │
│ │ │ 'gh': 'https://github.com/{0}.git', │ │
│ │ │ 'gl': 'https://gitlab.com/{0}.git', │ │
│ │ │ 'bb': 'https://bitbucket.org/{0}' │ │
│ │ } │ │
│ │ checkout = None │ │
│ │ clone_to_dir = '/home/myuser/.cookiecutters/' │ │
│ │ directory = '' │ │
│ │ no_input = True │ │
│ │ password = '' │ │
│ │ template = 'https://github.com/plone/cookieplone-templates.git' │ │
│ ╰──────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/myuser/.cache/pipx/ff7797bb943bb34/lib64/python3.11/site-packages/cookiecutter/vcs.py:99 │
│ in clone │
│ │
│ 96 │ logger.debug(f'repo_dir is {repo_dir}') │
│ 97 │ │
│ 98 │ if os.path.isdir(repo_dir): │
│ ❱ 99 │ │ clone = prompt_and_delete(repo_dir, no_input=no_input) │
│ 100 │ else: │
│ 101 │ │ clone = True │
│ 102 │
│ │
│ ╭─────────────────────────────── locals ───────────────────────────────╮ │
│ │ checkout = None │ │
│ │ clone_to_dir = PosixPath('/home/myuser/.cookiecutters') │ │
│ │ no_input = True │ │
│ │ repo_dir = '/home/myuser/.cookiecutters/cookieplone-templates' │ │
│ │ repo_name = 'cookieplone-templates' │ │
│ │ repo_type = 'git' │ │
│ │ repo_url = 'https://github.com/plone/cookieplone-templates.git' │ │
│ ╰──────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/myuser/.cache/pipx/ff7797bb943bb34/lib64/python3.11/site-packages/cookiecutter/prompt.py │
│ :401 in prompt_and_delete │
│ │
│ 398 │ │
│ 399 │ if ok_to_delete: │
│ 400 │ │ if os.path.isdir(path): │
│ ❱ 401 │ │ │ rmtree(path) │
│ 402 │ │ else: │
│ 403 │ │ │ os.remove(path) │
│ 404 │ │ return True │
│ │
│ ╭─────────────────────────────── locals ───────────────────────────────╮ │
│ │ no_input = True │ │
│ │ ok_to_delete = True │ │
│ │ path = '/home/myuser/.cookiecutters/cookieplone-templates' │ │
│ ╰──────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/myuser/.cache/pipx/ff7797bb943bb34/lib64/python3.11/site-packages/cookiecutter/utils.py: │
│ 34 in rmtree │
│ │
│ 31 │ │
│ 32 │ :param path: A directory path. │
│ 33 │ """ │
│ ❱ 34 │ shutil.rmtree(path, onerror=force_delete) │
│ 35 │
│ 36 │
│ 37 def make_sure_path_exists(path: "os.PathLike[str]") -> None: │
│ │
│ ╭─────────────────────────── locals ───────────────────────────╮ │
│ │ path = '/home/myuser/.cookiecutters/cookieplone-templates' │ │
│ ╰──────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/lib64/python3.11/shutil.py:752 in rmtree │
│ │
│ 749 │ │ │ return │
│ 750 │ │ try: │
│ 751 │ │ │ if os.path.samestat(orig_st, os.fstat(fd)): │
│ ❱ 752 │ │ │ │ _rmtree_safe_fd(fd, path, onerror) │
│ 753 │ │ │ │ try: │
│ 754 │ │ │ │ │ os.close(fd) │
│ 755 │ │ │ │ except OSError: │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ dir_fd = None │ │
│ │ fd = 3 │ │
│ │ fd_closed = False │ │
│ │ ignore_errors = False │ │
│ │ orig_st = os.stat_result(st_mode=16877, st_ino=11243965, st_dev=58, st_nlink=12, │ │
│ │ st_uid=1574, st_gid=100, st_size=4096, st_atime=1738164698, │ │
│ │ st_mtime=1738164697, st_ctime=1738164697) │ │
│ │ path = '/home/myuser/.cookiecutters/cookieplone-templates' │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/lib64/python3.11/shutil.py:672 in _rmtree_safe_fd │
│ │
│ 669 │ │ │ else: │
│ 670 │ │ │ │ try: │
│ 671 │ │ │ │ │ if os.path.samestat(orig_st, os.fstat(dirfd)): │
│ ❱ 672 │ │ │ │ │ │ _rmtree_safe_fd(dirfd, fullname, onerror) │
│ 673 │ │ │ │ │ │ try: │
│ 674 │ │ │ │ │ │ │ os.close(dirfd) │
│ 675 │ │ │ │ │ │ except OSError: │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ dirfd = 4 │ │
│ │ dirfd_closed = False │ │
│ │ entries = [ │ │
│ │ │ <DirEntry '.git'>, │ │
│ │ │ <DirEntry '.editorconfig'>, │ │
│ │ │ <DirEntry '.github'>, │ │
│ │ │ <DirEntry '.gitignore'>, │ │
│ │ │ <DirEntry '.reports'>, │ │
│ │ │ <DirEntry '.scripts'>, │ │
│ │ │ <DirEntry 'LICENSE'>, │ │
│ │ │ <DirEntry 'Makefile'>, │ │
│ │ │ <DirEntry 'README.md'>, │ │
│ │ │ <DirEntry 'backend_addon'>, │ │
│ │ │ ... +8 │ │
│ │ ] │ │
│ │ entry = <DirEntry '.git'> │ │
│ │ fullname = '/home/myuser/.cookiecutters/cookieplone-templates/.git' │ │
│ │ is_dir = True │ │
│ │ orig_st = os.stat_result(st_mode=16877, st_ino=11244042, st_dev=58, st_nlink=4, │ │
│ │ st_uid=1574, st_gid=100, st_size=4096, st_atime=1738164915, │ │
│ │ st_mtime=1738164698, st_ctime=1738164698) │ │
│ │ path = '/home/myuser/.cookiecutters/cookieplone-templates' │ │
│ │ scandir_it = <posix.ScandirIterator object at 0x7f7a85f03440> │ │
│ │ topfd = 3 │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/lib64/python3.11/shutil.py:672 in _rmtree_safe_fd │
│ │
│ 669 │ │ │ else: │
│ 670 │ │ │ │ try: │
│ 671 │ │ │ │ │ if os.path.samestat(orig_st, os.fstat(dirfd)): │
│ ❱ 672 │ │ │ │ │ │ _rmtree_safe_fd(dirfd, fullname, onerror) │
│ 673 │ │ │ │ │ │ try: │
│ 674 │ │ │ │ │ │ │ os.close(dirfd) │
│ 675 │ │ │ │ │ │ except OSError: │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ dirfd = 5 │ │
│ │ dirfd_closed = False │ │
│ │ entries = [ │ │
│ │ │ <DirEntry 'objects'>, │ │
│ │ │ <DirEntry 'HEAD'>, │ │
│ │ │ <DirEntry 'config'>, │ │
│ │ │ <DirEntry 'logs'>, │ │
│ │ │ <DirEntry 'packed-refs'>, │ │
│ │ │ <DirEntry 'index'> │ │
│ │ ] │ │
│ │ entry = <DirEntry 'objects'> │ │
│ │ fullname = '/home/myuser/.cookiecutters/cookieplone-templates/.git/objects' │ │
│ │ is_dir = True │ │
│ │ orig_st = os.stat_result(st_mode=16877, st_ino=11244471, st_dev=58, st_nlink=4, │ │
│ │ st_uid=1574, st_gid=100, st_size=4096, st_atime=1738164698, │ │
│ │ st_mtime=1738164696, st_ctime=1738164696) │ │
│ │ path = '/home/myuser/.cookiecutters/cookieplone-templates/.git' │ │
│ │ scandir_it = <posix.ScandirIterator object at 0x7f7a85f03590> │ │
│ │ topfd = 4 │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /usr/lib64/python3.11/shutil.py:668 in _rmtree_safe_fd │
│ │
│ 665 │ │ │ │ dirfd = os.open(entry.name, os.O_RDONLY | os.O_NONBLOCK, dir_fd=topfd) │
│ 666 │ │ │ │ dirfd_closed = False │
│ 667 │ │ │ except OSError: │
│ ❱ 668 │ │ │ │ onerror(os.open, fullname, sys.exc_info()) │
│ 669 │ │ │ else: │
│ 670 │ │ │ │ try: │
│ 671 │ │ │ │ │ if os.path.samestat(orig_st, os.fstat(dirfd)): │
│ │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ entries = [<DirEntry 'pack'>, <DirEntry 'info'>] │ │
│ │ entry = <DirEntry 'pack'> │ │
│ │ fullname = '/home/myuser/.cookiecutters/cookieplone-templates/.git/objects/pack' │ │
│ │ is_dir = True │ │
│ │ orig_st = os.stat_result(st_mode=16512, st_ino=11244477, st_dev=58, st_nlink=2, │ │
│ │ st_uid=1574, st_gid=100, st_size=4096, st_atime=1738164697, │ │
│ │ st_mtime=1738164698, st_ctime=1738165356) │ │
│ │ path = '/home/myuser/.cookiecutters/cookieplone-templates/.git/objects' │ │
│ │ scandir_it = <posix.ScandirIterator object at 0x7f7a85f03600> │ │
│ │ topfd = 5 │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /home/myuser/.cache/pipx/ff7797bb943bb34/lib64/python3.11/site-packages/cookiecutter/utils.py: │
│ 26 in force_delete │
│ │
│ 23 │ From https://docs.python.org/3/library/shutil.html#rmtree-example │
│ 24 │ """ │
│ 25 │ os.chmod(path, stat.S_IWRITE) │
│ ❱ 26 │ func(path) │
│ 27 │
│ 28 │
│ 29 def rmtree(path): │
│ │
│ ╭────────────────────────────────────── locals ──────────────────────────────────────╮ │
│ │ exc_info = ( │ │
│ │ │ <class 'PermissionError'>, │ │
│ │ │ PermissionError(13, 'Permission denied'), │ │
│ │ │ <traceback object at 0x7f7a85d82840> │ │
│ │ ) │ │
│ │ func = <built-in function open> │ │
│ │ path = '/home/myuser/.cookiecutters/cookieplone-templates/.git/objects/pack' │ │
│ ╰────────────────────────────────────────────────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
TypeError: open() missing required argument 'flags' (pos 2)
I tried deleting ~/.cookiecutters to force it to rebuild, but I get the same error.