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 can neither check for
application updates nor apply one. Queue an update instead: cron runs it 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. Update the application files first - they bring the database migrations that the second step then applies.
= 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.
Update App runs git pull. Force Update discards every local change and resets
the files to = escapeHtml("origin/$repo_branch") ?> - use it only when a
normal update will not apply. Both run inside this request and stop if PHP runs out of time.
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]) ?> |