The issue here can be demonstrated by running the following script on Windows:
import mako.cmd
import sys
with open("template_file", "w") as f:
print("Line 1", file=f)
print("Line 2", file=f)
print("Line 3", file=f)
sys.argv.append("--output-file")
sys.argv.append("rendered_file")
sys.argv.append("template_file")
assert sys.argv[1:] == ["--output-file", "rendered_file", "template_file"]
# pass sys.argv off to mako
mako.cmd.cmdline()
# awkward \r\r\n EOL sequences is what is written to disk
with open("rendered_file", "rb") as f:
rendered = f.read()
assert rendered == b'Line 1\r\r\nLine 2\r\r\nLine 3\r\r\n'
# If you were to open/read in text mode it shows up as two newlines
with open("rendered_file", "rt") as f:
rendered = f.read()
assert rendered == 'Line 1\n\nLine 2\n\nLine 3\n\n'
It's odd that read_file() in util.py opens / reads in binary mode but then cmdline() in cmd.py opens / writes in text mode. The whole point of using text mode should be to convert EOLs on Windows, but it does not do this correctly.