1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-11-22 06:42:41 +01:00

Mostly remove "STDERR" and "STDOUT" constants from Arcanist

Summary:
Ref T13675. Ref T13556. The "STDOUT" and "STDERR" constants are defined by the PHP CLI SAPI, in `cli_register_file_handles()`.

The "native arc" embedded PHP wrapper doesn't define these, and there's no real reason to define them, since they're just defined in terms of the PHP stream wrappers ("php://stdin", etc) anyway.

This patch isn't exhaustive (and a subsequent change should add lint, rejecting these magic constants) but is just trying to make native `arc` functional.

Test Plan: Created this revision with a standalone native `arc` binary.

Subscribers: cspeckmim

Maniphest Tasks: T13675, T13556

Differential Revision: https://secure.phabricator.com/D21794
This commit is contained in:
epriestley 2022-04-28 14:50:46 -07:00
parent da206314cf
commit 8d487ed770
12 changed files with 116 additions and 27 deletions

View file

@ -22,23 +22,38 @@ final class PhutilConsoleFormatter extends Phobject {
public static function getDisableANSI() { public static function getDisableANSI() {
if (self::$disableANSI === null) { if (self::$disableANSI === null) {
self::$disableANSI = self::newShouldDisableAnsi();
}
return self::$disableANSI;
}
private static function newShouldDisableANSI() {
$term = phutil_utf8_strtolower(getenv('TERM')); $term = phutil_utf8_strtolower(getenv('TERM'));
// ansicon enables ANSI support on Windows // ansicon enables ANSI support on Windows
if (!$term && getenv('ANSICON')) { if (!$term && getenv('ANSICON')) {
$term = 'ansi'; $term = 'ansi';
} }
if (phutil_is_windows() && $term !== 'cygwin' && $term !== 'ansi') {
self::$disableANSI = true; if (phutil_is_windows()) {
} else if (!defined('STDOUT')) { if ($term !== 'cygwin' && $term !== 'ansi') {
self::$disableANSI = true; return true;
} else if (function_exists('posix_isatty') && !posix_isatty(STDOUT)) {
self::$disableANSI = true;
} else {
self::$disableANSI = false;
} }
} }
return self::$disableANSI;
$stdout = PhutilSystem::getStdoutHandle();
if ($stdout === null) {
return true;
}
if (function_exists('posix_isatty')) {
if (!posix_isatty($stdout)) {
return true;
}
}
return false;
} }
public static function formatString($format /* ... */) { public static function formatString($format /* ... */) {

View file

@ -94,7 +94,7 @@ final class PhutilErrorLog
if (strlen($message)) { if (strlen($message)) {
$message = tsprintf("%B\n", $message); $message = tsprintf("%B\n", $message);
@fwrite(STDERR, $message); PhutilSystem::writeStderr($message);
} }
} }

View file

@ -53,10 +53,14 @@ final class PhutilExecPassthru extends PhutilExecutableFuture {
if ($is_write) { if ($is_write) {
$stdin_spec = array('pipe', 'r'); $stdin_spec = array('pipe', 'r');
} else { } else {
$stdin_spec = STDIN; $stdin_spec = PhutilSystem::getStdinHandle();
} }
$spec = array($stdin_spec, STDOUT, STDERR); $spec = array(
$stdin_spec,
PhutilSystem::getStdoutHandle(),
PhutilSystem::getStderrHandle(),
);
$pipes = array(); $pipes = array();
$unmasked_command = $command->getUnmaskedString(); $unmasked_command = $command->getUnmaskedString();

View file

@ -19,7 +19,7 @@ final class ArcanistLogEngine
} }
private function writeBytes($bytes) { private function writeBytes($bytes) {
fprintf(STDERR, '%s', $bytes); PhutilSystem::writeStderr($bytes);
return $this; return $this;
} }

View file

