contrib: add a hint if the Windows dependency MSI is already installed
In the past, I've gotten confused when the script failed on seemingly random
python installs (and thus the py3.8 install was commented out from the last time
this happened to me, which has been reverted here). This particular error code
means the package was already installed. For python, it means the major and
minor version are the same, but the micro version may differ.
In practice, ignoring the python installation failure will cause the pip
installation that happens next to fail, because python.exe for that version is
somewhere else on the system. This could probably be fixed by running py.exe
with the major and minor version, but that is skipped during the install for
some reason. I didn't feel like over complicating this though, and at least
there's a better hint when the problem occurs.
Differential Revision: https://phab.mercurial-scm.org/D12560
Test alignment of multibyte characters
$ HGENCODING=utf-8
$ export HGENCODING
$ hg init t
$ cd t
$ "$PYTHON" << EOF
> from mercurial import pycompat
> # (byte, width) = (6, 4)
> s = b"\xe7\x9f\xad\xe5\x90\x8d"
> # (byte, width) = (7, 7): odd width is good for alignment test
> m = b"MIDDLE_"
> # (byte, width) = (18, 12)
> l = b"\xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d"
> f = open('s', 'wb'); f.write(s); f.close()
> f = open('m', 'wb'); f.write(m); f.close()
> f = open('l', 'wb'); f.write(l); f.close()
> # instant extension to show list of options
> f = open('showoptlist.py', 'wb'); f.write(b"""# encoding: utf-8
> from mercurial import registrar
> cmdtable = {}
> command = registrar.command(cmdtable)
>
> @command(b'showoptlist',
> [(b's', b'opt1', b'', b'short width' + (b' ' +%(s)s) * 8, %(s)s),
> (b'm', b'opt2', b'', b'middle width' + (b' ' + %(m)s) * 8, %(m)s),
> (b'l', b'opt3', b'', b'long width' + (b' ' + %(l)s) * 8, %(l)s)],
> b'')
> def showoptlist(ui, repo, *pats, **opts):
> '''dummy command to show option descriptions'''
> return 0
> """ % {b's': pycompat.byterepr(s),
> b'm': pycompat.byterepr(m),
> b'l': pycompat.byterepr(l),
> })
> f.close()
> EOF
$ S=`cat s`
$ M=`cat m`
$ L=`cat l`
alignment of option descriptions in help
$ cat <<EOF > .hg/hgrc
> [extensions]
> ja_ext = `pwd`/showoptlist.py
> EOF
check alignment of option descriptions in help
$ hg help showoptlist
hg showoptlist
dummy command to show option descriptions
options:
-s --opt1 \xe7\x9f\xad\xe5\x90\x8d short width \xe7\x9f\xad\xe5\x90\x8d \xe7\x9f\xad\xe5\x90\x8d \xe7\x9f\xad\xe5\x90\x8d \xe7\x9f\xad\xe5\x90\x8d \xe7\x9f\xad\xe5\x90\x8d \xe7\x9f\xad\xe5\x90\x8d \xe7\x9f\xad\xe5\x90\x8d \xe7\x9f\xad\xe5\x90\x8d (esc)
-m --opt2 MIDDLE_ middle width MIDDLE_ MIDDLE_ MIDDLE_ MIDDLE_ MIDDLE_
MIDDLE_ MIDDLE_ MIDDLE_
-l --opt3 \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d long width \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d (esc)
\xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d (esc)
\xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d (esc)
(some details hidden, use --verbose to show complete help)
$ rm -f s; touch s
$ rm -f m; touch m
$ rm -f l; touch l
add files
$ cp s $S
$ hg add $S
$ cp m $M
$ hg add $M
$ cp l $L
$ hg add $L
commit(1)
$ echo 'first line(1)' >> s; cp s $S
$ echo 'first line(2)' >> m; cp m $M
$ echo 'first line(3)' >> l; cp l $L
$ hg commit -m 'first commit' -u $S
commit(2)
$ echo 'second line(1)' >> s; cp s $S
$ echo 'second line(2)' >> m; cp m $M
$ echo 'second line(3)' >> l; cp l $L
$ hg commit -m 'second commit' -u $M
commit(3)
$ echo 'third line(1)' >> s; cp s $S
$ echo 'third line(2)' >> m; cp m $M
$ echo 'third line(3)' >> l; cp l $L
$ hg commit -m 'third commit' -u $L
check alignment of user names in annotate
$ hg annotate -u $M
\xe7\x9f\xad\xe5\x90\x8d: first line(2) (esc)
MIDDLE_: second line(2)
\xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d: third line(2) (esc)
check alignment of filenames in diffstat
$ hg diff -c tip --stat
MIDDLE_ | 1 +
\xe7\x9f\xad\xe5\x90\x8d | 1 + (esc)
\xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d | 1 + (esc)
3 files changed, 3 insertions(+), 0 deletions(-)
add branches/tags
$ hg branch $S
marked working directory as branch \xe7\x9f\xad\xe5\x90\x8d (esc)
(branches are permanent and global, did you want a bookmark?)
$ hg tag $S
$ hg book -f $S
$ hg branch $M
marked working directory as branch MIDDLE_
$ hg tag $M
$ hg book -f $M
$ hg branch $L
marked working directory as branch \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d (esc)
$ hg tag $L
$ hg book -f $L
check alignment of branches
$ hg branches
\xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d 5:d745ff46155b (esc)
MIDDLE_ 4:9259be597f19 (inactive)
\xe7\x9f\xad\xe5\x90\x8d 3:b06c5b6def9e (inactive) (esc)
default 2:64a70663cee8 (inactive)
check alignment of tags
$ hg tags
tip 5:d745ff46155b
\xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d 4:9259be597f19 (esc)
MIDDLE_ 3:b06c5b6def9e
\xe7\x9f\xad\xe5\x90\x8d 2:64a70663cee8 (esc)
check alignment of bookmarks
$ hg book
MIDDLE_ 5:d745ff46155b
\xe7\x9f\xad\xe5\x90\x8d 4:9259be597f19 (esc)
* \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d 5:d745ff46155b (esc)