Skip to content

Commit 00290c6

Browse files
committed
BUGFIX: Adjust path for deep symlinks
1 parent 7c371e6 commit 00290c6

File tree

2 files changed

+55
-3
lines changed

2 files changed

+55
-3
lines changed

src/Task/Generic/CreateSymlinksTask.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ public function execute(Node $node, Application $application, Deployment $deploy
5555
foreach ($options['symlinks'] as $linkPath => $sourcePath) {
5656
// creates empty directory if path does not exist
5757
if ($options['createNonExistingSharedDirectories'] === true) {
58-
$commands[] = sprintf('test -e %s || mkdir -p %s', $sourcePath, $sourcePath);
58+
$folderDepth = substr_count($linkPath, '/');
59+
$changedSourceDirectoryAccordingToDeepnessOfLinkPath = $this->changeDeepnessOfPath($sourcePath, $folderDepth);
60+
$commands[] = sprintf('test -e %s || mkdir -p %s', $changedSourceDirectoryAccordingToDeepnessOfLinkPath, $changedSourceDirectoryAccordingToDeepnessOfLinkPath);
5961
}
6062

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

69+
protected function changeDeepnessOfPath(string $path, int $level = 0): string
70+
{
71+
if ($level === 0 || substr($path, 0, 1) === '/') {
72+
return $path;
73+
}
74+
$directoryParts = explode(DIRECTORY_SEPARATOR, $path);
75+
return implode(DIRECTORY_SEPARATOR, array_splice($directoryParts, $level));
76+
}
77+
6778
/**
6879
* @codeCoverageIgnore
6980
*/

tests/Unit/Task/Generic/CreateSymlinksTaskTest.php

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public function createsSymlinkInConfiguredBasePath(): void
5555
{
5656
$options = [
5757
'symlinks' => ['media' => '../media'],
58-
'genericSymlinksBaseDir' => '/home/foobar/data'
58+
'genericSymlinksBaseDir' => '/home/foobar/data',
5959
];
6060
$this->task->execute($this->node, $this->application, $this->deployment, $options);
6161

@@ -70,7 +70,7 @@ public function createsSymlinkInConfiguredBasePath(): void
7070
public function doNotTryToCreateSymlinksIfOptionIsSetToFalse(): void
7171
{
7272
$options = [
73-
'createNonExistingSharedDirectories' => false
73+
'createNonExistingSharedDirectories' => false,
7474
];
7575
$this->task->execute($this->node, $this->application, $this->deployment, $options);
7676

@@ -98,4 +98,45 @@ public function createsMultipleSymlinks(): void
9898
$this->assertCommandExecuted('ln -s ../log log');
9999
$this->assertCommandExecuted('ln -s ../var var');
100100
}
101+
102+
/**
103+
* @test
104+
*/
105+
public function createsMultipleDeepSymlinks(): void
106+
{
107+
$options = [
108+
'symlinks' => [
109+
'var/log' => '../../../shared/var/log',
110+
'var/temp' => '/tmp',
111+
],
112+
];
113+
$this->task->execute($this->node, $this->application, $this->deployment, $options);
114+
115+
$this->assertCommandExecuted("cd {$this->deployment->getApplicationReleasePath($this->node)}");
116+
$this->assertCommandExecuted('test -e ../../shared/var/log || mkdir -p ../../shared/var/log');
117+
$this->assertCommandExecuted('ln -s ../../../shared/var/log var/log');
118+
$this->assertCommandExecuted('test -e /tmp || mkdir -p /tmp');
119+
$this->assertCommandExecuted('ln -s /tmp var/temp');
120+
}
121+
122+
/**
123+
* @test
124+
*/
125+
public function createsMultipleDeepSymlinksWithDifferentBaseDir(): void
126+
{
127+
$options = [
128+
'symlinks' => [
129+
'var/log' => '../../../shared/var/log',
130+
'var/temp' => '/tmp',
131+
],
132+
'genericSymlinksBaseDir' => '/home/foobar/data',
133+
];
134+
$this->task->execute($this->node, $this->application, $this->deployment, $options);
135+
136+
$this->assertCommandExecuted('cd /home/foobar/data');
137+
$this->assertCommandExecuted('test -e ../../shared/var/log || mkdir -p ../../shared/var/log');
138+
$this->assertCommandExecuted('ln -s ../../../shared/var/log var/log');
139+
$this->assertCommandExecuted('test -e /tmp || mkdir -p /tmp');
140+
$this->assertCommandExecuted('ln -s /tmp var/temp');
141+
}
101142
}

0 commit comments

Comments
 (0)