Changeset View
Changeset View
Standalone View
Standalone View
src/console/PhutilConsoleMetrics.php
- This file was added.
| <?php | |||||
| final class PhutilConsoleMetrics extends Phobject { | |||||
| const DEFAULT_CONSOLE = 'default'; | |||||
| private static $consoles = array(); | |||||
| private $width = false; | |||||
| public static function getNamedConsole($key) { | |||||
| if (!isset(self::$consoles[$key])) { | |||||
| self::$consoles[$key] = new self(); | |||||
| } | |||||
| return self::$consoles[$key]; | |||||
| } | |||||
| public static function getDefaultConsole() { | |||||
| return self::getNamedConsole(self::DEFAULT_CONSOLE); | |||||
| } | |||||
| public function didGetWINCHSignal() { | |||||
| // When we receive a "WINCH" ("WINdow CHange") signal, clear the cached | |||||
| // information we have about the terminal. | |||||
| $this->width = false; | |||||
| return $this; | |||||
| } | |||||
| public function getTerminalWidth() { | |||||
| if ($this->width === false) { | |||||
| $this->width = $this->computeTerminalWidth(); | |||||
| } | |||||
| return $this->width; | |||||
| } | |||||
| private function computeTerminalWidth() { | |||||
| if (phutil_is_windows()) { | |||||
| // TODO: Figure out how to do this on Windows. | |||||
| return null; | |||||
| } | |||||
| $tmp = new TempFile(); | |||||
| // NOTE: We can't just execute this because it won't be connected to a TTY | |||||
| // if we do. | |||||
| $err = id(new PhutilExecPassthru('tput cols > %s', $tmp)) | |||||
| ->resolve(); | |||||
| $stdout = Filesystem::readFile($tmp); | |||||
| unset($tmp); | |||||
| if ($err) { | |||||
| return null; | |||||
| } | |||||
| $width = (int)trim($stdout); | |||||
| if ($width > 0) { | |||||
| return $width; | |||||
| } | |||||
| return null; | |||||
| } | |||||
| } | |||||