diff mercurial/scmposix.py @ 30309:4b1af1c867fa

scmutil: move util.termwidth() I'm going to get rid of sys.stderr|out|in references from posix.termwidth(). In order to do that, termwidth() needs to take a ui, but functions in util.py shouldn't depend on a ui object. So moves termwidth() to scmutil.py.
author Yuya Nishihara <yuya@tcha.org>
date Thu, 20 Oct 2016 21:38:44 +0900
parents c90a05124fae
children 5c379b1f56c7
line wrap: on
line diff
--- a/mercurial/scmposix.py	Sun Nov 06 00:37:50 2016 -0700
+++ b/mercurial/scmposix.py	Thu Oct 20 21:38:44 2016 +0900
@@ -1,5 +1,7 @@
 from __future__ import absolute_import
 
+import errno
+import fcntl
 import os
 import sys
 
@@ -38,3 +40,33 @@
         return [encoding.environ['home'] + '/lib/hgrc']
     else:
         return [os.path.expanduser('~/.hgrc')]
+
+def termwidth():
+    try:
+        import array
+        import termios
+        for dev in (sys.stderr, sys.stdout, sys.stdin):
+            try:
+                try:
+                    fd = dev.fileno()
+                except AttributeError:
+                    continue
+                if not os.isatty(fd):
+                    continue
+                try:
+                    arri = fcntl.ioctl(fd, termios.TIOCGWINSZ, '\0' * 8)
+                    width = array.array('h', arri)[1]
+                    if width > 0:
+                        return width
+                except AttributeError:
+                    pass
+            except ValueError:
+                pass
+            except IOError as e:
+                if e[0] == errno.EINVAL:
+                    pass
+                else:
+                    raise
+    except ImportError:
+        pass
+    return 80