diff --git a/autotests/jobtest.h b/autotests/jobtest.h --- a/autotests/jobtest.h +++ b/autotests/jobtest.h @@ -49,6 +49,7 @@ void copyFileToSamePartition(); void copyDirectoryToSamePartition(); void copyDirectoryToExistingDirectory(); + void copyDirectoryToExistingSymlinkedDirectory(); void copyFileToOtherPartition(); void copyDirectoryToOtherPartition(); void copyRelativeSymlinkToSamePartition(); diff --git a/autotests/jobtest.cpp b/autotests/jobtest.cpp --- a/autotests/jobtest.cpp +++ b/autotests/jobtest.cpp @@ -619,6 +619,36 @@ copyLocalDirectory(src, dest, AlreadyExists); } +void JobTest::copyDirectoryToExistingSymlinkedDirectory() +{ + // qDebug(); + // just the same as copyDirectoryToSamePartition, but this time dest is a symlink. + // So we get a file in the symlink dir, "dirFromHome_symlink/dirFromHome" and + // "dirFromHome_symOrigin/dirFromHome" + const QString src = homeTmpDir() + "dirFromHome"; + const QString origSymlink = homeTmpDir() + "dirFromHome_symOrigin"; + const QString targetSymlink = homeTmpDir() + "dirFromHome_symlink"; + createTestDirectory(src); + createTestDirectory(origSymlink); + + bool ok = KIOPrivate::createSymlink(origSymlink, targetSymlink); + if (!ok) { + qFatal("couldn't create symlink: %s", strerror(errno)); + } + QVERIFY(QFileInfo(targetSymlink).isSymLink()); + QVERIFY(QFileInfo(targetSymlink).isDir()); + + KIO::Job *job = KIO::copy(QUrl::fromLocalFile(src), QUrl::fromLocalFile(targetSymlink), KIO::HideProgressInfo); + job->setUiDelegate(nullptr); + job->setUiDelegateExtension(nullptr); + QVERIFY2(job->exec(), qPrintable(job->errorString())); + QVERIFY(QFile::exists(src)); // still there + + // file is visible in both places due to symlink + QVERIFY(QFileInfo(origSymlink + "/dirFromHome").isDir());; + QVERIFY(QFileInfo(targetSymlink + "/dirFromHome").isDir()); +} + void JobTest::copyFileToOtherPartition() { // qDebug(); diff --git a/src/core/copyjob.cpp b/src/core/copyjob.cpp --- a/src/core/copyjob.cpp +++ b/src/core/copyjob.cpp @@ -366,7 +366,7 @@ state = STATE_STATING; const QUrl dest = m_asMethod ? m_dest.adjusted(QUrl::RemoveFilename) : m_dest; // We need isDir() and UDS_LOCAL_PATH (for slaves who set it). Let's assume the latter is part of StatBasic too. - KIO::Job *job = KIO::statDetails(dest, StatJob::DestinationSide, KIO::StatBasic, KIO::HideProgressInfo); + KIO::Job *job = KIO::statDetails(dest, StatJob::DestinationSide, KIO::StatBasic | KIO::StatResolveSymlink, KIO::HideProgressInfo); qCDebug(KIO_COPYJOB_DEBUG) << "CopyJob: stating the dest" << dest; q->addSubjob(job); }