##// END OF EJS Templates
posix: always seek to EOF when opening a file in append mode...
posix: always seek to EOF when opening a file in append mode Python 3 already does this, so skip it there. Consider the program: #include <stdio.h> int main() { FILE *f = fopen("narf", "w"); fprintf(f, "narf\n"); fclose(f); f = fopen("narf", "a"); printf("%ld\n", ftell(f)); fprintf(f, "troz\n"); printf("%ld\n", ftell(f)); return 0; } on macOS, FreeBSD, and Linux with glibc, this program prints 5 10 but on musl libc (Alpine Linux and probably others) this prints 0 10 By my reading of https://pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html this is technically correct, specifically: > Opening a file with append mode (a as the first character in the > mode argument) shall cause all subsequent writes to the file to be > forced to the then current end-of-file, regardless of intervening > calls to fseek(). in other words, the file position doesn't really matter in append-mode files, and we can't depend on it being at all meaningful unless we perform a seek() before tell() after open(..., 'a'). Experimentally after a .write() we can do a .tell() and it'll always be reasonable, but I'm unclear from reading the specification if that's a smart thing to rely on. This matches what we do on Windows and what Python 3 does for free, so let's just be consistent. Thanks to Yuya for the idea.
Augie Fackler -
r42778:97ada9b8 5.0.2 stable
Show More
Name Size Modified Last Commit Author
/ contrib
automation
benchmarks
chg
docker
fuzz
hgsh
packaging
perf-utils
plan9
python-zstandard
vagrant
vim
win32
Makefile.python Loading ...
all-revsets.txt Loading ...
asv.conf.json Loading ...
base-revsets.txt Loading ...
bash_completion Loading ...
bdiff-torture.py Loading ...
byteify-strings.py Loading ...
casesmash.py Loading ...
catapipe.py Loading ...
check-code.py Loading ...
check-commit Loading ...
check-config.py Loading ...
check-py3-compat.py Loading ...
clang-format-ignorelist Loading ...
debugcmdserver.py Loading ...
debugshell.py Loading ...
dirstatenonnormalcheck.py Loading ...
dumprevlog Loading ...
editmerge Loading ...
editmergeps.bat Loading ...
editmergeps.ps1 Loading ...
genosxversion.py Loading ...
hg-ssh Loading ...
hg-test-mode.el Loading ...
hgclient.py Loading ...
hgk Loading ...
hgperf Loading ...
hgweb.fcgi Loading ...
hgweb.wsgi Loading ...
import-checker.py Loading ...
install-windows-dependencies.ps1 Loading ...
logo-droplets.svg Loading ...
memory.py Loading ...
mercurial.el Loading ...
mq.el Loading ...
perf.py Loading ...
pylintrc Loading ...
python-hook-examples.py Loading ...
python3-ratchet.py Loading ...
python3-whitelist Loading ...
relnotes Loading ...
revsetbenchmarks.py Loading ...
showstack.py Loading ...
simplemerge Loading ...
synthrepo.py Loading ...
tcsh_completion Loading ...
tcsh_completion_build.sh Loading ...
testparseutil.py Loading ...
undumprevlog Loading ...
xml.rnc Loading ...
zsh_completion Loading ...