@ -33,7 +33,7 @@ final class ArcanistBaseCommitParser extends Phobject {
private function log($message) { private function log($message) {
if ($this->verbose) { if ($this->verbose) {
fwrite(STDERR, $message."\n"); PhutilSystem::writeStderr($message."\n");
} }
} }

View file

@ -805,7 +805,7 @@ final class PhutilArgumentParser extends Phobject {
private function logMessage($message) { private function logMessage($message) {
fwrite(STDERR, $message); PhutilSystem::writeStderr($message);
} }

View file

@ -110,6 +110,6 @@ final class PhutilConsoleProgressSink
} }
private function printLine($line) { private function printLine($line) {
fprintf(STDERR, '%s', $line); PhutilSystem::writeStderr($line);
} }
} }

View file

@ -296,11 +296,12 @@ final class PhutilSymbolLoader {
// library without breaking library startup. // library without breaking library startup.
if ($should_continue) { if ($should_continue) {
// We may not have `pht()` yet. // We may not have `pht()` yet.
fprintf( $message = sprintf(
STDERR,
"%s: %s\n", "%s: %s\n",
'IGNORING CLASS LOAD FAILURE', 'IGNORING CLASS LOAD FAILURE',
$caught->getMessage()); $caught->getMessage());
@file_put_contents('php://stderr', $message);
} else { } else {
throw $caught; throw $caught;
} }

View file

@ -313,7 +313,7 @@ final class ArcanistFileUploader extends Phobject {
* @task internal * @task internal
*/ */
private function writeStatus($message) { private function writeStatus($message) {
fwrite(STDERR, $message."\n"); PhutilSystem::writeStderr($message."\n");
} }
} }

View file

@ -3,10 +3,76 @@
/** /**
* Interact with the operating system. * Interact with the operating system.
* *
* @task stdio Interacting with Standard I/O
* @task memory Interacting with System Memory * @task memory Interacting with System Memory
*/ */
final class PhutilSystem extends Phobject { final class PhutilSystem extends Phobject {
private static $stdin = false;
private static $stderr = false;
private static $stdout = false;
/**
* @task stdio
*/
public static function getStdinHandle() {
if (self::$stdin === false) {
self::$stdin = self::newStdioHandle('php://stdin');
}
return self::$stdin;
}
/**
* @task stdio
*/
public static function getStdoutHandle() {
if (self::$stdout === false) {
self::$stdout = self::newStdioHandle('php://stdout');
}
return self::$stdout;
}
/**
* @task stdio
*/
public static function getStderrHandle() {
if (self::$stderr === false) {
self::$stderr = self::newStdioHandle('php://stderr');
}
return self::$stderr;
}
/**
* @task stdio
*/
public static function writeStderr($message) {
$stderr = self::getStderrHandle();
if ($stderr === null) {
return;
}
$message = phutil_string_cast($message);
@fwrite($stderr, $message);
}
/**
* @task stdio
*/
private static function newStdioHandle($ref) {
$ignored_mode = '';
$handle = @fopen($ref, $ignored_mode);
if ($handle === false) {
return null;
}
return $handle;
}
/** /**
* Get information about total and free memory on the system. * Get information about total and free memory on the system.

View file

@ -806,7 +806,10 @@ EOTEXT
if ($is_raw) { if ($is_raw) {
if ($this->getArgument('raw')) { if ($this->getArgument('raw')) {
fwrite(STDERR, pht('Reading diff from stdin...')."\n"); PhutilSystem::writeStderr(
tsprintf(
"%s\n",
pht('Reading diff from stdin...')));
$raw_diff = file_get_contents('php://stdin'); $raw_diff = file_get_contents('php://stdin');
} else if ($this->getArgument('raw-command')) { } else if ($this->getArgument('raw-command')) {
list($raw_diff) = execx('%C', $this->getArgument('raw-command')); list($raw_diff) = execx('%C', $this->getArgument('raw-command'));

View file

@ -1565,7 +1565,7 @@ abstract class ArcanistWorkflow extends Phobject {
* @return void * @return void
*/ */
final protected function writeStatusMessage($msg) { final protected function writeStatusMessage($msg) {
fwrite(STDERR, $msg); PhutilSystem::writeStderr($msg);
} }
final public function writeInfo($title, $message) { final public function writeInfo($title, $message) {