Here are two issues:
1. PhingFile::delete() uses FileSystem::checkAccess() before it attempts to delete the file. FileSystem::checkAccess() uses is_writable() to check the file, but does not take into account the fact that is_writable() checks access rights of the file pointed by symlink, not of symlink itself.
2. Checking if file is writable to determine if it could be deleted is completely wrong . On most Unix platforms to be able to delete file you have to have write permissions on the directory containing the file you wish to delete. You don't have to be able to write to file itself.
Thus I propose a fix (see attached file): add abstract method FileSystem::canDelete(PhingFile $f) and override it in descendant classes. In PhingFile::delete() use FileSystem::canDelete() instead of FileSystem::checkAccess() to determine if delete attempt would fail.