##// 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.

File last commit:

r40908:44378796 default
r42778:97ada9b8 5.0.2 stable
Show More
test-logtoprocess.t
130 lines | 3.6 KiB | text/troff | Tads3Lexer
/ tests / test-logtoprocess.t
Matt Harbison
test-logtoprocess: don't run on Windows...
r32915 #require no-windows
Jun Wu
test-logtoprocess: use cat to wait for outputs...
r30991 ATTENTION: logtoprocess runs commands asynchronously. Be sure to append "| cat"
to hg commands, to wait for the output, if you want to test its output.
Otherwise the test will be flaky.
Martijn Pieters
logtoprocess: new experimental extension...
r28901 Test if logtoprocess correctly captures command-related log calls.
$ hg init
$ cat > $TESTTMP/foocommand.py << EOF
Augie Fackler
tests: update test-logtoprocess to pass our import checker
r33968 > from __future__ import absolute_import
Yuya Nishihara
registrar: move cmdutil.command to registrar module (API)...
r32337 > from mercurial import registrar
Martijn Pieters
logtoprocess: new experimental extension...
r28901 > cmdtable = {}
Yuya Nishihara
registrar: move cmdutil.command to registrar module (API)...
r32337 > command = registrar.command(cmdtable)
Boris Feld
configitems: register the test 'logtoprocess.foo' config
r34765 > configtable = {}
> configitem = registrar.configitem(configtable)
Yuya Nishihara
py3: byte-stringify inline extension in test-logtoprocess.t
r40655 > configitem(b'logtoprocess', b'foo',
Boris Feld
configitems: register the test 'logtoprocess.foo' config
r34765 > default=None,
> )
Boris Feld
logtoprocess: sends the canonical command name to the subprocess...
r40438 > @command(b'foobar', [])
Martijn Pieters
logtoprocess: new experimental extension...
r28901 > def foo(ui, repo):
Yuya Nishihara
py3: byte-stringify inline extension in test-logtoprocess.t
r40655 > ui.log(b'foo', b'a message: %s\n', b'spam')
Martijn Pieters
logtoprocess: new experimental extension...
r28901 > EOF
Simon Farnsworth
ui: provide a mechanism to track and log blocked time...
r30976 $ cp $HGRCPATH $HGRCPATH.bak
Martijn Pieters
logtoprocess: new experimental extension...
r28901 $ cat >> $HGRCPATH << EOF
> [extensions]
> logtoprocess=
> foocommand=$TESTTMP/foocommand.py
> [logtoprocess]
Boris Feld
logtoprocess: add a test to show pager and ltp bad interaction...
r39961 > command=(echo 'logtoprocess command output:';
Martijn Pieters
logtoprocess: new experimental extension...
r28901 > echo "\$EVENT";
Yuya Nishihara
logtoprocess: drop support for ui.log() call with invalid msg arguments (BC)...
r40656 > echo "\$MSG1") > $TESTTMP/command.log
Boris Feld
logtoprocess: add a test to show pager and ltp bad interaction...
r39961 > commandfinish=(echo 'logtoprocess commandfinish output:';
Martijn Pieters
logtoprocess: new experimental extension...
r28901 > echo "\$EVENT";
> echo "\$MSG1";
Boris Feld
logtoprocess: sends the canonical command name to the subprocess...
r40438 > echo "canonical: \$OPT_CANONICAL_COMMAND") > $TESTTMP/commandfinish.log
Boris Feld
logtoprocess: add a test to show pager and ltp bad interaction...
r39961 > foo=(echo 'logtoprocess foo output:';
Martijn Pieters
logtoprocess: new experimental extension...
r28901 > echo "\$EVENT";
Yuya Nishihara
logtoprocess: drop support for ui.log() call with invalid msg arguments (BC)...
r40656 > echo "\$MSG1") > $TESTTMP/foo.log
Martijn Pieters
logtoprocess: new experimental extension...
r28901 > EOF
Running a command triggers both a ui.log('command') and a
ui.log('commandfinish') call. The foo command also uses ui.log.
Jun Wu
test-logtoprocess: use cat to wait for outputs...
r30991 Use sort to avoid ordering issues between the various processes we spawn:
Boris Feld
logtoprocess: sends the canonical command name to the subprocess...
r40438 $ hg fooba
Augie Fackler
tests: sleep longer in test-logtoprocess.t...
r40413 $ sleep 1
Boris Feld
logtoprocess: add a test to show pager and ltp bad interaction...
r39961 $ cat $TESTTMP/command.log | sort
Martijn Pieters
logtoprocess: new experimental extension...
r28901
Boris Feld
logtoprocess: add a test to show pager and ltp bad interaction...
r39961 command
Boris Feld
logtoprocess: sends the canonical command name to the subprocess...
r40438 fooba
Boris Feld
logtoprocess: add a test to show pager and ltp bad interaction...
r39961 logtoprocess command output:
#if no-chg
$ cat $TESTTMP/commandfinish.log | sort
Boris Feld
logtoprocess: sends the canonical command name to the subprocess...
r40438 canonical: foobar
Martijn Pieters
logtoprocess: new experimental extension...
r28901 commandfinish
Boris Feld
logtoprocess: sends the canonical command name to the subprocess...
r40438 fooba exited 0 after * seconds (glob)
Boris Feld
logtoprocess: add a test to show pager and ltp bad interaction...
r39961 logtoprocess commandfinish output:
$ cat $TESTTMP/foo.log | sort
a message: spam
Martijn Pieters
logtoprocess: new experimental extension...
r28901 foo
logtoprocess foo output:
Boris Feld
logtoprocess: add a test to show pager and ltp bad interaction...
r39961 #endif
Simon Farnsworth
ui: provide a mechanism to track and log blocked time...
r30976
Confirm that logging blocked time catches stdio properly:
$ cp $HGRCPATH.bak $HGRCPATH
$ cat >> $HGRCPATH << EOF
> [extensions]
> logtoprocess=
> pager=
> [logtoprocess]
Boris Feld
logtoprocess: add a test to show pager and ltp bad interaction...
r39961 > uiblocked=echo "\$EVENT stdio \$OPT_STDIO_BLOCKED ms command \$OPT_COMMAND_DURATION ms" > $TESTTMP/uiblocked.log
Simon Farnsworth
ui: provide a mechanism to track and log blocked time...
r30976 > [ui]
> logblockedtimes=True
> EOF
Boris Feld
logtoprocess: add a test to show pager and ltp bad interaction...
r39961 $ hg log
Augie Fackler
tests: sleep longer in test-logtoprocess.t...
r40413 $ sleep 1
Boris Feld
logtoprocess: add a test to show pager and ltp bad interaction...
r39961 $ cat $TESTTMP/uiblocked.log
Simon Farnsworth
ui: log time spent blocked on stdio...
r30978 uiblocked stdio [0-9]+.[0-9]* ms command [0-9]+.[0-9]* ms (re)
Boris Feld
logtoprocess: add a test to show pager and ltp bad interaction...
r39961
Try to confirm that pager wait on logtoprocess:
Add a script that wait on a file to appears for 5 seconds, if it sees it touch
another file or die after 5 seconds. If the scripts is awaited by hg, the
script will die after the timeout before we could touch the file and the
resulting file will not exists. If not, we will touch the file and see it.
Boris Feld
test: update test-logtoprocess.t to not requires less...
r40908 $ cat >> fakepager.py <<EOF
> import sys
> printed = False
> for line in sys.stdin:
> sys.stdout.write(line)
> printed = True
> if not printed:
> sys.stdout.write('paged empty output!\n')
> EOF
Boris Feld
logtoprocess: add a test to show pager and ltp bad interaction...
r39961 $ cat > $TESTTMP/wait-output.sh << EOF
> #!/bin/sh
> for i in \`$TESTDIR/seq.py 50\`; do
> if [ -f "$TESTTMP/wait-for-touched" ];
> then
> touch "$TESTTMP/touched";
> break;
> else
> sleep 0.1;
> fi
> done
> EOF
$ chmod +x $TESTTMP/wait-output.sh
$ cat >> $HGRCPATH << EOF
> [extensions]
> logtoprocess=
> pager=
Boris Feld
test: update test-logtoprocess.t to not requires less...
r40908 > [pager]
> pager = "$PYTHON" $TESTTMP/fakepager.py
Boris Feld
logtoprocess: add a test to show pager and ltp bad interaction...
r39961 > [logtoprocess]
> commandfinish=$TESTTMP/wait-output.sh
> EOF
$ hg version -q --pager=always
Mercurial Distributed SCM (version *) (glob)
$ touch $TESTTMP/wait-for-touched
$ sleep 0.2
$ test -f $TESTTMP/touched && echo "SUCCESS Pager is not waiting on ltp" || echo "FAIL Pager is waiting on ltp"
Boris Feld
logtoprocess: connect all fds to /dev/null to avoid bad interaction with pager...
r39962 SUCCESS Pager is not waiting on ltp