Преглед на файлове

[Console] Use proc_open instead of exec to suppress errors when run on windows and stty is not present

Jordi Boggiano преди 13 години
родител
ревизия
4f93d1addd
променени са 1 файла, в които са добавени 21 реда и са изтрити 2 реда
  1. 21 2
      src/Symfony/Component/Console/Application.php

+ 21 - 2
src/Symfony/Component/Console/Application.php

@@ -800,7 +800,7 @@ class Application
             return preg_replace('{^(\d+)x.*$}', '$1', $ansicon);
         }
 
-        if (preg_match("{rows.(\d+);.columns.(\d+);}i", exec('stty -a | grep columns'), $match)) {
+        if (preg_match("{rows.(\d+);.columns.(\d+);}i", $this->getSttyColumns(), $match)) {
             return $match[2];
         }
     }
@@ -816,7 +816,7 @@ class Application
             return preg_replace('{^\d+x\d+ \(\d+x(\d+)\)$}', '$1', trim($ansicon));
         }
 
-        if (preg_match("{rows.(\d+);.columns.(\d+);}i", exec('stty -a | grep columns'), $match)) {
+        if (preg_match("{rows.(\d+);.columns.(\d+);}i", $this->getSttyColumns(), $match)) {
             return $match[1];
         }
     }
@@ -833,6 +833,25 @@ class Application
         return $input->getFirstArgument('command');
     }
 
+    /**
+     * Runs and parses stty -a if it's available, suppressing any error output
+     *
+     * @return string
+     */
+    private function getSttyColumns()
+    {
+        $descriptorspec = array(1 => array('pipe', 'w'), 2 => array('pipe', 'w'));
+        $process = proc_open('stty -a | grep columns', $descriptorspec, $pipes, null, null, array('suppress_errors' => true));
+        if (is_resource($process)) {
+            $info = stream_get_contents($pipes[1]);
+            fclose($pipes[1]);
+            fclose($pipes[2]);
+            proc_close($process);
+
+            return $info;
+        }
+    }
+
     /**
      * Sorts commands in alphabetical order.
      *