Fix broken junctions leading to installation failure on Windows (#11550)
parent
4b210d916e
commit
ce876e7a6f
|
@ -785,6 +785,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)),
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
namespace Composer\Test\Util;
|
||||
|
||||
use Composer\Util\Platform;
|
||||
use Composer\Util\Filesystem;
|
||||
use Composer\Test\TestCase;
|
||||
|
||||
|
@ -317,6 +318,38 @@ class FilesystemTest extends TestCase
|
|||
$this->assertDirectoryDoesNotExist($junction, $junction . ' is not a directory');
|
||||
}
|
||||
|
||||
public function testOverrideJunctions(): void
|
||||
{
|
||||
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(): void
|
||||
{
|
||||
@mkdir($this->workingDir . '/foo/bar', 0777, true);
|
||||
|
|
Loading…
Reference in New Issue