PY-40974 Always treat environment variables as raw bytes
authorAndrey Vlasovskikh <andrey.vlasovskikh@jetbrains.com>
Sun, 31 May 2020 12:42:12 +0000 (15:42 +0300)
committerintellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com>
Sun, 31 May 2020 12:45:29 +0000 (15:45 +0300)
It's unnecessary and sometimes wrong to assume any encoding
for an environment variable. They can be encoded differently
depending on the requirements of programs that utilize them.
In our case we just need to pass all the environment
variables "as is" to the IDE process.

I've modified printenv.py so that it's the same version of
the script for both Linux and macOS and for all the Python
versions from 2.3 to at least 3.9.

GitOrigin-RevId: 40d73ef6eb56da8609d75fbce8a4a04c52e317b4

bin/linux/printenv.py
bin/mac/printenv.py

index a60959ca82eb347a9a3de3f15ae9c017802d7de5..039052a1bcc140655d1a81d17cb6a3abe34b8feb 100755 (executable)
@@ -2,6 +2,7 @@
 
 # Dumps environment variables into specified file.
 # Format: zero-separated "name=value" pairs in platform encoding.
+# The script can work with any version of Python from 2.3 to at least 3.9
 
 import os
 import sys
@@ -9,10 +10,24 @@ import sys
 if len(sys.argv) != 2:
     raise Exception('Exactly one argument expected')
 
-f = open(sys.argv[1], 'wb')
+PY2 = sys.version_info < (3,)
+
+if PY2:
+    environ = os.environ
+else:
+    environ = os.environb
+
+
+def b(s):
+    if PY2:
+        return s
+    else:
+        return s.encode('utf-8')
+
+
+fd = open(sys.argv[1], 'wb')
 try:
-    for key, value in os.environ.items():
-        s = '%s=%s\0' % (key, value)
-        f.write(s.encode('utf-8'))
+    for key, value in environ.items():
+        fd.writelines([key, b('='), value, b('\0')])
 finally:
-    f.close()
+    fd.close()
index 8bbd9e789c3f3b56534bdc4b98110616bafec77f..039052a1bcc140655d1a81d17cb6a3abe34b8feb 100755 (executable)
@@ -2,6 +2,7 @@
 
 # Dumps environment variables into specified file.
 # Format: zero-separated "name=value" pairs in platform encoding.
+# The script can work with any version of Python from 2.3 to at least 3.9
 
 import os
 import sys
@@ -9,9 +10,24 @@ import sys
 if len(sys.argv) != 2:
     raise Exception('Exactly one argument expected')
 
-f = open(sys.argv[1], 'w')
+PY2 = sys.version_info < (3,)
+
+if PY2:
+    environ = os.environ
+else:
+    environ = os.environb
+
+
+def b(s):
+    if PY2:
+        return s
+    else:
+        return s.encode('utf-8')
+
+
+fd = open(sys.argv[1], 'wb')
 try:
-    for key, value in os.environ.items():
-        f.writelines([key, '=', value, '\0'])
+    for key, value in environ.items():
+        fd.writelines([key, b('='), value, b('\0')])
 finally:
-    f.close()
+    fd.close()