Fix broken junctions leading to installation failure on Windows (#11550)
parent
4b210d916e
commit
ce876e7a6f
|
@ -785,6 +785,12 @@ class Filesystem
|
||||||
if (!is_dir($target)) {
|
if (!is_dir($target)) {
|
||||||
throw new IOException(sprintf('Cannot junction to "%s" as it is not a directory.', $target), 0, null, $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(
|
$cmd = sprintf(
|
||||||
'mklink /J %s %s',
|
'mklink /J %s %s',
|
||||||
ProcessExecutor::escape(str_replace('/', DIRECTORY_SEPARATOR, $junction)),
|
ProcessExecutor::escape(str_replace('/', DIRECTORY_SEPARATOR, $junction)),
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
namespace Composer\Test\Util;
|
namespace Composer\Test\Util;
|
||||||
|
|
||||||
|
use Composer\Util\Platform;
|
||||||
use Composer\Util\Filesystem;
|
use Composer\Util\Filesystem;
|
||||||
use Composer\Test\TestCase;
|
use Composer\Test\TestCase;
|
||||||
|
|
||||||
|
@ -317,6 +318,38 @@ class FilesystemTest extends TestCase
|
||||||
$this->assertDirectoryDoesNotExist($junction, $junction . ' is not a directory');
|
$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
|
public function testCopy(): void
|
||||||
{
|
{
|
||||||
@mkdir($this->workingDir . '/foo/bar', 0777, true);
|
@mkdir($this->workingDir . '/foo/bar', 0777, true);
|
||||||
|
|
Loading…
Reference in New Issue