git update auto change to edge branch (#3589)

* git update auto change to edge branch
For existing installations using automatic git update, checkout *edge* branch if it was still using *master* or *dev*.

* One more prune

* Fix several small issues

* theirs does not work here

* Use migration mechanism

* Better handling of Migration errors

* Test details

* Fix tests

* Do not use new migration system for now
This commit is contained in:
Alexandre Alapetite
2021-05-15 21:33:43 +02:00
committed by GitHub
parent ffb0e30dde
commit 97ba6261a8
5 changed files with 68 additions and 17 deletions

View File

@@ -6,36 +6,76 @@ class FreshRSS_update_Controller extends Minz_ActionController {
return is_dir(FRESHRSS_PATH . '/.git/');
}
/**
* Automatic change to the new name of edge branch since FreshRSS 1.18.0.
*/
public static function migrateToGitEdge() {
$errorMessage = 'Error during git checkout to edge branch. Please change branch manually!';
if (!is_writable(FRESHRSS_PATH . '/.git/')) {
throw new Exception($errorMessage);
}
exec('git branch --show-current', $output, $return);
if ($return != 0) {
throw new Exception($errorMessage);
}
$line = is_array($output) ? implode('', $output) : $output;
if ($line !== 'master' && $line !== 'dev') {
return true; // not on master or dev, nothing to do
}
Minz_Log::warning('Automatic migration to git edge branch');
unset($output);
exec('git checkout edge --guess -f', $output, $return);
if ($return != 0) {
throw new Exception($errorMessage);
}
unset($output);
exec('git reset --hard FETCH_HEAD', $output, $return);
if ($return != 0) {
throw new Exception($errorMessage);
}
return true;
}
public static function hasGitUpdate() {
$cwd = getcwd();
chdir(FRESHRSS_PATH);
$output = array();
try {
exec('git fetch', $output, $return);
exec('git fetch --prune', $output, $return);
if ($return == 0) {
unset($output);
exec('git status -sb --porcelain remote', $output, $return);
} else {
$line = is_array($output) ? implode('; ', $output) : '' . $output;
$line = is_array($output) ? implode('; ', $output) : $output;
Minz_Log::warning('git fetch warning:' . $line);
}
} catch (Exception $e) {
Minz_Log::warning('git fetch error:' . $e->getMessage());
}
chdir($cwd);
$line = is_array($output) ? implode('; ', $output) : '' . $output;
return strpos($line, '[behind') !== false || strpos($line, '[ahead') !== false;
$line = is_array($output) ? implode('; ', $output) : $output;
return $line == '' ||
strpos($line, '[behind') !== false || strpos($line, '[ahead') !== false || strpos($line, '[gone') !== false;
}
public static function gitPull() {
$cwd = getcwd();
chdir(FRESHRSS_PATH);
$output = '';
$output = [];
$return = 1;
try {
exec('git fetch', $output, $return);
exec('git fetch --prune', $output, $return);
if ($return == 0) {
unset($output);
exec('git reset --hard FETCH_HEAD', $output, $return);
}
self::migrateToGitEdge();
} catch (Exception $e) {
Minz_Log::warning('Git error:' . $e->getMessage());
if ($output == '') {
@@ -44,7 +84,7 @@ class FreshRSS_update_Controller extends Minz_ActionController {
$return = 1;
}
chdir($cwd);
$line = is_array($output) ? implode('; ', $output) : '' . $output;
$line = is_array($output) ? implode('; ', $output) : $output;
return $return == 0 ? true : 'Git error: ' . $line;
}

View File

@@ -103,7 +103,7 @@ class Minz_Migrator
if (!$migrator->upToDate()) {
// still not up to date? It means last migration failed.
return 'A migration failed to be applied, please see previous logs';
return trim('A migration failed to be applied, please see previous logs.' . "\n" . implode("\n", $results));
}
return true;

View File

@@ -548,15 +548,25 @@ function getNonStandardShortcuts($shortcuts) {
}
function errorMessage($errorTitle, $error = '') {
// Prevent empty <h2> tags by checking if error isn't empty first
if ('' !== $error) {
$error = htmlspecialchars($error, ENT_NOQUOTES, 'UTF-8');
$error = "<h2>{$error}</h2>";
}
$errorTitle = htmlspecialchars($errorTitle, ENT_NOQUOTES, 'UTF-8');
$message = '';
$details = '';
// Prevent empty tags by checking if error isn not empty first
if ($error) {
$error = htmlspecialchars($error, ENT_NOQUOTES, 'UTF-8');
// First line is the main message, other lines are the details
list($message, $details) = explode("\n", $error, 2);
$message = "<h2>{$message}</h2>";
$details = "<pre>{$details}</pre>";
}
return <<<MSG
<h1>{$errorTitle}</h1>
{$error}
{$message}
{$details}
<h2>Check the logs</h2>
<p>FreshRSS logs are located in <code>./FreshRSS/data/users/*/log*.txt</code></p>
<p><em>N.B.:</em> A typical problem is wrong file permissions in the <code>./FreshRSS/data/</code> folder

View File

@@ -63,8 +63,8 @@ if (!file_exists($applied_migrations_path)) {
}
if ($error) {
Minz_Log::error($error);
errorMessage('Fatal error');
syslog(LOG_INFO, 'FreshRSS Fatal error! ' . $error);
Minz_Log::error($error);
die(errorMessage('Fatal error', $error));
}
}

View File

@@ -310,9 +310,10 @@ class MigratorTest extends TestCase
public function testExecuteFailsIfAMigrationIsFailing() {
$migrations_path = TESTS_PATH . '/fixtures/migrations_with_failing/';
$applied_migrations_path = tempnam('/tmp', 'applied_migrations.txt');
$expected_result = 'A migration failed to be applied, please see previous logs';
$expected_result = 'A migration failed to be applied, please see previous logs.';
$result = Minz_Migrator::execute($migrations_path, $applied_migrations_path);
list($result, ) = explode("\n", $result, 2);
$this->assertSame($expected_result, $result);
$versions = file_get_contents($applied_migrations_path);