Utils: Introduce FilePath::setPermission()

And implement it for the direct access docker case.

Change-Id: I5c91402630a5b010fdbcaab96c435f66a36f2e3e
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2021-08-12 10:29:18 +02:00
parent 04235535a5
commit 27708158db
10 changed files with 54 additions and 0 deletions

View File

@@ -1231,6 +1231,15 @@ QFile::Permissions FilePath::permissions() const
return toFileInfo().permissions(); return toFileInfo().permissions();
} }
bool FilePath::setPermissions(QFile::Permissions permissions) const
{
if (needsDevice()) {
QTC_ASSERT(s_deviceHooks.setPermissions, return false);
return s_deviceHooks.setPermissions(*this, permissions);
}
return QFile(m_data).setPermissions(permissions);
}
OsType FilePath::osType() const OsType FilePath::osType() const
{ {
if (needsDevice()) { if (needsDevice()) {

View File

@@ -137,6 +137,7 @@ public:
bool isNewerThan(const QDateTime &timeStamp) const; bool isNewerThan(const QDateTime &timeStamp) const;
QDateTime lastModified() const; QDateTime lastModified() const;
QFile::Permissions permissions() const; QFile::Permissions permissions() const;
bool setPermissions(QFile::Permissions permissions) const;
OsType osType() const; OsType osType() const;
bool removeFile() const; bool removeFile() const;
bool removeRecursively(QString *error = nullptr) const; bool removeRecursively(QString *error = nullptr) const;

View File

@@ -84,6 +84,7 @@ public:
std::function<bool(const FilePath &, const QByteArray &)> writeFileContents; std::function<bool(const FilePath &, const QByteArray &)> writeFileContents;
std::function<QDateTime(const FilePath &)> lastModified; std::function<QDateTime(const FilePath &)> lastModified;
std::function<QFile::Permissions(const FilePath &)> permissions; std::function<QFile::Permissions(const FilePath &)> permissions;
std::function<bool(const FilePath &, QFile::Permissions)> setPermissions;
std::function<OsType(const FilePath &)> osType; std::function<OsType(const FilePath &)> osType;
std::function<Environment(const FilePath &)> environment; std::function<Environment(const FilePath &)> environment;
std::function<qint64(const FilePath &)> fileSize; std::function<qint64(const FilePath &)> fileSize;

View File

@@ -1294,6 +1294,20 @@ QFileDevice::Permissions DockerDevice::permissions(const FilePath &filePath) con
return perm; return perm;
} }
bool DockerDevice::setPermissions(const FilePath &filePath, QFileDevice::Permissions permissions) const
{
QTC_ASSERT(handlesFile(filePath), return {});
tryCreateLocalFileAccess();
if (hasLocalFileAccess()) {
const FilePath localAccess = mapToLocalAccess(filePath);
LOG("Set permissions? " << filePath.toUserOutput() << localAccess.toUserOutput() << localAccess.permissions());
return localAccess.setPermissions(permissions);
}
QTC_CHECK(false); // FIXME: Implement.
return false;
}
static FilePaths filterEntriesHelper(const FilePath &base, static FilePaths filterEntriesHelper(const FilePath &base,
const QStringList &entries, const QStringList &entries,
const QStringList &nameFilters, const QStringList &nameFilters,

View File

@@ -101,6 +101,7 @@ public:
void runProcess(Utils::QtcProcess &process) const override; void runProcess(Utils::QtcProcess &process) const override;
qint64 fileSize(const Utils::FilePath &filePath) const override; qint64 fileSize(const Utils::FilePath &filePath) const override;
QFileDevice::Permissions permissions(const Utils::FilePath &filePath) const override; QFileDevice::Permissions permissions(const Utils::FilePath &filePath) const override;
bool setPermissions(const Utils::FilePath &filePath, QFileDevice::Permissions permissions) const override;
Utils::Environment systemEnvironment() const override; Utils::Environment systemEnvironment() const override;

View File

@@ -193,6 +193,18 @@ qint64 DesktopDevice::fileSize(const FilePath &filePath) const
return filePath.fileSize(); return filePath.fileSize();
} }
QFile::Permissions DesktopDevice::permissions(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return {});
return filePath.permissions();
}
bool DesktopDevice::setPermissions(const FilePath &filePath, QFile::Permissions permissions) const
{
QTC_ASSERT(handlesFile(filePath), return {});
return filePath.setPermissions(permissions);
}
Environment DesktopDevice::systemEnvironment() const Environment DesktopDevice::systemEnvironment() const
{ {
return Environment::systemEnvironment(); return Environment::systemEnvironment();

View File

@@ -80,6 +80,8 @@ public:
QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override; QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override;
bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override; bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override;
qint64 fileSize(const Utils::FilePath &filePath) const override; qint64 fileSize(const Utils::FilePath &filePath) const override;
QFile::Permissions permissions(const Utils::FilePath &filePath) const override;
bool setPermissions(const Utils::FilePath &filePath, QFile::Permissions) const override;
protected: protected:
DesktopDevice(); DesktopDevice();

View File

@@ -513,6 +513,12 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_unique<DeviceManager
return device->permissions(filePath); return device->permissions(filePath);
}; };
deviceHooks.setPermissions = [](const FilePath &filePath, QFile::Permissions permissions) {
auto device = DeviceManager::deviceForPath(filePath);
QTC_ASSERT(device, return false);
return device->setPermissions(filePath, permissions);
};
deviceHooks.osType = [](const FilePath &filePath) { deviceHooks.osType = [](const FilePath &filePath) {
auto device = DeviceManager::deviceForPath(filePath); auto device = DeviceManager::deviceForPath(filePath);
QTC_ASSERT(device, return OsTypeOther); QTC_ASSERT(device, return OsTypeOther);

View File

@@ -397,6 +397,13 @@ QFileDevice::Permissions IDevice::permissions(const FilePath &filePath) const
return {}; return {};
} }
bool IDevice::setPermissions(const FilePath &filePath, QFile::Permissions) const
{
Q_UNUSED(filePath);
QTC_CHECK(false);
return false;
}
void IDevice::runProcess(QtcProcess &process) const void IDevice::runProcess(QtcProcess &process) const
{ {
Q_UNUSED(process); Q_UNUSED(process);

View File

@@ -265,6 +265,7 @@ public:
virtual bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const; virtual bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const;
virtual QDateTime lastModified(const Utils::FilePath &filePath) const; virtual QDateTime lastModified(const Utils::FilePath &filePath) const;
virtual QFile::Permissions permissions(const Utils::FilePath &filePath) const; virtual QFile::Permissions permissions(const Utils::FilePath &filePath) const;
virtual bool setPermissions(const Utils::FilePath &filePath, QFile::Permissions) const;
virtual void runProcess(Utils::QtcProcess &process) const; virtual void runProcess(Utils::QtcProcess &process) const;
virtual Utils::Environment systemEnvironment() const; virtual Utils::Environment systemEnvironment() const;
virtual qint64 fileSize(const Utils::FilePath &filePath) const; virtual qint64 fileSize(const Utils::FilePath &filePath) const;