--- a/mercurial/commands.py Mon Jul 19 00:43:24 2010 +0200
+++ b/mercurial/commands.py Mon Jul 19 00:43:34 2010 +0200
@@ -152,8 +152,9 @@
for f in funcmap:
l = [f(n) for n, dummy in lines]
if l:
- ml = max(map(len, l))
- pieces.append(["%*s" % (ml, x) for x in l])
+ sized = [(x, encoding.colwidth(x)) for x in l]
+ ml = max([w for x, w in sized])
+ pieces.append(["%s%s" % (' ' * (ml - w), x) for x, w in sized])
if pieces:
for p, l in zip(zip(*pieces), lines):
@@ -2043,9 +2044,9 @@
if multioccur:
msg = _("\n[+] marked option can be specified multiple times")
if ui.verbose and name != 'shortlist':
- opt_output.append((msg, ()))
+ opt_output.append((msg, None))
else:
- opt_output.insert(-1, (msg, ()))
+ opt_output.insert(-1, (msg, None))
if not name:
ui.write(_("\nadditional help topics:\n\n"))
@@ -2057,16 +2058,20 @@
ui.write(" %-*s %s\n" % (topics_len, t, desc))
if opt_output:
- opts_len = max([len(line[0]) for line in opt_output if line[1]] or [0])
- for first, second in opt_output:
- if second:
- initindent = ' %-*s ' % (opts_len, first)
- hangindent = ' ' * (opts_len + 3)
- ui.write('%s\n' % (util.wrap(second,
+ colwidth = encoding.colwidth
+ # normalize: (opt or message, desc or None, width of opt)
+ entries = [desc and (opt, desc, colwidth(opt)) or (opt, None, 0)
+ for opt, desc in opt_output]
+ hanging = max([e[2] for e in entries])
+ for opt, desc, width in entries:
+ if desc:
+ initindent = ' %s%s ' % (opt, ' ' * (hanging - width))
+ hangindent = ' ' * (hanging + 3)
+ ui.write('%s\n' % (util.wrap(desc,
initindent=initindent,
hangindent=hangindent)))
else:
- ui.write("%s\n" % first)
+ ui.write("%s\n" % opt)
def identify(ui, repo, source=None,
rev=None, num=None, id=None, branch=None, tags=None):
@@ -3764,8 +3769,8 @@
Update the repository's working directory to the specified
changeset.
- If no changeset is specified, attempt to update to the head of the
- current branch. If this head is a descendant of the working
+ If no changeset is specified, attempt to update to the tip of the
+ current branch. If this changeset is a descendant of the working
directory's parent, update to it, otherwise abort.
The following rules apply when the working directory contains
--- a/mercurial/patch.py Mon Jul 19 00:43:24 2010 +0200
+++ b/mercurial/patch.py Mon Jul 19 00:43:34 2010 +0200
@@ -11,7 +11,7 @@
from i18n import _
from node import hex, nullid, short
-import base85, cmdutil, mdiff, util, diffhelpers, copies
+import base85, cmdutil, mdiff, util, diffhelpers, copies, encoding
gitre = re.compile('diff --git a/(.*) b/(.*)')
@@ -1644,10 +1644,14 @@
maxtotal, maxname = 0, 0
totaladds, totalremoves = 0, 0
hasbinary = False
- for filename, adds, removes, isbinary in stats:
+
+ sized = [(filename, adds, removes, isbinary, encoding.colwidth(filename))
+ for filename, adds, removes, isbinary in stats]
+
+ for filename, adds, removes, isbinary, namewidth in sized:
totaladds += adds
totalremoves += removes
- maxname = max(maxname, len(filename))
+ maxname = max(maxname, namewidth)
maxtotal = max(maxtotal, adds + removes)
if isbinary:
hasbinary = True
@@ -1667,15 +1671,17 @@
# if there were at least some changes.
return max(i * graphwidth // maxtotal, int(bool(i)))
- for filename, adds, removes, isbinary in stats:
+ for filename, adds, removes, isbinary, namewidth in sized:
if git and isbinary:
count = 'Bin'
else:
count = adds + removes
pluses = '+' * scale(adds)
minuses = '-' * scale(removes)
- output.append(' %-*s | %*s %s%s\n' % (maxname, filename, countwidth,
- count, pluses, minuses))
+ output.append(' %s%s | %*s %s%s\n' %
+ (filename, ' ' * (maxname - namewidth),
+ countwidth, count,
+ pluses, minuses))
if stats:
output.append(_(' %d files changed, %d insertions(+), %d deletions(-)\n')
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-encoding-align Mon Jul 19 00:43:34 2010 +0200
@@ -0,0 +1,123 @@
+#!/bin/sh
+
+########################################
+
+HGENCODING=utf-8
+export HGENCODING
+
+hg init t
+cd t
+
+python << EOF
+# (byte, width) = (6, 4)
+s = "\xe7\x9f\xad\xe5\x90\x8d"
+# (byte, width) = (7, 7): odd width is good for alignment test
+m = "MIDDLE_"
+# (byte, width) = (18, 12)
+l = "\xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d"
+
+f = file('s', 'w'); f.write(s); f.close()
+f = file('m', 'w'); f.write(m); f.close()
+f = file('l', 'w'); f.write(l); f.close()
+
+# instant extension to show list of options
+f = file('showoptlist.py', 'w'); f.write("""# encoding: utf-8
+def showoptlist(ui, repo, *pats, **opts):
+ '''dummy command to show option descriptions'''
+ return 0
+
+cmdtable = {
+ 'showoptlist':
+ (showoptlist,
+ [('s', 'opt1', '', 'short width', '""" + s + """'),
+ ('m', 'opt2', '', 'middle width', '""" + m + """'),
+ ('l', 'opt3', '', 'long width', '""" + 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
+echo '% check alignment of option descriptions in help'
+hg help showoptlist
+
+########################################
+#### alignment of:
+#### - user names in annotate
+#### - file names in diffstat
+
+#### add files
+
+touch $S
+hg add $S
+touch $M
+hg add $M
+touch $L
+hg add $L
+
+#### commit(1)
+
+echo 'first line(1)' >> $S
+echo 'first line(2)' >> $M
+echo 'first line(3)' >> $L
+hg commit -m 'first commit' -u $S -d "1000000 0"
+
+#### commit(2)
+
+echo 'second line(1)' >> $S
+echo 'second line(2)' >> $M
+echo 'second line(3)' >> $L
+hg commit -m 'second commit' -u $M -d "1000000 0"
+
+#### commit(3)
+
+echo 'third line(1)' >> $S
+echo 'third line(2)' >> $M
+echo 'third line(3)' >> $L
+hg commit -m 'third commit' -u $L -d "1000000 0"
+
+#### check
+
+echo '% check alignment of user names in annotate'
+hg annotate -u $M
+echo '% check alignment of filenames in diffstat'
+hg diff -c tip --stat
+
+########################################
+#### alignment of:
+#### - branch names in list
+#### - tag names in list
+
+#### add branches/tags
+
+hg branch $S
+hg tag -d "1000000 0" $S
+hg branch $M
+hg tag -d "1000000 0" $M
+hg branch $L
+hg tag -d "1000000 0" $L
+
+#### check
+
+echo '% check alignment of branches'
+hg tags
+echo '% check alignment of tags'
+hg tags
+
+########################################
+
+exit 0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-encoding-align.out Mon Jul 19 00:43:34 2010 +0200
@@ -0,0 +1,34 @@
+% check alignment of option descriptions in help
+hg showoptlist
+
+dummy command to show option descriptions
+
+options:
+
+ -s --opt1 短名 short width
+ -m --opt2 MIDDLE_ middle width
+ -l --opt3 長い長い名前 long width
+
+use "hg -v help showoptlist" to show global options
+% check alignment of user names in annotate
+ 短名: first line(2)
+ MIDDLE_: second line(2)
+長い長い名前: third line(2)
+% check alignment of filenames in diffstat
+ MIDDLE_ | 1 +
+ 短名 | 1 +
+ 長い長い名前 | 1 +
+ 3 files changed, 3 insertions(+), 0 deletions(-)
+marked working directory as branch 短名
+marked working directory as branch MIDDLE_
+marked working directory as branch 長い長い名前
+% check alignment of branches
+tip 5:afc60d8eed19
+長い長い名前 4:19fe74d09ba0
+MIDDLE_ 3:8a20997d2281
+短名 2:0cc06ffa3461
+% check alignment of tags
+tip 5:afc60d8eed19
+長い長い名前 4:19fe74d09ba0
+MIDDLE_ 3:8a20997d2281
+短名 2:0cc06ffa3461