static function perform($from, $to) { $from = gb::version_parse($from); $to = gb::version_parse($to); $froms = gb::version_format($from); $tos = gb::version_format($to); if ($from === $to) { return null; } $is_upgrade = $from < $to; $stages = self::build_stages($from, $to); gb::log('%s gitblog %s -> %s in %d stages', $is_upgrade ? 'upgrading' : 'downgrading', $froms, $tos, count($stages)); # don't break on client abort ignore_user_abort(true); foreach ($stages as $v => $stagefunc) { $prevvs = gb::version_format($v > 0 ? $v - 1 : $v); gb::log('%s -> %s (%s)', $prevvs, gb::version_format($v), $stagefunc[1], $v); # write prev version to site.json so next run will take off where we crashed, if we crash. $orig_v = gb::$version; gb::$version = $prevvs; gb_maint::sync_site_state(); gb::$version = $orig_v; $stages[$v] = call_user_func($stagefunc, $from, $to); } gb_maint::sync_site_state(); return $stages; }