Mercurial > hg
annotate hgeditor @ 17616:9535a0dc41f2
store: implement fncache basic path encoding in C
(This is not yet enabled; it will be turned on in a followup patch.)
The path encoding performed by fncache is complex and (perhaps
surprisingly) slow enough to negatively affect the overall performance
of Mercurial.
For a short path (< 120 bytes), the Python code can be reduced to a fairly
tractable state machine that either determines that nothing needs to be
done in a single pass, or performs the encoding in a second pass.
For longer paths, we avoid the more complicated hashed encoding scheme
for now, and fall back to Python.
Raw performance: I measured in a repo containing 150,000 files in its tip
manifest, with a median path name length of 57 bytes, and 95th percentile
of 96 bytes.
In this repo, the Python code takes 3.1 seconds to encode all path
names, while the hybrid C-and-Python code (called from Python) takes
0.21 seconds, for a speedup of about 14.
Across several other large repositories, I've measured the speedup from
the C code at between 26x and 40x.
For path names above 120 bytes where we must fall back to Python for
hashed encoding, the speedup is about 1.7x. Thus absolute performance
will depend strongly on the characteristics of a particular repository.
author | Bryan O'Sullivan <bryano@fb.com> |
---|---|
date | Tue, 18 Sep 2012 15:42:19 -0700 |
parents | 2b440bb8a66b |
children | 1aee2ab0f902 |
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 |
f93fde8f5027
remove the gpg stuff from hgeditor (superseded by the signing extension)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1009
diff
changeset
|
4 # changes while commiting. |
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 $? |