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 run Git from the web
PHP here has 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.
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.

Both are pending. Update the application files first - they bring the database migrations that the second step then applies.

Application files

commit behind .

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

Update App Force Update Queue Update

Update App runs git pull. Force Update discards every local change and resets the files to - 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 , 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.

Database

Schema is at and this code expects . Parts of the app will error until this is applied.

Update Database

A 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.

Pending commits
Commit When Description