Skip to content

Commit ec7c144

Browse files
committed
[Filesystem] Add appendToFile()
1 parent 0ab6628 commit ec7c144

File tree

2 files changed

+81
-1
lines changed

2 files changed

+81
-1
lines changed

src/Symfony/Component/Filesystem/Filesystem.php

+18-1
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ public function tempnam($dir, $prefix)
624624
* @param string $filename The file to be written to
625625
* @param string $content The data to write into the file
626626
*
627-
* @throws IOException If the file cannot be written to.
627+
* @throws IOException If the file cannot be written to
628628
*/
629629
public function dumpFile($filename, $content)
630630
{
@@ -648,6 +648,23 @@ public function dumpFile($filename, $content)
648648
$this->rename($tmpFile, $filename, true);
649649
}
650650

651+
/**
652+
* Atomically appends content to an existing file.
653+
*
654+
* @param string $filename The file for which to append content
655+
* @param string $content The content to append
656+
*
657+
* @throws IOException If the file is not writable
658+
*/
659+
public function appendToFile($filename, $content)
660+
{
661+
if (false !== $originalContent = @file_get_contents($filename)) {
662+
$content = $originalContent.$content;
663+
}
664+
665+
return $this->dumpFile($filename, $content);
666+
}
667+
651668
/**
652669
* @param mixed $files
653670
*

src/Symfony/Component/Filesystem/Tests/FilesystemTest.php

+63
Original file line numberDiff line numberDiff line change
@@ -1406,6 +1406,69 @@ public function testDumpFileWithZlibScheme()
14061406
$this->assertSame('bar', file_get_contents($filename));
14071407
}
14081408

1409+
public function testAppendToFile()
1410+
{
1411+
$filename = $this->workspace.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'bar.txt';
1412+
$this->filesystem->dumpFile($filename, 'foo');
1413+
1414+
// skip mode check on Windows
1415+
if ('\\' !== DIRECTORY_SEPARATOR) {
1416+
$oldMask = umask(0002);
1417+
}
1418+
1419+
$this->filesystem->appendToFile($filename, 'bar');
1420+
1421+
$this->assertFileExists($filename);
1422+
$this->assertSame('foobar', file_get_contents($filename));
1423+
1424+
// skip mode check on Windows
1425+
if ('\\' !== DIRECTORY_SEPARATOR) {
1426+
$this->assertFilePermissions(664, $filename);
1427+
umask($oldMask);
1428+
}
1429+
}
1430+
1431+
public function testAppendToFileWithScheme()
1432+
{
1433+
if (defined('HHVM_VERSION')) {
1434+
$this->markTestSkipped('HHVM does not handle the file:// scheme correctly');
1435+
}
1436+
1437+
$scheme = 'file://';
1438+
$filename = $scheme.$this->workspace.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'baz.txt';
1439+
$this->filesystem->dumpFile($filename, 'foo');
1440+
1441+
$this->filesystem->appendToFile($filename, 'bar');
1442+
1443+
$this->assertFileExists($filename);
1444+
$this->assertSame('foobar', file_get_contents($filename));
1445+
}
1446+
1447+
public function testAppendToFileWithZlibScheme()
1448+
{
1449+
$scheme = 'compress.zlib://';
1450+
$filename = $this->workspace.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'baz.txt';
1451+
$this->filesystem->dumpFile($filename, 'foo');
1452+
1453+
// Zlib stat uses file:// wrapper so remove it
1454+
$this->assertSame('foo', file_get_contents(str_replace($scheme, '', $filename)));
1455+
1456+
$this->filesystem->appendToFile($filename, 'bar');
1457+
1458+
$this->assertFileExists($filename);
1459+
$this->assertSame('foobar', file_get_contents($filename));
1460+
}
1461+
1462+
public function testAppendToFileCreateTheFileIfNotExists()
1463+
{
1464+
$filename = $this->workspace.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'bar.txt';
1465+
1466+
$this->filesystem->appendToFile($filename, 'bar');
1467+
1468+
$this->assertFileExists($filename);
1469+
$this->assertSame('bar', file_get_contents($filename));
1470+
}
1471+
14091472
public function testCopyShouldKeepExecutionPermission()
14101473
{
14111474
$this->markAsSkippedIfChmodIsMissing();

0 commit comments

Comments
 (0)