Invalid character in Windows template filenames
grovduck opened this issue ยท 9 comments
Great idea and really cool tutorial - thanks so much for this.
When I try to use this template on Windows using copier, I'm getting the following error:
C:\Users\gregorma\Desktop>copier gh:gahjelle/template-aoc-python foo2
Traceback (most recent call last):
File "C:\Python39\lib\runpy.py", line 197, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\Python39\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "C:\Users\gregorma\.local\bin\copier.exe\__main__.py", line 7, in <module>
File "C:\Users\gregorma\.local\pipx\venvs\copier\lib\site-packages\plumbum\cli\application.py", line 629, in run
inst, retcode = subapp.run(argv, exit=False)
File "C:\Users\gregorma\.local\pipx\venvs\copier\lib\site-packages\plumbum\cli\application.py", line 624, in run
retcode = inst.main(*tailargs)
File "C:\Users\gregorma\.local\pipx\venvs\copier\lib\site-packages\copier\cli.py", line 38, in _wrapper
return method(*args, **kwargs)
File "C:\Users\gregorma\.local\pipx\venvs\copier\lib\site-packages\copier\cli.py", line 252, in main
self.parent._copy(template_src, destination_path)
File "C:\Users\gregorma\.local\pipx\venvs\copier\lib\site-packages\copier\cli.py", line 173, in _copy
return copy(
File "C:\Users\gregorma\.local\pipx\venvs\copier\lib\site-packages\copier\main.py", line 133, in copy
conf = make_config(**locals())
File "C:\Users\gregorma\.local\pipx\venvs\copier\lib\site-packages\copier\config\factory.py", line 96, in make_config
src_path = vcs.clone(repo, vcs_ref or "HEAD")
File "C:\Users\gregorma\.local\pipx\venvs\copier\lib\site-packages\copier\vcs.py", line 92, in clone
git("checkout", ref)
File "C:\Users\gregorma\.local\pipx\venvs\copier\lib\site-packages\plumbum\commands\base.py", line 99, in __call__
return self.run(args, **kwargs)[1]
File "C:\Users\gregorma\.local\pipx\venvs\copier\lib\site-packages\plumbum\commands\base.py", line 240, in run
return p.run()
File "C:\Users\gregorma\.local\pipx\venvs\copier\lib\site-packages\plumbum\commands\base.py", line 201, in runner
return run_proc(p, retcode, timeout)
File "C:\Users\gregorma\.local\pipx\venvs\copier\lib\site-packages\plumbum\commands\processes.py", line 322, in run_proc
return _check_process(proc, retcode, timeout, stdout, stderr)
File "C:\Users\gregorma\.local\pipx\venvs\copier\lib\site-packages\plumbum\commands\processes.py", line 24, in _check_process
proc.verify(retcode, timeout, stdout, stderr)
File "C:\Users\gregorma\.local\pipx\venvs\copier\lib\site-packages\plumbum\machines\base.py", line 28, in verify
raise ProcessExecutionError(
plumbum.commands.processes.ProcessExecutionError: Unexpected exit code: 1
Command line: | 'C:\Program Files\Git\cmd\git.exe' checkout HEAD
Stderr: | error: invalid path 'src/[[year]]/[[puzzle_dir]]/aoc[[year]][['%02d'|format(day)]].py.tmpl'
| error: invalid path 'src/[[year]]/[[puzzle_dir]]/test_aoc[[year]][['%02d'|format(day)]].py.tmpl'
From what I can tell, it doesn't accept the pipe character as a valid character in a Windows filename (although I'm not totally sure of this). If I replace [['%02d'|format(day)]] with [[formatted_day]] and put an entry for [[formatted_day]] in the copier.yml file, it seems to work fine. Here's an example of that: https://github.com/grovduck/test-template.
Please let me know if I'm doing something incorrectly - it's my first time using copier!
@grovduck Thanks a lot for reporting this, and for figuring out the issue. I don't have a ton of experience with Copier myself, and I've apparently not tested it on Windows at all ๐
I have a proposed fix in #2. Are you able to run a quick check on whether it resolves the issue? You can test it by running:
C:\Users\gregorma\Desktop>copier gh:gahjelle/template-aoc-python -r bugfix/support-windows-filenames foo2
If this works as it should, I'll deploy it ASAP ๐
@gahjelle Thanks for the very quick fix. I can confirm that this command worked for me:
copier gh:gahjelle/template-aoc-python -r bugfix/support-windows-filenames foo2
I struggled for a bit to get the bash shell script to work and had to do two different things (in case this helps others).
- Using git bash, I had to activate my virtual environment using this tip from Presh Onyee. (I have
advent-of-code-dataand other packages you recommend installed in a virtualenv - I had to add a command line
-dflag forpuzzle_diras well (i.e.-d puzzle_dir=$day), otherwise I was getting a UnicodeEncodeError.
Here was the Bash script that worked for me:
for day in {01..25}; do
copier gh:gahjelle/template-aoc-python -r bugfix/support-windows-filenames -d year=2021 -d day=$day -d puzzle_name="" -d puzzle_dir=$day foo2/
done
Finally, I was able to do the same thing using PowerShell using this command:
for ($day = 1; $day -le 25; $day++) {
$day_str = "{0:00}" -f $day
copier gh:gahjelle/template-aoc-python -r bugfix/support-windows-filenames -d year=2021 -d day=$day_str -d puzzle_name="" -d puzzle_dir=$day_str foo2/
}
Thanks so much for your help. Now to actually start on the puzzles! Please feel free to close the issue.
THANK YOUUUU SOOO MUCHHH!! @grovduck
I've been stuck on this error since yesterday. True example of 'not all heroes wear capes'
Thank you again, @grovduck , I wholeheartedly agree with @psycho-baller . I have added your tips to the README as well, so that they will be easier to find for other Windows users.
Happy Advent of Coding!
@gahjelle @psycho-baller Y'all are much too kind. A tiny contribution to what @gahjelle has done here!
Hi again @gahjelle! I'm using your awesome template generator again this year, but it looks like recent pushes may have reintroduced pipe characters ("|") into these filenames which is causing issues on Windows again:
aoc{{year}}{{'%02d'|format(day)}}.py.jinja
test_aoc{{year}}{{'%02d'|format(day)}}.py.jinja.
I was able to get around it by renaming these files to:
aoc{{year}}{{'%02d' % day}}.py.jinja
test_aoc{{year}}{{'%02d' % day}}.py.jinja
Note that using '%02d'|format(day) within the files themselves causes no issues, only the filenames themselves. I haven't tested on any *nix systems, so I'll leave it to you if you want to make this change (hence, no new issue for this!)
Ah, yes, they changed the templating engine in the latest version of Copier, so I had to change the names and I forgot about pipes on windows.
I'll try to have a look at it tomorrow, I'd be happy to find something that works on all systems.
Thanks for the heads up!