logtoprocess: avoid traceback when running long commands


logtoprocess: avoid traceback when running long commands

$ hg log -r "present($(yes | tr -d '\n' | head -c 130000))" "$(yes | tr -d '\n' | head -c 5000)" --config extensions.logtoprocess= --config logtoprocess.commandfinish=whatever
Traceback (most recent call last):

File "/usr/bin/hg", line 67, in <module>
File "/usr/lib64/python2.7/site-packages/mercurial/dispatch.py", line 111, in run
  status = dispatch(req)
File "/usr/lib64/python2.7/site-packages/mercurial/dispatch.py", line 290, in dispatch
File "/usr/lib64/python2.7/site-packages/mercurial/ui.py", line 1991, in log
  logger.log(self, event, msg, opts)
File "/usr/lib64/python2.7/site-packages/hgext/logtoprocess.py", line 72, in log
  procutil.runbgcommand(script, fullenv, shell=True)
File "/usr/lib64/python2.7/site-packages/mercurial/utils/procutil.py", line 597, in runbgcommand
  b'error running %r: %s' % (cmd, os.strerror(returncode)),

OSError: [Errno 7] error running 'whatever': Argument list too long

This can happen if you pass a bunch of filenames to hg commit, for instance.

This is due to a size limit on individual env vars (on linux, but I
imagine there are similar limits in other OSes):
$ FOO=$(yes | head -c 131000) /usr/bin/true
$ FOO=$(yes | head -c 132000) /usr/bin/true
-bash: /usr/bin/true: Argument list too long

I propose to avoid this by truncating the message. I didn't make the
limit configurable as it doesn't seem particularly convenient to
customize this. I'm not sure if various OSes would want radically
different limits here?

Differential Revision: https://phab.mercurial-scm.org/D8203