summaryrefslogtreecommitdiffstats
path: root/client/powerline.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xclient/powerline.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/client/powerline.py b/client/powerline.py
new file mode 100755
index 0000000..28492c1
--- /dev/null
+++ b/client/powerline.py
@@ -0,0 +1,104 @@
+#!/usr/bin/env python
+# vim:fileencoding=utf-8:noet
+from __future__ import (unicode_literals, division, absolute_import, print_function)
+
+import sys
+import socket
+import errno
+import os
+
+try:
+ from posix import environ
+except ImportError:
+ from os import environ
+
+# XXX Hack for importing powerline modules to work.
+sys.path.pop(0)
+
+try:
+ from powerline.lib.encoding import get_preferred_output_encoding
+except ImportError:
+ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(os.path.realpath(__file__)))))
+ from powerline.lib.encoding import get_preferred_output_encoding
+
+
+if len(sys.argv) < 2:
+ print('Must provide at least one argument.', file=sys.stderr)
+ raise SystemExit(1)
+
+use_filesystem = not sys.platform.lower().startswith('linux')
+
+if sys.argv[1] == '--socket':
+ address = sys.argv[2]
+ if not use_filesystem:
+ address = '\0' + address
+ del sys.argv[1:3]
+else:
+ address = ('/tmp/powerline-ipc-%d' if use_filesystem else '\0powerline-ipc-%d') % os.getuid()
+
+sock = socket.socket(family=socket.AF_UNIX)
+
+
+def eintr_retry_call(func, *args, **kwargs):
+ while True:
+ try:
+ return func(*args, **kwargs)
+ except EnvironmentError as e:
+ if getattr(e, 'errno', None) == errno.EINTR:
+ continue
+ raise
+
+
+try:
+ eintr_retry_call(sock.connect, address)
+except Exception:
+ # Run the powerline renderer
+ args = ['powerline-render'] + sys.argv[1:]
+ os.execvp('powerline-render', args)
+
+fenc = get_preferred_output_encoding()
+
+
+def tobytes(s):
+ if isinstance(s, bytes):
+ return s
+ else:
+ return s.encode(fenc)
+
+
+args = [tobytes('%x' % (len(sys.argv) - 1))]
+args.extend((tobytes(s) for s in sys.argv[1:]))
+
+
+try:
+ cwd = os.getcwd()
+except EnvironmentError:
+ pass
+else:
+ if not isinstance(cwd, bytes):
+ cwd = cwd.encode(fenc)
+ args.append(cwd)
+
+
+args.extend((tobytes(k) + b'=' + tobytes(v) for k, v in environ.items()))
+
+EOF = b'\0\0'
+
+for a in args:
+ eintr_retry_call(sock.sendall, a + b'\0')
+
+eintr_retry_call(sock.sendall, EOF)
+
+received = []
+while True:
+ r = sock.recv(4096)
+ if not r:
+ break
+ received.append(r)
+
+sock.close()
+
+if sys.version_info < (3,):
+ sys.stdout.write(b''.join(received))
+else:
+ sys.stdout.buffer.write(b''.join(received))