diff --git a/src/SPC/ConsoleApplication.php b/src/SPC/ConsoleApplication.php index bbbed9b0..1b1d3e19 100644 --- a/src/SPC/ConsoleApplication.php +++ b/src/SPC/ConsoleApplication.php @@ -34,7 +34,7 @@ use Symfony\Component\Console\Application; */ final class ConsoleApplication extends Application { - public const string VERSION = '2.7.8'; + public const string VERSION = '2.7.9'; public function __construct() { diff --git a/src/SPC/builder/extension/maxminddb.php b/src/SPC/builder/extension/maxminddb.php index 7d7ee096..a8422416 100644 --- a/src/SPC/builder/extension/maxminddb.php +++ b/src/SPC/builder/extension/maxminddb.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace SPC\builder\extension; use SPC\builder\Extension; +use SPC\store\FileSystem; use SPC\util\CustomExt; #[CustomExt('maxminddb')] @@ -12,15 +13,13 @@ class maxminddb extends Extension { public function patchBeforeBuildconf(): bool { - if (!is_link(SOURCE_PATH . '/php-src/ext/maxminddb')) { + if (!is_dir(SOURCE_PATH . '/php-src/ext/maxminddb')) { $original = $this->source_dir; - if (PHP_OS_FAMILY === 'Windows') { - f_passthru('cd ' . SOURCE_PATH . '/php-src/ext && mklink /D maxminddb ' . $original . '\ext'); - } else { - f_passthru('cd ' . SOURCE_PATH . '/php-src/ext && ln -s ' . $original . '/ext maxminddb'); - } + FileSystem::copyDir($original . '/ext', SOURCE_PATH . '/php-src/ext/maxminddb'); + $this->source_dir = SOURCE_PATH . '/php-src/ext/maxminddb'; return true; } + $this->source_dir = SOURCE_PATH . '/php-src/ext/maxminddb'; return false; } } diff --git a/src/SPC/store/FileSystem.php b/src/SPC/store/FileSystem.php index 86daefc4..3b88a2bc 100644 --- a/src/SPC/store/FileSystem.php +++ b/src/SPC/store/FileSystem.php @@ -660,11 +660,19 @@ class FileSystem $source = self::convertPath($source); $dest = self::convertPath($dest); - // Try rename first (fast, atomic) - if (@rename($source, $dest)) { - return; + // Check if source and dest are on the same device to avoid cross-device rename errors + $source_stat = @stat($source); + $dest_parent = dirname($dest); + $dest_stat = @stat($dest_parent); + + // Only use rename if on same device + if ($source_stat !== false && $dest_stat !== false && $source_stat['dev'] === $dest_stat['dev']) { + if (@rename($source, $dest)) { + return; + } } + // Fall back to copy + delete for cross-device moves or if rename failed if (is_dir($source)) { self::copyDir($source, $dest); self::removeDir($source);