[PATCH] D26009: [lit] Work around Windows MSys command line tokenization bug

Reid Kleckner via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 26 13:39:00 PDT 2016


This revision was automatically updated to reflect the committed changes.
Closed by commit rL285237: [lit] Work around Windows MSys command line tokenization bug (authored by rnk).

Changed prior to commit:
  https://reviews.llvm.org/D26009?vs=75940&id=75942#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D26009

Files:
  llvm/trunk/test/Other/lit-quoting.txt
  llvm/trunk/utils/lit/lit/TestRunner.py


Index: llvm/trunk/test/Other/lit-quoting.txt
===================================================================
--- llvm/trunk/test/Other/lit-quoting.txt
+++ llvm/trunk/test/Other/lit-quoting.txt
@@ -0,0 +1,2 @@
+RUN: echo "\"" | FileCheck %s
+CHECK: {{^"$}}
Index: llvm/trunk/utils/lit/lit/TestRunner.py
===================================================================
--- llvm/trunk/utils/lit/lit/TestRunner.py
+++ llvm/trunk/utils/lit/lit/TestRunner.py
@@ -140,6 +140,62 @@
 
     return (finalExitCode, timeoutInfo)
 
+def quote_windows_command(seq):
+    """
+    Reimplement Python's private subprocess.list2cmdline for MSys compatibility
+
+    Based on CPython implementation here:
+      https://hg.python.org/cpython/file/849826a900d2/Lib/subprocess.py#l422
+
+    Some core util distributions (MSys) don't tokenize command line arguments
+    the same way that MSVC CRT does. Lit rolls its own quoting logic similar to
+    the stock CPython logic to paper over these quoting and tokenization rule
+    differences.
+
+    We use the same algorithm from MSDN as CPython
+    (http://msdn.microsoft.com/en-us/library/17w5ykft.aspx), but we treat more
+    characters as needing quoting, such as double quotes themselves.
+    """
+    result = []
+    needquote = False
+    for arg in seq:
+        bs_buf = []
+
+        # Add a space to separate this argument from the others
+        if result:
+            result.append(' ')
+
+        # This logic differs from upstream list2cmdline.
+        needquote = (" " in arg) or ("\t" in arg) or ("\"" in arg) or not arg
+        if needquote:
+            result.append('"')
+
+        for c in arg:
+            if c == '\\':
+                # Don't know if we need to double yet.
+                bs_buf.append(c)
+            elif c == '"':
+                # Double backslashes.
+                result.append('\\' * len(bs_buf)*2)
+                bs_buf = []
+                result.append('\\"')
+            else:
+                # Normal char
+                if bs_buf:
+                    result.extend(bs_buf)
+                    bs_buf = []
+                result.append(c)
+
+        # Add remaining backslashes, if any.
+        if bs_buf:
+            result.extend(bs_buf)
+
+        if needquote:
+            result.extend(bs_buf)
+            result.append('"')
+
+    return ''.join(result)
+
 def _executeShCmd(cmd, shenv, results, timeoutHelper):
     if timeoutHelper.timeoutReached():
         # Prevent further recursion if the timeout has been hit
@@ -315,6 +371,11 @@
                     named_temp_files.append(f.name)
                     args[i] = f.name
 
+        # On Windows, do our own command line quoting for better compatibility
+        # with some core utility distributions.
+        if kIsWindows:
+            args = quote_windows_command(args)
+
         try:
             procs.append(subprocess.Popen(args, cwd=cmd_shenv.cwd,
                                           executable = executable,


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D26009.75942.patch
Type: text/x-patch
Size: 3011 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161026/82c7a966/attachment.bin>


More information about the llvm-commits mailing list