1
0
Fork 0

Fix broken junctions leading to installation failure on Windows (#11550)

pull/11920/head
Attia A. Ahmed 2023-07-21 11:58:54 +03:00 committed by GitHub
parent 77e89fb3e4
commit 3d5f475703
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 0 deletions

View File

@ -814,6 +814,12 @@ class Filesystem
if (!is_dir($target)) {
throw new IOException(sprintf('Cannot junction to "%s" as it is not a directory.', $target), 0, null, $target);
}
// Removing any previously junction to ensure clean execution.
if (!is_dir($junction) || $this->isJunction($junction)) {
@rmdir($junction);
}
$cmd = sprintf(
'mklink /J %s %s',
ProcessExecutor::escape(str_replace('/', DIRECTORY_SEPARATOR, $junction)),

View File

@ -12,6 +12,7 @@
namespace Composer\Test\Util;
use Composer\Util\Platform;
use Composer\Util\Filesystem;
use Composer\Test\TestCase;
@ -327,6 +328,38 @@ class FilesystemTest extends TestCase
$this->assertFalse(is_dir($junction), $junction . ' is not a directory');
}
public function testOverrideJunctions()
{
if (!Platform::isWindows()) {
$this->markTestSkipped('Only runs on windows');
}
@mkdir($this->workingDir.'/real/nesting/testing', 0777, true);
$fs = new Filesystem();
$old_target = $this->workingDir.'/real/nesting/testing';
$target = $this->workingDir.'/real/../real/nesting';
$junction = $this->workingDir.'/junction';
// Override non-broken junction
$fs->junction($old_target, $junction);
$fs->junction($target, $junction);
$this->assertTrue($fs->isJunction($junction), $junction.': is a junction');
$this->assertTrue($fs->isJunction($target.'/../../junction'), $target.'/../../junction: is a junction');
//Remove junction
$this->assertTrue($fs->removeJunction($junction), $junction . ' has been removed');
// Override broken junction
$fs->junction($old_target, $junction);
$fs->removeDirectory($old_target);
$fs->junction($target, $junction);
$this->assertTrue($fs->isJunction($junction), $junction.': is a junction');
$this->assertTrue($fs->isJunction($target.'/../../junction'), $target.'/../../junction: is a junction');
}
public function testCopy()
{
@mkdir($this->workingDir . '/foo/bar', 0777, true);