sapling/mercurial
Danny Hooper 54e3286e1e log: add a "graphwidth" template variable
Wrapping text in templates for 'hg log --graph' can't be done very well,
because the template doesn't know how wide the graph drawing is. The edge
drawing function needs to know the number of lines in the template output, so
we need to also determine how wide that drawing would be before we call the
edgefn or evaluate the template.

This patch makes edgefn compute the graph width and pass it into the template
so that we can do something like this:

COLUMNS=10 hg log --graph --template "{fill(desc, termwidth - graphwidth)}"
@  a a a a
|  a a a a
|  a a a a
o    a a a
|\   a a a
| |  a a a
| |  a a a

Using extensions to do this would be relatively complicated due to a lack of
hooks in this area of the code.

In the future it may make sense to have a more generic "textwidth" that tells
you how many columns you can expect to fill without causing the terminal to
wrap your output. I'm not sure there are other situations to motivate this yet,
or if it is entirely feasible.

Differential Revision: https://phab.mercurial-scm.org/D360
2017-08-15 10:15:31 -07:00
..
cext cext: move PyInt macros to charencode.c properly 2017-08-14 13:35:26 +09:00
cffi policy: reroute proxy modules internally 2017-07-31 23:40:36 +09:00
default.d mergetools.rc: find OSX FileMerge in the new location inside Xcode 4.3 2015-10-16 11:37:34 +02:00
help sparse: add a requirement when a repository uses sparse (BC) 2017-07-17 11:45:38 -07:00
hgweb httppeer: add support for httppostargs when we're sending a file 2017-07-26 17:58:19 -04:00
httpclient httpclient: update to 54868ef054d2 of httpplus 2016-06-27 11:53:50 -04:00
pure encoding: drop circular import by proxying through '<policy>.charencode' 2017-07-31 23:13:47 +09:00
templates label: rename log.trouble into log.instability 2017-08-03 15:31:54 +02:00
__init__.py selector2: vendor selector2 library 2017-07-14 20:19:46 -07:00
ancestor.py py3: add __bool__ to every class defining __nonzero__ 2017-03-13 12:40:14 -07:00
archival.py archive: add an experimental config to control the metadata file template 2017-07-17 00:49:29 -04:00
bdiff.c bdiff: split bdiff into cpy-aware and cpy-agnostic part 2016-07-13 10:46:26 +02:00
bdiff.h bdiff: split bdiff into cpy-aware and cpy-agnostic part 2016-07-13 10:46:26 +02:00
bitmanipulation.h internals: move the bitmanipulation routines into its own file 2016-06-06 13:08:13 +02:00
bookmarks.py bookmark: deprecate direct del of a bookmark value 2017-07-10 21:49:37 +02:00
branchmap.py cachevfs: migration the revbranchcache to 'cachevfs' 2017-07-15 22:42:50 +02:00
bundle2.py pushvars: add a coreconfigitem for push.pushvars.server 2017-08-12 04:47:40 +05:30
bundlerepo.py configitems: register the 'bundle.mainreporoot' config 2017-06-30 03:31:26 +02:00
byterange.py pycompat: switch to util.urlreq/util.urlerr for py3 compat 2016-04-06 23:22:12 +00:00
changegroup.py changegroup: more **kwargs 2017-07-24 11:28:59 -04:00
changelog.py revlog: make 'storedeltachains' a "public" attribute 2016-10-14 02:25:08 +02:00
chgserver.py codemod: register core configitems using a script 2017-07-14 14:22:40 -07:00
cmdutil.py log: add a "graphwidth" template variable 2017-08-15 10:15:31 -07:00
color.py configitems: register the 'ui.color' config 2017-07-15 14:14:53 +02:00
commands.py push: fix docsstring 2017-08-15 17:22:57 -07:00
commandserver.py commandserver: do not handle EINTR for selector.select 2017-07-16 11:17:00 -07:00
compat.h compat: define ssize_t as int on 32bit Windows, silences C4142 warning 2016-07-15 23:54:56 +09:00
config.py ui: move configlist parser to config.py 2017-03-17 09:19:56 -07:00
configitems.py pushvars: add a coreconfigitem for push.pushvars.server 2017-08-12 04:47:40 +05:30
context.py context: fix troubled deprecation 2017-08-14 11:20:06 +02:00
copies.py copies: add more details to the documentation of mergecopies() 2017-08-16 00:25:20 +05:30
crecord.py crecord: fixes the formatting of the select status in the status line 2017-08-13 00:17:13 -07:00
dagop.py followlines: join merge parents line ranges in blockdescendants() (issue5595) 2017-07-05 13:54:53 +02:00
dagparser.py dagparser: make print statement in doctest Py3 portable 2017-06-15 13:32:02 -04:00
dagutil.py dagutil: use absolute_import 2015-08-08 19:04:09 -07:00
debugcommands.py win32: copy-edit debugssl messages to match prevailing style 2017-07-17 13:22:59 -05:00
destutil.py show: implement "stack" view 2017-07-01 22:38:42 -07:00
dirstate.py merge with stable 2017-08-10 18:55:33 -04:00
dirstateguard.py util: add base class for transactional context managers 2017-07-28 22:42:10 -07:00
discovery.py discovery: prevent crash caused by prune marker having no parent data 2017-04-19 23:10:05 +09:00
dispatch.py ui: enable pager always for explicit --pager=on (issue5580) 2017-08-01 18:52:52 +09:00
dummycert.pem
encoding.py py3: make encoding.strio() an identity function on Python 2 2017-08-16 13:50:11 +09:00
error.py error: rename RichIOError to PeerTransportError 2017-04-16 11:12:37 -07:00
exchange.py util: add base class for transactional context managers 2017-07-28 22:42:10 -07:00
exewrapper.c exewrapper: add .dll to LoadLibrary() argument 2016-04-27 09:23:39 -07:00
extensions.py extensions: don't give AttributeError bytes message on Python 3 2017-08-11 15:09:54 -04:00
fancyopts.py py3: slice over bytes to prevent getting it's ascii value 2017-06-25 08:36:51 +05:30
filelog.py revlog: merge hash checking subfunctions 2016-12-13 14:21:36 +00:00
filemerge.py filemerge: pass contexts to simplemerge 2017-08-13 20:06:52 -07:00
fileset.py help: clarify quotes are needed for filesets.size expressions 2016-09-21 16:33:37 +00:00
formatter.py formatter: proxy fm.context() through converter 2017-06-26 09:33:01 +09:00
graphmod.py log: add a "graphwidth" template variable 2017-08-15 10:15:31 -07:00
hbisect.py bisect: move check_state into the bisect module 2016-08-24 04:25:20 +02:00
help.py codemod: register core configitems using a script 2017-07-14 14:22:40 -07:00
hg.py py3: use bytes IO to write sample hgrc 2017-08-03 00:45:02 +09:00
hook.py py3: convert keys of kwargs back to bytes using pycompat.byteskwargs() 2017-06-17 15:29:26 +05:30
httpconnection.py codemod: register core configitems using a script 2017-07-14 14:22:40 -07:00
httppeer.py wireproto: use new peer interface 2017-08-10 20:58:28 -07:00
i18n.py i18n: make the locale directory name the same string type as the datapath 2016-10-08 05:26:18 -04:00
keepalive.py keepalive: send HTTP request headers in a deterministic order 2017-04-13 18:04:38 -07:00
localrepo.py localrepo: use peer interfaces 2017-08-09 23:52:25 -07:00
lock.py lock: avoid unintentional lock acquisition at failure of readlock 2017-05-01 19:59:13 +09:00
lsprof.py lsprof: use print function 2016-01-02 11:40:53 -08:00
lsprofcalltree.py lsprofcalltree: use print function 2016-01-02 11:45:29 -08:00
mail.py codemod: register core configitems using a script 2017-07-14 14:22:40 -07:00
manifest.py manifest: apply checkambig=True only for root 00manifest.i 2017-06-30 01:47:48 +09:00
match.py match: override visitdir() in nevermatcher to return False 2017-07-19 14:50:50 -07:00
mdiff.py py3: use pycompat.strkwargs() to convert kwargs keys to str 2017-06-27 00:23:32 +05:30
merge.py merge: removed sorting in casefolding detection, for a slight performance win 2017-07-14 19:27:28 +00:00
mergeutil.py checkunresolved: move to new package to help avoid import cycles 2016-11-21 21:31:45 -05:00
minirst.py help: search section of help topic by translated section name correctly 2016-05-13 07:19:59 +09:00
mpatch.c internals: move the bitmanipulation routines into its own file 2016-06-06 13:08:13 +02:00
mpatch.h mpatch: raise MemoryError instead of mpatchError if lalloc() failed 2016-08-07 10:06:56 +09:00
namespaces.py namespaces: record and expose whether namespace is built-in 2017-06-24 14:52:15 -07:00
node.py node: use byte literals to construct nullid and wdirid 2016-03-12 14:04:57 -08:00
obsolete.py obsolete: rename bumped volatile set into phasedivergent volatile set 2017-08-04 19:39:34 +02:00
obsutil.py obsmarker: fix precnode deprecation 2017-08-16 10:18:57 +02:00
parser.py parser: preserve order of keyword arguments 2017-04-09 11:58:27 +09:00
patch.py patch: update copying of dict keys and values to work on Python 3 2017-07-24 14:42:55 -04:00
pathutil.py pathauditor: disable cache of audited paths by default (issue5628) 2017-07-26 22:10:15 +09:00
peer.py wireproto: use new peer interface 2017-08-10 20:58:28 -07:00
phases.py phases: remove trace of addednodes in the 'phase-heads' handling 2017-07-13 21:10:55 +02:00
policy.py policy: reroute proxy modules internally 2017-07-31 23:40:36 +09:00
posix.py ssh: quote parameters using shellquote (SEC) 2017-08-04 23:54:12 -07:00
profiling.py codemod: register core configitems using a script 2017-07-14 14:22:40 -07:00
progress.py codemod: register core configitems using a script 2017-07-14 14:22:40 -07:00
pushkey.py pushkey: use absolute_import 2015-08-08 19:57:27 -07:00
pvec.py pvec: use absolute_import 2015-12-21 21:32:58 -08:00
pycompat.py py3: select input or raw_input by pycompat 2017-08-16 13:54:24 +09:00
rcutil.py pager: use less as a fallback on Unix 2017-04-28 20:51:14 +09:00
registrar.py filemerge: move decorator definition for internal merge tools to registrar 2017-08-06 01:13:57 +09:00
repair.py repair: move manifest strip to a separate function 2017-08-08 17:25:38 -07:00
repository.py repository: formalize wire protocol interface 2017-08-13 11:04:42 -07:00
repoview.py cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1 2016-06-10 00:12:33 -04:00
revlog.py revlog: use struct.Struct instances for slight performance wins 2017-07-10 16:41:13 -04:00
revset.py revset: mark evolution-related revsets as experimental 2017-08-16 16:48:41 +02:00
revsetlang.py revset: add experimental relation and subscript operators 2017-07-08 13:07:59 +09:00
scmposix.py pager: use less as a fallback on Unix 2017-04-28 20:51:14 +09:00
scmutil.py scmutil: use util.shellquote instead of %r 2017-07-26 23:47:54 -04:00
scmwindows.py pager: use less as a fallback on Unix 2017-04-28 20:51:14 +09:00
selectors2.py selector2: vendor selector2 library 2017-07-14 20:19:46 -07:00
server.py serve: add support for Mercurial subrepositories 2017-04-15 18:05:40 -04:00
setdiscovery.py setdiscovery: use iterbatch interface instead of batch 2016-03-01 17:44:41 -05:00
similar.py similar: remove caching from the module level 2017-01-13 11:42:36 -08:00
simplemerge.py filemerge: extract _picklabels as a helper function 2017-08-13 22:46:16 -07:00
smartset.py smartset: fix generatorset.last() to not return the first element (issue5609) 2017-06-27 23:50:22 +09:00
sparse.py sparse: add a requirement when a repository uses sparse (BC) 2017-07-17 11:45:38 -07:00
sshpeer.py wireproto: use new peer interface 2017-08-10 20:58:28 -07:00
sshserver.py wireproto: compress data from a generator 2016-10-16 11:10:21 -07:00
sslutil.py sslutil: inform the user about how to fix an incomplete certificate chain 2017-07-12 18:37:13 -04:00
statichttprepo.py statichttprepo: implement wlock() (issue5613) 2017-07-29 12:50:56 -07:00
statprof.py statprof: require input file 2017-01-18 22:45:07 -08:00
store.py vfs: rename auditvfs to proxyvfs 2017-07-07 23:40:00 +09:00
streamclone.py codemod: register core configitems using a script 2017-07-14 14:22:40 -07:00
subrepo.py subrepo: add tests for svn rogue ssh urls (SEC) 2017-07-31 16:44:17 -07:00
tagmerge.py tagmerge: use workingfilectx to write merged tags 2017-07-11 16:48:15 -07:00
tags.py cachevfs: migration the tags fnode cache to 'cachevfs' 2017-07-15 23:30:25 +02:00
templatefilters.py templatefilters: fix crash by string formatting of '{x|splitlines}' 2017-04-15 10:51:17 +09:00
templatekw.py log: add a "graphwidth" template variable 2017-08-15 10:15:31 -07:00
templater.py revset: pass repo when passing ui 2017-07-15 15:51:57 -07:00
transaction.py util: add base class for transactional context managers 2017-07-28 22:42:10 -07:00
treediscovery.py error: get Abort from 'error' instead of 'util' 2015-10-08 12:55:45 -07:00
txnutil.py
ui.py merge with stable 2017-08-10 14:23:41 -04:00
unionrepo.py configitems: register the 'bundle.mainreporoot' config 2017-06-30 03:31:26 +02:00
upgrade.py codemod: simplify nested withs 2017-07-13 18:31:35 -07:00
url.py codemod: register core configitems using a script 2017-07-14 14:22:40 -07:00
util.py py3: select input or raw_input by pycompat 2017-08-16 13:54:24 +09:00
verify.py codemod: register core configitems using a script 2017-07-14 14:22:40 -07:00
vfs.py pathauditor: disable cache of audited paths by default (issue5628) 2017-07-26 22:10:15 +09:00
win32.py win32: work around a WinError problem handling HRESULT types 2017-03-30 00:33:00 -04:00
windows.py ssh: quote parameters using shellquote (SEC) 2017-08-04 23:54:12 -07:00
wireproto.py wireproto: use new peer interface 2017-08-10 20:58:28 -07:00
worker.py worker: propagate exit code to main process 2017-04-15 13:27:44 +09:00