diff --git a/src/docs/user/configuration/configuring_backups.diviner b/src/docs/user/configuration/configuring_backups.diviner --- a/src/docs/user/configuration/configuring_backups.diviner +++ b/src/docs/user/configuration/configuring_backups.diviner @@ -42,7 +42,7 @@ Since most of this data is compressible, it may be helpful to run it through gzip prior to storage. For example: - phabricator/ $ ./bin/storage dump | gzip > backup.sql.gz + phabricator/ $ ./bin/storage dump --compress --output backup.sql.gz Then store the backup somewhere safe, like in a box buried under an old tree stump. No one will ever think to look for it there. diff --git a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementDumpWorkflow.php b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementDumpWorkflow.php --- a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementDumpWorkflow.php +++ b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementDumpWorkflow.php @@ -51,24 +51,59 @@ } public function didExecute(PhutilArgumentParser $args) { + $output_file = $args->getArg('output'); + $is_compress = $args->getArg('compress'); + $is_overwrite = $args->getArg('overwrite'); + + if ($is_compress) { + if ($output_file === null) { + throw new PhutilArgumentUsageException( + pht( + 'The "--compress" flag can only be used alongside "--output".')); + } + + if (!function_exists('gzopen')) { + throw new PhutilArgumentUsageException( + pht( + 'The "--compress" flag requires the PHP "zlib" extension, but '. + 'that extension is not available. Install the extension or '. + 'omit the "--compress" option.')); + } + } + + if ($is_overwrite) { + if ($output_file === null) { + throw new PhutilArgumentUsageException( + pht( + 'The "--overwrite" flag can only be used alongside "--output".')); + } + } + + if ($output_file !== null) { + if (Filesystem::pathExists($output_file)) { + if (!$is_overwrite) { + throw new PhutilArgumentUsageException( + pht( + 'Output file "%s" already exists. Use "--overwrite" '. + 'to overwrite.', + $output_file)); + } + } + } + $api = $this->getSingleAPI(); $patches = $this->getPatches(); - $console = PhutilConsole::getConsole(); - $with_indexes = !$args->getArg('no-indexes'); $applied = $api->getAppliedPatches(); if ($applied === null) { - $namespace = $api->getNamespace(); - $console->writeErr( + throw new PhutilArgumentUsageException( pht( - '**Storage Not Initialized**: There is no database storage '. - 'initialized in this storage namespace ("%s"). Use '. - '**%s** to initialize storage.', - $namespace, - './bin/storage upgrade')); - return 1; + 'There is no database storage initialized in the current storage '. + 'namespace ("%s"). Use "bin/storage upgrade" to initialize '. + 'storage or use "--namespace" to choose a different namespace.', + $api->getNamespace())); } $ref = $api->getRef(); @@ -141,38 +176,6 @@ } } - $output_file = $args->getArg('output'); - $is_compress = $args->getArg('compress'); - $is_overwrite = $args->getArg('overwrite'); - - if ($is_compress) { - if ($output_file === null) { - throw new PhutilArgumentUsageException( - pht( - 'The "--compress" flag can only be used alongside "--output".')); - } - } - - if ($is_overwrite) { - if ($output_file === null) { - throw new PhutilArgumentUsageException( - pht( - 'The "--overwrite" flag can only be used alongside "--output".')); - } - } - - if ($output_file !== null) { - if (Filesystem::pathExists($output_file)) { - if (!$is_overwrite) { - throw new PhutilArgumentUsageException( - pht( - 'Output file "%s" already exists. Use "--overwrite" '. - 'to overwrite.', - $output_file)); - } - } - } - $argv = array(); $argv[] = '--hex-blob'; $argv[] = '--single-transaction';