Skip to content

Commit

Permalink
Make directory creation idempotent
Browse files Browse the repository at this point in the history
  • Loading branch information
frankdejonge committed Dec 24, 2019
1 parent 319ac6b commit d3e08ed
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 6 deletions.
23 changes: 17 additions & 6 deletions src/Local/LocalFilesystem.php
Original file line number Diff line number Diff line change
Expand Up @@ -289,8 +289,14 @@ public function fileExists(string $location): bool
public function createDirectory(string $path, Config $config): void
{
$location = $this->prefixer->prefixPath($path);
$visibility = $config->get('visibility', $config->get('directory_visibilty'));
$visibility = $config->get('visibility', $config->get('directory_visibility'));
$permissions = $this->resolveDirectoryVisibility($visibility);

if (is_dir($location)) {
$this->setPermissions($location, $permissions);
return;
}

error_clear_last();

if ( ! @mkdir($location, $permissions, true)) {
Expand All @@ -305,11 +311,7 @@ public function setVisibility(string $location, $visibility): void
$visibility
);

error_clear_last();
if ( ! @chmod($location, $visibility)) {
$extraMessage = error_get_last()['message'] ?? '';
throw UnableToSetVisibility::atLocation($this->prefixer->stripPrefix($location), $extraMessage);
}
$this->setPermissions($location, $visibility);
}

public function visibility(string $location): string
Expand Down Expand Up @@ -347,4 +349,13 @@ private function listDirectory(string $location): Generator
yield $item;
}
}

private function setPermissions(string $location, int $visibility): void
{
error_clear_last();
if ( ! @chmod($location, $visibility)) {
$extraMessage = error_get_last()['message'] ?? '';
throw UnableToSetVisibility::atLocation($this->prefixer->stripPrefix($location), $extraMessage);
}
}
}
22 changes: 22 additions & 0 deletions src/Local/LocalFilesystemTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,28 @@ public function creating_a_directory()
$this->assertFileHasPermissions(static::ROOT . '/also_private', 0700);
}

/**
* @test
*/
public function not_being_able_to_create_a_directory()
{
$this->expectException(UnableToCreateDirectory::class);
$adapter = new LocalFilesystem('/');
$adapter->createDirectory('/something/', new Config());
}

/**
* @test
*/
public function creating_a_directory_is_idempotent()
{
$adapter = new LocalFilesystem(static::ROOT);
$adapter->createDirectory('/something/', new Config(['visibility' => 'private']));
$this->assertFileHasPermissions(static::ROOT . '/something', 0700);
$adapter->createDirectory('/something/', new Config(['visibility' => 'public']));
$this->assertFileHasPermissions(static::ROOT . '/something', 0755);
}

private function streamWithContents(string $contents)
{
$stream = fopen('php://temp', 'w+b');
Expand Down

0 comments on commit d3e08ed

Please sign in to comment.