mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-22 06:42:41 +01:00
Update "arc liberate" to fix error with PHP 8 and add "--verbose" argument to adjust it
Summary: Reported at the phorge project (https://we.phorge.it/D25017), running `arc liberate` fails on PHP 8 due to the `log()` function using `fwrite()` incorrectly assuming a format pattern can be used. This updates to remove most of these status messages are they are largely uninformative and instead we can report progress. - Remove the `--quiet` argument - Always display the progress - Remove all informational/status log statements Test Plan: Tested using both PHP 7.3 and PHP 8: 1. I ran `arc liberate` and saw the standard output: ```lang=console SCAN Searching for libraries in the current working directory... WORK Updating library: src/ Done. DONE Updated library. ``` 2. I ran deleted `phabricator/src/.phutil_module_cache` and ran `arc liberate /src`, verifying that progress was displayed while the map was computed. Reviewers: #blessed_reviewers, epriestley Reviewed By: #blessed_reviewers, epriestley Subscribers: Korvin, epriestley Differential Revision: https://secure.phabricator.com/D21718
This commit is contained in:
parent
f993b1fbda
commit
cd17e84412
3 changed files with 29 additions and 68 deletions
|
@ -12,7 +12,6 @@
|
||||||
final class PhutilLibraryMapBuilder extends Phobject {
|
final class PhutilLibraryMapBuilder extends Phobject {
|
||||||
|
|
||||||
private $root;
|
private $root;
|
||||||
private $quiet = true;
|
|
||||||
private $subprocessLimit = 8;
|
private $subprocessLimit = 8;
|
||||||
|
|
||||||
private $fileSymbolMap;
|
private $fileSymbolMap;
|
||||||
|
@ -38,19 +37,6 @@ final class PhutilLibraryMapBuilder extends Phobject {
|
||||||
$this->root = $root;
|
$this->root = $root;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Control status output. Use `--quiet` to set this.
|
|
||||||
*
|
|
||||||
* @param bool If true, don't show status output.
|
|
||||||
* @return this
|
|
||||||
*
|
|
||||||
* @task map
|
|
||||||
*/
|
|
||||||
public function setQuiet($quiet) {
|
|
||||||
$this->quiet = $quiet;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Control subprocess parallelism limit. Use `--limit` to set this.
|
* Control subprocess parallelism limit. Use `--limit` to set this.
|
||||||
*
|
*
|
||||||
|
@ -108,25 +94,9 @@ final class PhutilLibraryMapBuilder extends Phobject {
|
||||||
public function buildAndWriteMap() {
|
public function buildAndWriteMap() {
|
||||||
$library_map = $this->buildMap();
|
$library_map = $this->buildMap();
|
||||||
|
|
||||||
$this->log(pht('Writing map...'));
|
|
||||||
$this->writeLibraryMap($library_map);
|
$this->writeLibraryMap($library_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Write a status message to the user, if not running in quiet mode.
|
|
||||||
*
|
|
||||||
* @param string Message to write.
|
|
||||||
* @return this
|
|
||||||
*
|
|
||||||
* @task map
|
|
||||||
*/
|
|
||||||
private function log($message) {
|
|
||||||
if (!$this->quiet) {
|
|
||||||
@fwrite(STDERR, "%s\n", $message);
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* -( Path Management )---------------------------------------------------- */
|
/* -( Path Management )---------------------------------------------------- */
|
||||||
|
|
||||||
|
@ -236,11 +206,7 @@ final class PhutilLibraryMapBuilder extends Phobject {
|
||||||
}
|
}
|
||||||
|
|
||||||
$json = json_encode($cache);
|
$json = json_encode($cache);
|
||||||
try {
|
|
||||||
Filesystem::writeFile($cache_file, $json);
|
Filesystem::writeFile($cache_file, $json);
|
||||||
} catch (FilesystemException $ex) {
|
|
||||||
$this->log(pht('Unable to save the cache!'));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -251,7 +217,6 @@ final class PhutilLibraryMapBuilder extends Phobject {
|
||||||
* @task symbol
|
* @task symbol
|
||||||
*/
|
*/
|
||||||
public function dropSymbolCache() {
|
public function dropSymbolCache() {
|
||||||
$this->log(pht('Dropping symbol cache...'));
|
|
||||||
Filesystem::remove($this->getPathForSymbolCache());
|
Filesystem::remove($this->getPathForSymbolCache());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -451,14 +416,10 @@ EOPHP;
|
||||||
*/
|
*/
|
||||||
private function analyzeLibrary() {
|
private function analyzeLibrary() {
|
||||||
// Identify all the ".php" source files in the library.
|
// Identify all the ".php" source files in the library.
|
||||||
$this->log(pht('Finding source files...'));
|
|
||||||
$source_map = $this->loadSourceFileMap();
|
$source_map = $this->loadSourceFileMap();
|
||||||
$this->log(
|
|
||||||
pht('Found %s files.', new PhutilNumber(count($source_map))));
|
|
||||||
|
|
||||||
// Load the symbol cache with existing parsed symbols. This allows us
|
// Load the symbol cache with existing parsed symbols. This allows us
|
||||||
// to remap libraries quickly by analyzing only changed files.
|
// to remap libraries quickly by analyzing only changed files.
|
||||||
$this->log(pht('Loading symbol cache...'));
|
|
||||||
$symbol_cache = $this->loadSymbolCache();
|
$symbol_cache = $this->loadSymbolCache();
|
||||||
|
|
||||||
// If the XHPAST binary is not up-to-date, build it now. Otherwise,
|
// If the XHPAST binary is not up-to-date, build it now. Otherwise,
|
||||||
|
@ -481,23 +442,12 @@ EOPHP;
|
||||||
}
|
}
|
||||||
$futures[$file] = $this->buildSymbolAnalysisFuture($file);
|
$futures[$file] = $this->buildSymbolAnalysisFuture($file);
|
||||||
}
|
}
|
||||||
$this->log(
|
|
||||||
pht('Found %s files in cache.', new PhutilNumber(count($symbol_map))));
|
|
||||||
|
|
||||||
// Run the analyzer on any files which need analysis.
|
// Run the analyzer on any files which need analysis.
|
||||||
if ($futures) {
|
if ($futures) {
|
||||||
$limit = $this->subprocessLimit;
|
$limit = $this->subprocessLimit;
|
||||||
|
|
||||||
$this->log(
|
|
||||||
pht(
|
|
||||||
'Analyzing %s file(s) with %s subprocess(es)...',
|
|
||||||
phutil_count($futures),
|
|
||||||
new PhutilNumber($limit)));
|
|
||||||
|
|
||||||
$progress = new PhutilConsoleProgressBar();
|
$progress = new PhutilConsoleProgressBar();
|
||||||
if ($this->quiet) {
|
|
||||||
$progress->setQuiet(true);
|
|
||||||
}
|
|
||||||
$progress->setTotal(count($futures));
|
$progress->setTotal(count($futures));
|
||||||
|
|
||||||
$futures = id(new FutureIterator($futures))
|
$futures = id(new FutureIterator($futures))
|
||||||
|
@ -525,8 +475,6 @@ EOPHP;
|
||||||
$this->writeSymbolCache($symbol_map, $source_map);
|
$this->writeSymbolCache($symbol_map, $source_map);
|
||||||
|
|
||||||
// Our map is up to date, so either show it on stdout or write it to disk.
|
// Our map is up to date, so either show it on stdout or write it to disk.
|
||||||
$this->log(pht('Building library map...'));
|
|
||||||
|
|
||||||
$this->librarySymbolMap = $this->buildLibraryMap($symbol_map);
|
$this->librarySymbolMap = $this->buildLibraryMap($symbol_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,22 +79,35 @@ EOTEXT
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$any_errors = false;
|
||||||
foreach ($paths as $path) {
|
foreach ($paths as $path) {
|
||||||
$log->writeStatus(
|
$log->writeStatus(
|
||||||
pht('WORK'),
|
pht('WORK'),
|
||||||
pht(
|
pht(
|
||||||
'Updating library: %s',
|
'Updating library: %s',
|
||||||
Filesystem::readablePath($path).DIRECTORY_SEPARATOR));
|
Filesystem::readablePath($path).DIRECTORY_SEPARATOR));
|
||||||
$this->liberatePath($path);
|
$exit_code = $this->liberatePath($path);
|
||||||
|
if ($exit_code !== 0) {
|
||||||
|
$any_errors = true;
|
||||||
|
$log->writeError(
|
||||||
|
pht('ERROR'),
|
||||||
|
pht('Failed to update library: %s', $path));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!$any_errors) {
|
||||||
$log->writeSuccess(
|
$log->writeSuccess(
|
||||||
pht('DONE'),
|
pht('DONE'),
|
||||||
pht('Updated %s librarie(s).', phutil_count($paths)));
|
pht('Updated %s librarie(s).', phutil_count($paths)));
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return int The exit code of running the rebuild-map.php script, which
|
||||||
|
* will be 0 to indicate success or non-zero for failure.
|
||||||
|
*/
|
||||||
private function liberatePath($path) {
|
private function liberatePath($path) {
|
||||||
if (!Filesystem::pathExists($path.'/__phutil_library_init__.php')) {
|
if (!Filesystem::pathExists($path.'/__phutil_library_init__.php')) {
|
||||||
echo tsprintf(
|
echo tsprintf(
|
||||||
|
@ -103,8 +116,7 @@ EOTEXT
|
||||||
'No library currently exists at the path "%s"...',
|
'No library currently exists at the path "%s"...',
|
||||||
$path));
|
$path));
|
||||||
$this->liberateCreateDirectory($path);
|
$this->liberateCreateDirectory($path);
|
||||||
$this->liberateCreateLibrary($path);
|
return $this->liberateCreateLibrary($path);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$version = $this->getLibraryFormatVersion($path);
|
$version = $this->getLibraryFormatVersion($path);
|
||||||
|
@ -119,8 +131,6 @@ EOTEXT
|
||||||
throw new ArcanistUsageException(
|
throw new ArcanistUsageException(
|
||||||
pht("Unknown library version '%s'!", $version));
|
pht("Unknown library version '%s'!", $version));
|
||||||
}
|
}
|
||||||
|
|
||||||
echo tsprintf("%s\n", pht('Done.'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getLibraryFormatVersion($path) {
|
private function getLibraryFormatVersion($path) {
|
||||||
|
@ -140,6 +150,10 @@ EOTEXT
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return int The exit code of running the rebuild-map.php script, which
|
||||||
|
* will be 0 to indicate success or non-zero for failure.
|
||||||
|
*/
|
||||||
private function liberateVersion2($path) {
|
private function liberateVersion2($path) {
|
||||||
$bin = $this->getScriptPath('support/lib/rebuild-map.php');
|
$bin = $this->getScriptPath('support/lib/rebuild-map.php');
|
||||||
|
|
||||||
|
@ -181,10 +195,14 @@ EOTEXT
|
||||||
execx('mkdir -p %R', $path);
|
execx('mkdir -p %R', $path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return int The exit code of running the rebuild-map.php script, which
|
||||||
|
* will be 0 to indicate success or non-zero for failure.
|
||||||
|
*/
|
||||||
private function liberateCreateLibrary($path) {
|
private function liberateCreateLibrary($path) {
|
||||||
$init_path = $path.'/__phutil_library_init__.php';
|
$init_path = $path.'/__phutil_library_init__.php';
|
||||||
if (Filesystem::pathExists($init_path)) {
|
if (Filesystem::pathExists($init_path)) {
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
echo pht("Creating new libphutil library in '%s'.", $path)."\n";
|
echo pht("Creating new libphutil library in '%s'.", $path)."\n";
|
||||||
|
@ -213,7 +231,7 @@ EOTEXT
|
||||||
'__phutil_library_init__.php',
|
'__phutil_library_init__.php',
|
||||||
$path);
|
$path);
|
||||||
Filesystem::writeFile($init_path, $template);
|
Filesystem::writeFile($init_path, $template);
|
||||||
$this->liberateVersion2($path);
|
return $this->liberateVersion2($path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,10 +16,6 @@ EOHELP
|
||||||
$args->parseStandardArguments();
|
$args->parseStandardArguments();
|
||||||
$args->parse(
|
$args->parse(
|
||||||
array(
|
array(
|
||||||
array(
|
|
||||||
'name' => 'quiet',
|
|
||||||
'help' => pht('Do not write status messages to stderr.'),
|
|
||||||
),
|
|
||||||
array(
|
array(
|
||||||
'name' => 'drop-cache',
|
'name' => 'drop-cache',
|
||||||
'help' => pht(
|
'help' => pht(
|
||||||
|
@ -56,7 +52,6 @@ if (count($root) !== 1) {
|
||||||
$root = Filesystem::resolvePath(head($root));
|
$root = Filesystem::resolvePath(head($root));
|
||||||
|
|
||||||
$builder = new PhutilLibraryMapBuilder($root);
|
$builder = new PhutilLibraryMapBuilder($root);
|
||||||
$builder->setQuiet($args->getArg('quiet'));
|
|
||||||
$builder->setSubprocessLimit($args->getArg('limit'));
|
$builder->setSubprocessLimit($args->getArg('limit'));
|
||||||
|
|
||||||
if ($args->getArg('drop-cache')) {
|
if ($args->getArg('drop-cache')) {
|
||||||
|
|
Loading…
Reference in a new issue