dispatch-conf: use shlex to parse diff command
authorZac Medico <zmedico@gentoo.org>
Wed, 2 May 2012 19:55:31 +0000 (12:55 -0700)
committerZac Medico <zmedico@gentoo.org>
Wed, 2 May 2012 19:55:31 +0000 (12:55 -0700)
pym/portage/dispatch_conf.py

index c81153ae197a3b68115698ac50d9e034a148943b..4c68dfc7b8df23649f652e17a15f3fae4effe4c1 100644 (file)
@@ -13,7 +13,7 @@ import os, shutil, subprocess, sys
 import portage
 from portage.env.loaders import KeyValuePairFileLoader
 from portage.localization import _
-from portage.util import varexpand
+from portage.util import shlex_split, varexpand
 
 RCS_BRANCH = '1.1.1'
 RCS_LOCK = 'rcs -ko -M -l'
@@ -30,8 +30,12 @@ def diffstatusoutput(cmd, file1, file2):
     """
     # Use Popen to emulate getstatusoutput(), since getstatusoutput() may
     # raise a UnicodeDecodeError which makes the output inaccessible.
-    proc = subprocess.Popen(cmd % (file1, file2),
-        stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
+    args = shlex_split(cmd % (file1, file2))
+    if sys.hexversion < 0x3000000 or sys.hexversion >= 0x3020000:
+        # Python 3.1 does not support bytes in Popen args.
+        args = [portage._unicode_encode(x, errors='strict') for x in args]
+    proc = subprocess.Popen(args,
+        stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
     output = portage._unicode_decode(proc.communicate()[0])
     if output and output[-1] == "\n":
         # getstatusoutput strips one newline