Mercurial > hg
annotate hgeditor @ 36528:72e487851a53
debugcommands: add debugwireproto command
We currently don't have a low-level mechanism for sending
arbitrary wire protocol commands. Having a generic and robust
mechanism for sending wire protocol commands, examining wire
data, etc would make it vastly easier to test the wire protocol
and debug server operation. This is a problem I've wanted a
solution for numerous times, especially recently as I've been
hacking on a new version of the wire protocol.
This commit establishes a `hg debugwireproto` command for sending
data to a peer.
The command invents a mini language for specifying actions to take.
This will enable a lot of flexibility for issuing commands and testing
variations for how commands are sent.
Right now, we only support low-level raw sends and receives. These
are probably the least valuable commands to intended users of this
command. But they are the most useful commands to implement to
bootstrap the feature (I've chosen to reimplement test-ssh-proto.t
using this command to prove its usefulness).
My eventual goal of `hg debugwireproto` is to allow calling wire
protocol commands with a human-friendly interface. Essentially,
people can type in a command name and arguments and
`hg debugwireproto` will figure out how to send that on the wire.
I'd love to eventually be able to save the server's raw response
to a file. This would allow us to e.g. call "getbundle" wire
protocol commands easily.
test-ssh-proto.t has been updated to use the new command in lieu
of piping directly to a server process. As part of the transition,
test behavior improved. Before, we piped all request data to the
server at once. Now, we have explicit control over the ordering of
operations. e.g. we can send one command, receive its response,
then send another command. This will allow us to more robustly
test race conditions, buffering behavior, etc.
There were some subtle changes in test behavior. For example,
previous behavior would often send trailing newlines to the server.
The new mechanism doesn't treat literal newlines specially and
requires newlines be escaped in the payload.
Because the new logging code is very low level, it is easy to
introduce race conditions in tests. For example, the number of bytes
returned by a read() may vary depending on load. This is why tests
make heavy use of "readline" for consuming data: the result of
that operation should be deterministic and not subject to race
conditions. There are still some uses of "readavailable." However,
those are only for reading from stderr. I was able to reproduce
timing issues with my system under load when using "readavailable"
globally. But if I "readline" to grab stdout, "readavailable"
appears to work deterministically for stderr. I think this is
because the server writes to stderr first. As long as the OS
delivers writes to pipes in the same order they were made, this
should work. If there are timing issues, we can introduce a
mechanism to readline from stderr.
Differential Revision: https://phab.mercurial-scm.org/D2392
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Thu, 01 Mar 2018 08:24:54 -0800 |
parents | 1aee2ab0f902 |
children |
rev | line source |
---|---|
544
3d4d5f2aba9a
Remove bashisms and use /bin/sh instead of /bin/bash.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
484
diff
changeset
|
1 #!/bin/sh |
186 | 2 # |
1599
f93fde8f5027
remove the gpg stuff from hgeditor (superseded by the signing extension)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1009
diff
changeset
|
3 # This is an example of using HGEDITOR to create of diff to review the |
26781
1aee2ab0f902
spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents:
11266
diff
changeset
|
4 # changes while committing. |
684
4ccf3de52989
Turn off signing with hgeditor by default
Matt Mackall <mpm@selenic.com>
parents:
683
diff
changeset
|
5 |
666
0100a43788ca
hgeditor: Remove EMAIL default for HGUSER, comment editor selection
Radoslaw "AstralStorm" Szkodzinski <astralstorm@gorzow.mm.pl>
parents:
665
diff
changeset
|
6 # If you want to pass your favourite editor some other parameters |
0100a43788ca
hgeditor: Remove EMAIL default for HGUSER, comment editor selection
Radoslaw "AstralStorm" Szkodzinski <astralstorm@gorzow.mm.pl>
parents:
665
diff
changeset
|
7 # only for Mercurial, modify this: |
796
33a272b79e54
Replaced mktemp and usage of ${par:=word}.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
769
diff
changeset
|
8 case "${EDITOR}" in |
33a272b79e54
Replaced mktemp and usage of ${par:=word}.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
769
diff
changeset
|
9 "") |
33a272b79e54
Replaced mktemp and usage of ${par:=word}.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
769
diff
changeset
|
10 EDITOR="vi" |
33a272b79e54
Replaced mktemp and usage of ${par:=word}.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
769
diff
changeset
|
11 ;; |
348
442eb02cf870
Improved hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
12 emacs) |
442eb02cf870
Improved hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
13 EDITOR="$EDITOR -nw" |
442eb02cf870
Improved hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
14 ;; |
442eb02cf870
Improved hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
15 gvim|vim) |
442eb02cf870
Improved hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
16 EDITOR="$EDITOR -f -o" |
442eb02cf870
Improved hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
17 ;; |
442eb02cf870
Improved hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
18 esac |
442eb02cf870
Improved hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
19 |
796
33a272b79e54
Replaced mktemp and usage of ${par:=word}.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
769
diff
changeset
|
20 |
33a272b79e54
Replaced mktemp and usage of ${par:=word}.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
769
diff
changeset
|
21 HGTMP="" |
33a272b79e54
Replaced mktemp and usage of ${par:=word}.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
769
diff
changeset
|
22 cleanup_exit() { |
33a272b79e54
Replaced mktemp and usage of ${par:=word}.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
769
diff
changeset
|
23 rm -rf "$HGTMP" |
33a272b79e54
Replaced mktemp and usage of ${par:=word}.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
769
diff
changeset
|
24 } |
33a272b79e54
Replaced mktemp and usage of ${par:=word}.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
769
diff
changeset
|
25 |
754
3e73bf876f17
Fixes and cleanups to hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
684
diff
changeset
|
26 # Remove temporary files even if we get interrupted |
831
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
814
diff
changeset
|
27 trap "cleanup_exit" 0 # normal exit |
11190
43337076ba92
Fixed a bashism with trap numbers in hgeditor.
Javi Merino <cibervicho@gmail.com>
parents:
4687
diff
changeset
|
28 trap "exit 255" HUP INT QUIT ABRT TERM |
796
33a272b79e54
Replaced mktemp and usage of ${par:=word}.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
769
diff
changeset
|
29 |
11266
2b440bb8a66b
Fixed a bashism with the use of $RANDOM in hgeditor.
Javi Merino <cibervicho@gmail.com>
parents:
11190
diff
changeset
|
30 HGTMP=$(mktemp -d ${TMPDIR-/tmp}/hgeditor.XXXXXX) |
2b440bb8a66b
Fixed a bashism with the use of $RANDOM in hgeditor.
Javi Merino <cibervicho@gmail.com>
parents:
11190
diff
changeset
|
31 [ x$HGTMP != x -a -d $HGTMP ] || { |
2b440bb8a66b
Fixed a bashism with the use of $RANDOM in hgeditor.
Javi Merino <cibervicho@gmail.com>
parents:
11190
diff
changeset
|
32 echo "Could not create temporary directory! Exiting." 1>&2 |
2b440bb8a66b
Fixed a bashism with the use of $RANDOM in hgeditor.
Javi Merino <cibervicho@gmail.com>
parents:
11190
diff
changeset
|
33 exit 1 |
796
33a272b79e54
Replaced mktemp and usage of ${par:=word}.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
769
diff
changeset
|
34 } |
33a272b79e54
Replaced mktemp and usage of ${par:=word}.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
769
diff
changeset
|
35 |
754
3e73bf876f17
Fixes and cleanups to hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
684
diff
changeset
|
36 ( |
3e73bf876f17
Fixes and cleanups to hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
684
diff
changeset
|
37 grep '^HG: changed' "$1" | cut -b 13- | while read changed; do |
4687
b5bbfa18daf7
hgeditor: Use $HG to run 'hg diff' (see 849f011dbf79)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4659
diff
changeset
|
38 "$HG" diff "$changed" >> "$HGTMP/diff" |
754
3e73bf876f17
Fixes and cleanups to hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
684
diff
changeset
|
39 done |
3e73bf876f17
Fixes and cleanups to hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
684
diff
changeset
|
40 ) |
348
442eb02cf870
Improved hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
41 |
1599
f93fde8f5027
remove the gpg stuff from hgeditor (superseded by the signing extension)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1009
diff
changeset
|
42 cat "$1" > "$HGTMP/msg" |
684
4ccf3de52989
Turn off signing with hgeditor by default
Matt Mackall <mpm@selenic.com>
parents:
683
diff
changeset
|
43 |
3025
d9b8d28c0b94
Find the system's MD5 binary.
Will Maier <willmaier@ml1.net>
parents:
1706
diff
changeset
|
44 MD5=$(which md5sum 2>/dev/null) || \ |
4659
7a7d4937272b
Kill trailing spaces
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3025
diff
changeset
|
45 MD5=$(which md5 2>/dev/null) |
3025
d9b8d28c0b94
Find the system's MD5 binary.
Will Maier <willmaier@ml1.net>
parents:
1706
diff
changeset
|
46 [ -x "${MD5}" ] && CHECKSUM=`${MD5} "$HGTMP/msg"` |
1009
1bc619b12025
Don't show the diff in hgeditor if there are no changes in file contents.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
839
diff
changeset
|
47 if [ -s "$HGTMP/diff" ]; then |
1bc619b12025
Don't show the diff in hgeditor if there are no changes in file contents.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
839
diff
changeset
|
48 $EDITOR "$HGTMP/msg" "$HGTMP/diff" || exit $? |
1bc619b12025
Don't show the diff in hgeditor if there are no changes in file contents.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
839
diff
changeset
|
49 else |
1bc619b12025
Don't show the diff in hgeditor if there are no changes in file contents.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
839
diff
changeset
|
50 $EDITOR "$HGTMP/msg" || exit $? |
1bc619b12025
Don't show the diff in hgeditor if there are no changes in file contents.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
839
diff
changeset
|
51 fi |
3025
d9b8d28c0b94
Find the system's MD5 binary.
Will Maier <willmaier@ml1.net>
parents:
1706
diff
changeset
|
52 [ -x "${MD5}" ] && (echo "$CHECKSUM" | ${MD5} -c >/dev/null 2>&1 && exit 13) |
754
3e73bf876f17
Fixes and cleanups to hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
684
diff
changeset
|
53 |
1599
f93fde8f5027
remove the gpg stuff from hgeditor (superseded by the signing extension)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1009
diff
changeset
|
54 mv "$HGTMP/msg" "$1" |
348
442eb02cf870
Improved hgeditor:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
55 |
831
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
814
diff
changeset
|
56 exit $? |