1
0
Fork 0

Use copy in selfupdate to fix Windows PHP-8.1 regression (#10446)

pull/11212/head
John Stevenson 2022-01-21 08:48:41 +00:00 committed by GitHub
parent 138e315014
commit b262b7718b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 20 additions and 9 deletions

View File

@ -104,7 +104,9 @@ EOT
$localFilename = realpath($_SERVER['argv'][0]) ?: $_SERVER['argv'][0]; $localFilename = realpath($_SERVER['argv'][0]) ?: $_SERVER['argv'][0];
if ($input->getOption('update-keys')) { if ($input->getOption('update-keys')) {
return $this->fetchKeys($io, $config); $this->fetchKeys($io, $config);
return 0;
} }
// ensure composer.phar location is accessible // ensure composer.phar location is accessible
@ -417,7 +419,14 @@ TAGSPUBKEY
} }
try { try {
if (Platform::isWindows()) {
// use copy to apply permissions from the destination directory
// as rename uses source permissions and may block other users
copy($newFilename, $localFilename);
@unlink($newFilename);
} else {
rename($newFilename, $localFilename); rename($newFilename, $localFilename);
}
return true; return true;
} catch (\Exception $e) { } catch (\Exception $e) {
@ -428,6 +437,7 @@ TAGSPUBKEY
return $this->tryAsWindowsAdmin($localFilename, $newFilename); return $this->tryAsWindowsAdmin($localFilename, $newFilename);
} }
@unlink($newFilename);
$action = 'Composer '.($backupTarget ? 'update' : 'rollback'); $action = 'Composer '.($backupTarget ? 'update' : 'rollback');
throw new FilesystemException($action.' failed: "'.$localFilename.'" could not be written.'.PHP_EOL.$e->getMessage()); throw new FilesystemException($action.' failed: "'.$localFilename.'" could not be written.'.PHP_EOL.$e->getMessage());
} }
@ -528,7 +538,7 @@ TAGSPUBKEY
/** /**
* Invokes a UAC prompt to update composer.phar as an admin * Invokes a UAC prompt to update composer.phar as an admin
* *
* Uses a .vbs script to elevate and run the cmd.exe move command. * Uses a .vbs script to elevate and run the cmd.exe copy command.
* *
* @param string $localFilename The composer.phar location * @param string $localFilename The composer.phar location
* @param string $newFilename The downloaded or backup phar * @param string $newFilename The downloaded or backup phar
@ -554,13 +564,13 @@ TAGSPUBKEY
$checksum = hash_file('sha256', $newFilename); $checksum = hash_file('sha256', $newFilename);
// cmd's internal move is fussy about backslashes // cmd's internal copy is fussy about backslashes
$source = str_replace('/', '\\', $newFilename); $source = str_replace('/', '\\', $newFilename);
$destination = str_replace('/', '\\', $localFilename); $destination = str_replace('/', '\\', $localFilename);
$vbs = <<<EOT $vbs = <<<EOT
Set UAC = CreateObject("Shell.Application") Set UAC = CreateObject("Shell.Application")
UAC.ShellExecute "cmd.exe", "/c move /y ""$source"" ""$destination""", "", "runas", 0 UAC.ShellExecute "cmd.exe", "/c copy /b /y ""$source"" ""$destination""", "", "runas", 0
Wscript.Sleep(300) Wscript.Sleep(300)
EOT; EOT;
@ -568,12 +578,13 @@ EOT;
exec('"'.$script.'"'); exec('"'.$script.'"');
@unlink($script); @unlink($script);
// see if the file was moved // see if the file was copied and is still accessible
if ($result = (hash_file('sha256', $localFilename) === $checksum)) { if ($result = is_readable($localFilename) && (hash_file('sha256', $localFilename) === $checksum)) {
$io->writeError('<info>Operation succeeded.</info>'); $io->writeError('<info>Operation succeeded.</info>');
@unlink($newFilename);
} else { } else {
$io->writeError('<error>Operation failed (file not written). '.$helpMessage.'</error>'); $io->writeError('<error>Operation failed.'.$helpMessage.'</error>');
}; }
return $result; return $result;
} }