Skip to content

Commit

Permalink
BUGFIX: Adjust path for deep symlinks
Browse files Browse the repository at this point in the history
  • Loading branch information
simonschaufi committed Oct 27, 2023
1 parent 7c371e6 commit 00290c6
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 3 deletions.
13 changes: 12 additions & 1 deletion src/Task/Generic/CreateSymlinksTask.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ public function execute(Node $node, Application $application, Deployment $deploy
foreach ($options['symlinks'] as $linkPath => $sourcePath) {
// creates empty directory if path does not exist
if ($options['createNonExistingSharedDirectories'] === true) {
$commands[] = sprintf('test -e %s || mkdir -p %s', $sourcePath, $sourcePath);
$folderDepth = substr_count($linkPath, '/');
$changedSourceDirectoryAccordingToDeepnessOfLinkPath = $this->changeDeepnessOfPath($sourcePath, $folderDepth);
$commands[] = sprintf('test -e %s || mkdir -p %s', $changedSourceDirectoryAccordingToDeepnessOfLinkPath, $changedSourceDirectoryAccordingToDeepnessOfLinkPath);
}

$commands[] = sprintf('ln -s %s %s', $sourcePath, $linkPath);
Expand All @@ -64,6 +66,15 @@ public function execute(Node $node, Application $application, Deployment $deploy
$this->shell->executeOrSimulate($commands, $node, $deployment);
}

protected function changeDeepnessOfPath(string $path, int $level = 0): string
{
if ($level === 0 || substr($path, 0, 1) === '/') {
return $path;
}
$directoryParts = explode(DIRECTORY_SEPARATOR, $path);
return implode(DIRECTORY_SEPARATOR, array_splice($directoryParts, $level));
}

/**
* @codeCoverageIgnore
*/
Expand Down
45 changes: 43 additions & 2 deletions tests/Unit/Task/Generic/CreateSymlinksTaskTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public function createsSymlinkInConfiguredBasePath(): void
{
$options = [
'symlinks' => ['media' => '../media'],
'genericSymlinksBaseDir' => '/home/foobar/data'
'genericSymlinksBaseDir' => '/home/foobar/data',
];
$this->task->execute($this->node, $this->application, $this->deployment, $options);

Expand All @@ -70,7 +70,7 @@ public function createsSymlinkInConfiguredBasePath(): void
public function doNotTryToCreateSymlinksIfOptionIsSetToFalse(): void
{
$options = [
'createNonExistingSharedDirectories' => false
'createNonExistingSharedDirectories' => false,
];
$this->task->execute($this->node, $this->application, $this->deployment, $options);

Expand Down Expand Up @@ -98,4 +98,45 @@ public function createsMultipleSymlinks(): void
$this->assertCommandExecuted('ln -s ../log log');
$this->assertCommandExecuted('ln -s ../var var');
}

/**
* @test
*/
public function createsMultipleDeepSymlinks(): void
{
$options = [
'symlinks' => [
'var/log' => '../../../shared/var/log',
'var/temp' => '/tmp',
],
];
$this->task->execute($this->node, $this->application, $this->deployment, $options);

$this->assertCommandExecuted("cd {$this->deployment->getApplicationReleasePath($this->node)}");
$this->assertCommandExecuted('test -e ../../shared/var/log || mkdir -p ../../shared/var/log');
$this->assertCommandExecuted('ln -s ../../../shared/var/log var/log');
$this->assertCommandExecuted('test -e /tmp || mkdir -p /tmp');
$this->assertCommandExecuted('ln -s /tmp var/temp');
}

/**
* @test
*/
public function createsMultipleDeepSymlinksWithDifferentBaseDir(): void
{
$options = [
'symlinks' => [
'var/log' => '../../../shared/var/log',
'var/temp' => '/tmp',
],
'genericSymlinksBaseDir' => '/home/foobar/data',
];
$this->task->execute($this->node, $this->application, $this->deployment, $options);

$this->assertCommandExecuted('cd /home/foobar/data');
$this->assertCommandExecuted('test -e ../../shared/var/log || mkdir -p ../../shared/var/log');
$this->assertCommandExecuted('ln -s ../../../shared/var/log var/log');
$this->assertCommandExecuted('test -e /tmp || mkdir -p /tmp');
$this->assertCommandExecuted('ln -s /tmp var/temp');
}
}

0 comments on commit 00290c6

Please sign in to comment.