Utils: Implement FilePath::rename()

And uses it in CMake's fileapi reader.

Change-Id: I9e719aa4b253eaca17c6b304eab5e7268fcfab29
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
hjk
2021-06-28 13:57:10 +02:00
parent 782779f8f4
commit 54b4022987
8 changed files with 45 additions and 2 deletions

View File

@@ -1415,6 +1415,15 @@ bool FilePath::copyFile(const FilePath &target) const
return QFile::copy(path(), target.path());
}
bool FilePath::renameFile(const FilePath &target) const
{
if (needsDevice()) {
QTC_ASSERT(s_deviceHooks.renameFile, return false);
return s_deviceHooks.renameFile(*this, target);
}
return QFile::rename(path(), target.path());
}
QTextStream &operator<<(QTextStream &s, const FilePath &fn)
{
return s << fn.toString();

View File

@@ -79,6 +79,7 @@ public:
std::function<bool(const FilePath &)> exists;
std::function<bool(const FilePath &)> removeFile;
std::function<bool(const FilePath &, const FilePath &)> copyFile;
std::function<bool(const FilePath &, const FilePath &)> renameFile;
std::function<FilePath(const FilePath &)> searchInPath;
std::function<QList<FilePath>(const FilePath &, const QStringList &, QDir::Filters)> dirEntries;
std::function<QByteArray(const FilePath &, int)> fileContents;
@@ -167,6 +168,7 @@ public:
QFile::Permissions permissions() const;
bool removeFile() const;
bool copyFile(const FilePath &target) const;
bool renameFile(const FilePath &target) const;
Qt::CaseSensitivity caseSensitivity() const;

View File

@@ -311,8 +311,7 @@ void FileApiReader::makeBackupConfiguration(bool store)
if (reply.exists()) {
if (replyPrev.exists())
FileUtils::removeRecursively(replyPrev);
QDir dir;
if (!dir.rename(reply.toString(), replyPrev.toString()))
if (!reply.renameFile(replyPrev))
Core::MessageManager::writeFlashing(tr("Failed to rename %1 to %2.")
.arg(reply.toString(), replyPrev.toString()));

View File

@@ -887,6 +887,23 @@ bool DockerDevice::copyFile(const FilePath &filePath, const FilePath &target) co
return exitCode == 0;
}
bool DockerDevice::renameFile(const FilePath &filePath, const FilePath &target) const
{
QTC_ASSERT(handlesFile(filePath), return false);
QTC_ASSERT(handlesFile(target), return false);
tryCreateLocalFileAccess();
if (hasLocalFileAccess()) {
const FilePath localAccess = mapToLocalAccess(filePath);
const FilePath localTarget = mapToLocalAccess(target);
const bool res = localAccess.renameFile(localTarget);
LOG("Move " << filePath.toUserOutput() << localAccess.toUserOutput() << localTarget << res);
return res;
}
const CommandLine cmd("mv", {filePath.path(), target.path()});
const int exitCode = d->runSynchronously(cmd);
return exitCode == 0;
}
QDateTime DockerDevice::lastModified(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return {});

View File

@@ -83,6 +83,7 @@ public:
bool exists(const Utils::FilePath &filePath) const override;
bool removeFile(const Utils::FilePath &filePath) const override;
bool copyFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const override;
bool renameFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const override;
Utils::FilePath searchInPath(const Utils::FilePath &filePath) const override;
QList<Utils::FilePath> directoryEntries(const Utils::FilePath &filePath,
const QStringList &nameFilters,

View File

@@ -435,6 +435,12 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_unique<DeviceManager
return device->copyFile(filePath, target);
};
deviceHooks.renameFile = [](const FilePath &filePath, const FilePath &target) {
auto device = DeviceManager::deviceForPath(filePath);
QTC_ASSERT(device, return false);
return device->renameFile(filePath, target);
};
deviceHooks.searchInPath = [](const FilePath &filePath) {
auto device = DeviceManager::deviceForPath(filePath);
QTC_ASSERT(device, return FilePath{});

View File

@@ -289,6 +289,14 @@ bool IDevice::copyFile(const FilePath &filePath, const FilePath &target) const
return false;
}
bool IDevice::renameFile(const FilePath &filePath, const FilePath &target) const
{
Q_UNUSED(filePath);
Q_UNUSED(target);
QTC_CHECK(false);
return false;
}
FilePath IDevice::searchInPath(const FilePath &filePath) const
{
return Environment::systemEnvironment().searchInPath(filePath.path());

View File

@@ -246,6 +246,7 @@ public:
virtual bool exists(const Utils::FilePath &filePath) const;
virtual bool removeFile(const Utils::FilePath &filePath) const;
virtual bool copyFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const;
virtual bool renameFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const;
virtual Utils::FilePath searchInPath(const Utils::FilePath &filePath) const;
virtual QList<Utils::FilePath> directoryEntries(const Utils::FilePath &filePath,
const QStringList &nameFilters,