Patchwork D8203: logtoprocess: avoid traceback when running long commands

login
register
mail settings
Submitter phabricator
Date March 2, 2020, 8 p.m.
Message ID <differential-rev-PHID-DREV-abzjc6o3ku5idsfwnnin-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/45420/
State Superseded
Headers show

Comments

phabricator - March 2, 2020, 8 p.m.
valentin.gatienbaron created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  $ 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>
      dispatch.run()
    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
      canonical_command=req.canonical_command,
    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?

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D8203

AFFECTED FILES
  hgext/logtoprocess.py

CHANGE DETAILS




To: valentin.gatienbaron, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/hgext/logtoprocess.py b/hgext/logtoprocess.py
--- a/hgext/logtoprocess.py
+++ b/hgext/logtoprocess.py
@@ -59,6 +59,13 @@ 
 
     def log(self, ui, event, msg, opts):
         script = self._scripts[event]
+        maxmsg = 100000
+        if len(msg) > maxmsg:
+            # Each env var has a 128KiB limit on linux. msg can be long, in
+            # particular for command event, where it's the full command line.
+            # Prefer truncating the message than raising "Argument list too
+            # long" error.
+            msg = msg[:maxmsg] + ' (truncated)'
         env = {
             b'EVENT': event,
             b'HGPID': os.getpid(),