fix: only treat the last path segment as a filename in path()
isFilePath() checked the entire path for a dot to decide whether path() was given a file or a directory. Because the path includes the location and name, a dot in a parent segment (for example a location like /tmp/my.app) caused a directory argument to be misclassified as a file, so the requested subdirectory was not created. Inspect only the last path segment instead.
This commit is contained in:
1 parent
464f951c9b
commit
f1a81ad34a
2 files changed
+25
-1
No files matched your search
@@ -163,7 +163,12 @@ class TemporaryDirectory
|
|||||||
|
|
||||||
protected function isFilePath(string $path): bool
|
protected function isFilePath(string $path): bool
|
||||||
{
|
{
|
||||||
return str_contains($path, '.');
|
// Only the last segment can be a filename; a dot in a parent segment would
|
||||||
|
// misclassify a directory.
|
||||||
|
$lastSeparator = strrpos($path, DIRECTORY_SEPARATOR);
|
||||||
|
$lastSegment = $lastSeparator === false ? $path : substr($path, $lastSeparator + 1);
|
||||||
|
|
||||||
|
return str_contains($lastSegment, '.');
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function deleteDirectory(string $path): bool
|
protected function deleteDirectory(string $path): bool
|
||||||
|
|||||||
@@ -173,6 +173,25 @@ class TemporaryDirectoryTest extends TestCase
|
|||||||
$this->assertDirectoryExists("{$this->temporaryDirectoryFullPath}/{$subdirectory}");
|
$this->assertDirectoryExists("{$this->temporaryDirectoryFullPath}/{$subdirectory}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @test */
|
||||||
|
public function it_can_create_a_subdirectory_when_the_location_contains_a_dot()
|
||||||
|
{
|
||||||
|
$dottedLocation = rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'my.dotted.location';
|
||||||
|
$this->deleteDirectory($dottedLocation);
|
||||||
|
|
||||||
|
$temporaryDirectory = (new TemporaryDirectory($dottedLocation))
|
||||||
|
->name($this->temporaryDirectory)
|
||||||
|
->create();
|
||||||
|
|
||||||
|
$subdirectory = 'abc';
|
||||||
|
$subdirectoryPath = $temporaryDirectory->path($subdirectory);
|
||||||
|
|
||||||
|
$this->assertDirectoryExists($subdirectoryPath);
|
||||||
|
|
||||||
|
$temporaryDirectory->delete();
|
||||||
|
$this->deleteDirectory($dottedLocation);
|
||||||
|
}
|
||||||
|
|
||||||
/** @test */
|
/** @test */
|
||||||
public function it_can_create_a_multiple_subdirectories_in_the_temporary_directory()
|
public function it_can_create_a_multiple_subdirectories_in_the_temporary_directory()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in new issue
Block a user