mirror of
https://github.com/getgrav/grav.git
synced 2025-11-01 19:05:58 +01:00
48
bin/restore
48
bin/restore
@@ -43,16 +43,21 @@ Usage:
|
|||||||
bin/restore remove [<snapshot-id> ...] [--staging-root=/absolute/path]
|
bin/restore remove [<snapshot-id> ...] [--staging-root=/absolute/path]
|
||||||
Deletes one or more snapshots (interactive selection when no id provided).
|
Deletes one or more snapshots (interactive selection when no id provided).
|
||||||
|
|
||||||
|
bin/restore snapshot [--label=\"optional description\"] [--staging-root=/absolute/path]
|
||||||
|
Creates a manual snapshot of the current Grav core files.
|
||||||
|
|
||||||
bin/restore recovery [status|clear]
|
bin/restore recovery [status|clear]
|
||||||
Shows the recovery flag context or clears it.
|
Shows the recovery flag context or clears it.
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
--staging-root Overrides the staging directory (defaults to configured value).
|
--staging-root Overrides the staging directory (defaults to configured value).
|
||||||
|
--label Optional label to store with the manual snapshot.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
bin/restore list
|
bin/restore list
|
||||||
bin/restore apply stage-68eff31cc4104
|
bin/restore apply stage-68eff31cc4104
|
||||||
bin/restore apply stage-68eff31cc4104 --staging-root=/var/grav-backups
|
bin/restore apply stage-68eff31cc4104 --staging-root=/var/grav-backups
|
||||||
|
bin/restore snapshot --label=\"Before plugin install\"
|
||||||
bin/restore recovery status
|
bin/restore recovery status
|
||||||
bin/restore recovery clear
|
bin/restore recovery clear
|
||||||
USAGE;
|
USAGE;
|
||||||
@@ -274,6 +279,45 @@ function applySnapshot(string $snapshotId, array $options): void
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $options
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function createManualSnapshot(array $options): void
|
||||||
|
{
|
||||||
|
$label = null;
|
||||||
|
if (isset($options['label']) && is_string($options['label'])) {
|
||||||
|
$label = trim($options['label']);
|
||||||
|
if ($label === '') {
|
||||||
|
$label = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$service = createUpgradeService($options);
|
||||||
|
$manifest = $service->createSnapshot($label);
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
fwrite(STDERR, "Snapshot creation failed: " . $e->getMessage() . "\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$snapshotId = $manifest['id'] ?? null;
|
||||||
|
if (!$snapshotId) {
|
||||||
|
$snapshotId = 'unknown';
|
||||||
|
}
|
||||||
|
$version = $manifest['source_version'] ?? $manifest['target_version'] ?? 'unknown';
|
||||||
|
|
||||||
|
echo "Created snapshot {$snapshotId} (Grav {$version}).\n";
|
||||||
|
if ($label) {
|
||||||
|
echo "Label: {$label}\n";
|
||||||
|
}
|
||||||
|
if (!empty($manifest['backup_path'])) {
|
||||||
|
echo "Snapshot path: {$manifest['backup_path']}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param list<array{id:string,source_version:?string,target_version:?string,created_at:int}> $snapshots
|
* @param list<array{id:string,source_version:?string,target_version:?string,created_at:int}> $snapshots
|
||||||
* @return string|null
|
* @return string|null
|
||||||
@@ -520,6 +564,10 @@ switch ($command) {
|
|||||||
applySnapshot($snapshotId, $options);
|
applySnapshot($snapshotId, $options);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'snapshot':
|
||||||
|
createManualSnapshot($options);
|
||||||
|
break;
|
||||||
|
|
||||||
case 'recovery':
|
case 'recovery':
|
||||||
$action = strtolower($arguments[0] ?? 'status');
|
$action = strtolower($arguments[0] ?? 'status');
|
||||||
$manager = new RecoveryManager(GRAV_ROOT);
|
$manager = new RecoveryManager(GRAV_ROOT);
|
||||||
|
|||||||
@@ -210,6 +210,51 @@ class SafeUpgradeService
|
|||||||
return $manifest;
|
return $manifest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a manual snapshot of the current Grav installation.
|
||||||
|
*
|
||||||
|
* @param string|null $label
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function createSnapshot(?string $label = null): array
|
||||||
|
{
|
||||||
|
$entries = $this->collectPackageEntries($this->rootPath);
|
||||||
|
if (!$entries) {
|
||||||
|
throw new RuntimeException('Unable to locate files to snapshot.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$stageId = uniqid('snapshot-', false);
|
||||||
|
$backupPath = $this->stagingRoot . DIRECTORY_SEPARATOR . 'snapshot-' . $stageId;
|
||||||
|
|
||||||
|
$this->reportProgress('snapshot', 'Creating manual snapshot...', null, [
|
||||||
|
'operation' => 'snapshot',
|
||||||
|
'label' => $label,
|
||||||
|
'mode' => 'manual',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->createBackupSnapshot($entries, $backupPath);
|
||||||
|
|
||||||
|
$manifest = $this->buildManifest($stageId, GRAV_VERSION, $this->rootPath, $backupPath, $entries);
|
||||||
|
$manifest['package_path'] = null;
|
||||||
|
if ($label !== null && $label !== '') {
|
||||||
|
$manifest['label'] = $label;
|
||||||
|
}
|
||||||
|
$manifest['operation'] = 'snapshot';
|
||||||
|
$manifest['mode'] = 'manual';
|
||||||
|
|
||||||
|
$this->persistManifest($manifest);
|
||||||
|
$this->pruneOldSnapshots();
|
||||||
|
|
||||||
|
$this->reportProgress('complete', sprintf('Snapshot %s created.', $stageId), 100, [
|
||||||
|
'operation' => 'snapshot',
|
||||||
|
'snapshot' => $stageId,
|
||||||
|
'version' => $manifest['target_version'] ?? null,
|
||||||
|
'mode' => 'manual',
|
||||||
|
]);
|
||||||
|
|
||||||
|
return $manifest;
|
||||||
|
}
|
||||||
|
|
||||||
private function collectPackageEntries(string $packagePath): array
|
private function collectPackageEntries(string $packagePath): array
|
||||||
{
|
{
|
||||||
$entries = [];
|
$entries = [];
|
||||||
|
|||||||
Reference in New Issue
Block a user