]> BookStack Code Mirror - system-cli/blobdiff - src/Commands/UpdateCommand.php
Bumped version
[system-cli] / src / Commands / UpdateCommand.php
index e1b7070181c57df8af67f9aaf870d1e2d9ba6d8c..23ffc2d445d3524bb128fca0a1bdbc301ea61d9e 100644 (file)
@@ -5,8 +5,10 @@ namespace Cli\Commands;
 use Cli\Services\AppLocator;
 use Cli\Services\ArtisanRunner;
 use Cli\Services\ComposerLocator;
+use Cli\Services\Paths;
 use Cli\Services\ProgramRunner;
 use Cli\Services\RequirementsValidator;
+use Phar;
 use Symfony\Component\Console\Command\Command;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputOption;
@@ -30,6 +32,9 @@ class UpdateCommand extends Command
         $output->writeln("<info>Checking system requirements...</info>");
         RequirementsValidator::validate();
 
+        $output->writeln("<info>Checking local Git repository is active...</info>");
+        $this->ensureGitRepoExists($appDir);
+
         $output->writeln("<info>Checking composer exists...</info>");
         $composerLocator = new ComposerLocator($appDir);
         $composer = $composerLocator->getProgram();
@@ -38,9 +43,18 @@ class UpdateCommand extends Command
             $composerLocator->download();
         }
 
+        $cliPath = Phar::running(false);
+        $cliPreUpdateHash = $cliPath ? hash_file('sha256', $cliPath) : '';
+
         $output->writeln("<info>Fetching latest code via Git...</info>");
         $this->updateCodeUsingGit($appDir);
 
+        $cliPostUpdateHash = $cliPath ? hash_file('sha256', $cliPath) : '';
+        if ($cliPostUpdateHash !== $cliPreUpdateHash) {
+            $output->writeln("<error>System CLI file changed during update!\nRe-run the update command to complete the update process.</error>");
+            return Command::FAILURE;
+        }
+
         $output->writeln("<info>Installing PHP dependencies via composer...</info>");
         $this->installComposerDependencies($composer, $appDir);
 
@@ -53,6 +67,8 @@ class UpdateCommand extends Command
         $artisan->run(['config:clear']);
         $artisan->run(['view:clear']);
 
+        $output->writeln("<success>Your BookStack instance at [{$appDir}] has been updated!</success>");
+
         return Command::SUCCESS;
     }
 
@@ -89,4 +105,16 @@ class UpdateCommand extends Command
             throw new CommandError("Failed composer install with errors:\n" . $errors);
         }
     }
+
+    protected function ensureGitRepoExists(string $appDir): void
+    {
+        $expectedPath = Paths::join($appDir, '.git');
+        if (!is_dir($expectedPath)) {
+            $message = "Could not find a local git repository, it does not look like this instance is managed via common means.\n";
+            $message .= "If you are running BookStack via a docker container, you should update following the advised process for the docker container image in use.\n";
+            $message .= "This typically involves pulling and using an updated docker container image.";
+
+            throw new CommandError($message);
+        }
+    }
 }