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); ?>

Update

Cannot reach the Git remote
ITFlow updates itself with Git, so nothing below is current until this is fixed. output)) { ?>
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.
This server cannot check for updates
PHP here has 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.
Release
Branch
Not the release branch
Database
Commit
An update was queued at . Cron will start it within a minute; this page will show the new version once it finishes. Nothing is going to pick it up - cron has not checked in recently or the master switch is off. See Maintenance > Cron.
The last queued update did not finish
Recorded . Clear it from Maintenance > Cron once it has been dealt with.

You are up to date

Everything is going to be alright.

Do not update without a backup
A VM snapshot is the safest option - other methods are covered in the docs. Read the changelog first: some releases need manual steps, and this page will not do them for you.
Pending

Application files: commit behind .

Application files: this server cannot check , so there may or may not be anything waiting. Queueing an update when there is nothing to do is harmless.

Database: schema is at and this code expects . 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 , 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.

Pending commits
Commit When Description