py3: update the remaining shebang lines (mostly tests) to `python3`
I noticed this when running `py hghave` on a system that still has Python2- the
Windows launcher attempts to honor the version of python in the shebang, but
`hghave` recently gained py3 type annotations, so that resulted in a
SyntaxError. I guess CI has the compat shim installed to redirect `python` to
`python3`, and maybe that's why nobody noticed.
These were located by grepping for `#!.+python\b`. The remaining handful of
cases are tests trying to find python files, which is fine as-is.
The one thing to call out here is that apparently the RPM building hasn't worked
with Python3 (or we've been getting lucky). `contrib/hg-ssh` has had a python3
shebang line since late 2020, which means the EOL anchor would have caused it to
not match and not be replaced with `%{pythonexe}`. OTOH, it looks like that
variable was used prior to the `hg-ssh` update in order to default to python3
(as opposed to using a specific /path/to/pythonX), and maybe the update to
`hg-ssh` simply broke python2 builds. I'm not going to worry about this for
now, since there are also direct calls to `setup.py`, which no longer work as of
this release cycle. Somebody interested in RPMs can figure out all of the
issues at once.
#!/usr/bin/env python3
"""
Tests the behavior of filelog w.r.t. data starting with '\1\n'
"""
from mercurial.node import hex
from mercurial import (
hg,
ui as uimod,
)
myui = uimod.ui.load()
repo = hg.repository(myui, path=b'.', create=True)
fl = repo.file(b'foobar')
def addrev(text, renamed=False):
if renamed:
# data doesn't matter. Just make sure filelog.renamed() returns True
meta = {b'copyrev': hex(repo.nullid), b'copy': b'bar'}
else:
meta = {}
lock = t = None
try:
lock = repo.lock()
t = repo.transaction(b'commit')
node = fl.add(text, meta, t, 0, repo.nullid, repo.nullid)
return node
finally:
if t:
t.close()
if lock:
lock.release()
def error(text):
print('ERROR: ' + text)
textwith = b'\1\nfoo'
without = b'foo'
node = addrev(textwith)
if not textwith == fl.read(node):
error('filelog.read for data starting with \\1\\n')
if fl.cmp(node, textwith) or not fl.cmp(node, without):
error('filelog.cmp for data starting with \\1\\n')
if fl.size(0) != len(textwith):
error(
'FIXME: This is a known failure of filelog.size for data starting '
'with \\1\\n'
)
node = addrev(textwith, renamed=True)
if not textwith == fl.read(node):
error('filelog.read for a renaming + data starting with \\1\\n')
if fl.cmp(node, textwith) or not fl.cmp(node, without):
error('filelog.cmp for a renaming + data starting with \\1\\n')
if fl.size(1) != len(textwith):
error('filelog.size for a renaming + data starting with \\1\\n')
print('OK.')