current_version; $fetch_ok = $updates->result === 0; $git_log = shell_exec("git log HEAD..$remote_ref --pretty=format:'%h%x1f%ar%x1f%s'"); foreach (explode("\n", trim((string) $git_log)) as $commit_line) { if ($commit_line === '') { continue; } $commit_fields = explode("\x1f", $commit_line, 3); if (count($commit_fields) === 3) { $pending_commits[] = $commit_fields; } } } /* * The queue. Maintenance > Update writes config_update_queued_at and asks the dispatcher for * an immediate run; cron/app_update.php takes the request and runs scripts/update_cli.php in * its own process. Neither column is in the global settings load - one page needs them. * * The column is checked for rather than assumed. This page has to render on an install whose * files are newer than its schema, because that is the state it exists to get people out of. */ $update_queue_available = settingsColumnExists($mysqli, 'config_update_queued_at'); $update_queued_at = null; $cron_last_dispatch_at = null; $update_job = null; if ($update_queue_available) { $update_cron_row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT config_update_queued_at, config_cron_last_dispatch_at FROM settings WHERE company_id = 1")); $update_queued_at = $update_cron_row['config_update_queued_at'] ?? null; $cron_last_dispatch_at = $update_cron_row['config_cron_last_dispatch_at'] ?? null; $update_job = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT cron_job_last_run_at, cron_job_last_status, cron_job_last_error, cron_job_last_error_at FROM cron_jobs WHERE cron_job_name = 'app_update' LIMIT 1")); } // Queueing is only worth offering if something is going to pick the request up $cron_is_running = $update_queue_available && !empty($config_enable_cron) && !empty($cron_last_dispatch_at) && strtotime($cron_last_dispatch_at) > strtotime('-5 minutes'); // version_compare, not > - "2.6.10" is less than "2.6.9" as a plain string comparison, so // the plain comparison silently stops offering database updates once a minor reaches 10. $db_update_available = version_compare(LATEST_DATABASE_VERSION, CURRENT_DATABASE_VERSION, '>'); $app_update_available = !empty($pending_commits); ?>
= escapeHtml(implode("\n", $updates->output)) ?>
Check that Git is installed, that the remote is reachable from this server, and that the web server
user can write to the ITFlow directory. The
forum can help - include
your PHP error log and the output above.
exec and shell_exec disabled, so this page cannot read the Git
remote to tell you whether one is waiting. Queueing still works - cron runs the update from the command
line, which is usually not restricted the same way. Database updates are plain PHP and are unaffected.
= $current_version === '' ? '—' : escapeHtml(substr((string) $current_version, 0, 7)) ?>= escapeHtml($update_job['cron_job_last_error']) ?>Recorded = escapeHtml((string) $update_job['cron_job_last_error_at']) ?>. Clear it from Maintenance > Cron once it has been dealt with.
You are up to date
Everything is going to be alright.
Application files:
= count($pending_commits) ?> commit= count($pending_commits) === 1 ? '' : 's' ?>
behind = escapeHtml("origin/$repo_branch") ?>.
Application files: this server cannot check
= escapeHtml("origin/$repo_branch") ?>, so there may or may not be anything
waiting. Queueing an update when there is nothing to do is harmless.
Database: schema is at = escapeHtml(CURRENT_DATABASE_VERSION) ?> and this code expects = escapeHtml(LATEST_DATABASE_VERSION) ?>. Parts of the app will error until the update runs.
Queue Update
Queue Update hands the job to cron, which runs
scripts/update_cli.php in its own process - it updates the files and then
applies every pending migration, with no request timeout, as the user that owns the
files. It resets the files to = escapeHtml("origin/$repo_branch") ?>, so
local changes to them are lost. A migration that fails part way stops without advancing
the recorded version, so it is safe to queue again once the cause is fixed.
Cron is not checking in, so a queued update will sit there
until it is.
This install cannot queue yet. Queueing needs a schema change it has not
caught up with, so this one has to be started from a shell:
php scripts/update_cli.php, as the user that owns the files. It updates the
files and the database in one step, and Queue Update works from then on.
| Commit | When | Description |
|---|---|---|
= escapeHtml($commit[0]) ?> |
= escapeHtml($commit[1]) ?> | = escapeHtml($commit[2]) ?> |