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.
Both are pending. Queueing the update covers both - cron applies the files and then the migrations they bring, in that order, in one run.
= count($pending_commits) ?> commit= count($pending_commits) === 1 ? '' : 's' ?>
behind = escapeHtml("origin/$repo_branch") ?>.
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.
Queue Update hands the job to cron, which runs
scripts/update_cli.php in its own process - it updates the files and then the
database, 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.
Cron is not checking in, so a queued update will sit there
until it is.
Apply the database update below first. Queueing an update needs a schema
change this install has not caught up with yet. From a shell,
php scripts/update_cli.php does both in one step.
Schema is at = escapeHtml(CURRENT_DATABASE_VERSION) ?> and this code expects = escapeHtml(LATEST_DATABASE_VERSION) ?>. Parts of the app will error until this is applied.
Update DatabaseA large instance can take a minute or more. If it fails part way it stops without advancing the recorded version, so it is safe to run again after fixing the cause.
| Commit | When | Description |
|---|---|---|
= escapeHtml($commit[0]) ?> |
= escapeHtml($commit[1]) ?> | = escapeHtml($commit[2]) ?> |