forked from qt-creator/qt-creator
Introduce IDevice::bytesAvailable()
It's going to replace RemoteLinuxCheckForFreeDiskSpaceService. Change-Id: If8c30a57b9013387c69412f12102bcd4d41a88b5 Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -40,6 +40,7 @@
|
|||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QOperatingSystemVersion>
|
#include <QOperatingSystemVersion>
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
|
#include <QStorageInfo>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
#include <qplatformdefs.h>
|
#include <qplatformdefs.h>
|
||||||
|
|
||||||
@@ -1421,6 +1422,16 @@ qint64 FilePath::fileSize() const
|
|||||||
return QFileInfo(m_data).size();
|
return QFileInfo(m_data).size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qint64 FilePath::bytesAvailable() const
|
||||||
|
{
|
||||||
|
if (needsDevice()) {
|
||||||
|
QTC_ASSERT(s_deviceHooks.bytesAvailable, return false);
|
||||||
|
return s_deviceHooks.bytesAvailable(*this);
|
||||||
|
}
|
||||||
|
return QStorageInfo(m_data).bytesAvailable();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
QTextStream &operator<<(QTextStream &s, const FilePath &fn)
|
QTextStream &operator<<(QTextStream &s, const FilePath &fn)
|
||||||
{
|
{
|
||||||
return s << fn.toString();
|
return s << fn.toString();
|
||||||
|
|||||||
@@ -119,6 +119,7 @@ public:
|
|||||||
bool copyFile(const FilePath &target) const;
|
bool copyFile(const FilePath &target) const;
|
||||||
bool renameFile(const FilePath &target) const;
|
bool renameFile(const FilePath &target) const;
|
||||||
qint64 fileSize() const;
|
qint64 fileSize() const;
|
||||||
|
qint64 bytesAvailable() const;
|
||||||
bool createDir() const;
|
bool createDir() const;
|
||||||
QList<FilePath> dirEntries(const QStringList &nameFilters,
|
QList<FilePath> dirEntries(const QStringList &nameFilters,
|
||||||
QDir::Filters filters = QDir::NoFilter,
|
QDir::Filters filters = QDir::NoFilter,
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ public:
|
|||||||
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;
|
||||||
|
std::function<qint64(const FilePath &)> bytesAvailable;
|
||||||
|
|
||||||
template <class ...Args> using Continuation = std::function<void(Args...)>;
|
template <class ...Args> using Continuation = std::function<void(Args...)>;
|
||||||
std::function<void(const Continuation<bool> &, const FilePath &, const FilePath &)> asyncCopyFile;
|
std::function<void(const Continuation<bool> &, const FilePath &, const FilePath &)> asyncCopyFile;
|
||||||
|
|||||||
@@ -560,6 +560,12 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_unique<DeviceManager
|
|||||||
return device->fileSize(filePath);
|
return device->fileSize(filePath);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
deviceHooks.bytesAvailable = [](const FilePath &filePath) {
|
||||||
|
auto device = DeviceManager::deviceForPath(filePath);
|
||||||
|
QTC_ASSERT(device, return qint64(-1));
|
||||||
|
return device->bytesAvailable(filePath);
|
||||||
|
};
|
||||||
|
|
||||||
FileUtils::setDeviceFileHooks(deviceHooks);
|
FileUtils::setDeviceFileHooks(deviceHooks);
|
||||||
|
|
||||||
DeviceProcessHooks processHooks;
|
DeviceProcessHooks processHooks;
|
||||||
|
|||||||
@@ -443,6 +443,13 @@ qint64 IDevice::fileSize(const FilePath &filePath) const
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qint64 IDevice::bytesAvailable(const Utils::FilePath &filePath) const
|
||||||
|
{
|
||||||
|
Q_UNUSED(filePath)
|
||||||
|
QTC_CHECK(false);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
IDevice::~IDevice() = default;
|
IDevice::~IDevice() = default;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -273,6 +273,7 @@ public:
|
|||||||
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;
|
||||||
|
virtual qint64 bytesAvailable(const Utils::FilePath &filePath) const;
|
||||||
|
|
||||||
virtual void aboutToBeRemoved() const {}
|
virtual void aboutToBeRemoved() const {}
|
||||||
|
|
||||||
|
|||||||
@@ -122,6 +122,13 @@ void FileSystemAccessTest::testDirStatuses()
|
|||||||
QVERIFY(!testFilePath.exists());
|
QVERIFY(!testFilePath.exists());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FileSystemAccessTest::testBytesAvailable()
|
||||||
|
{
|
||||||
|
FilePath testFilePath = FilePath::fromString("ssh://" + QString(TEST_IP) + "/tmp");
|
||||||
|
QVERIFY(testFilePath.exists());
|
||||||
|
QVERIFY(testFilePath.bytesAvailable() > 0);
|
||||||
|
}
|
||||||
|
|
||||||
void FileSystemAccessTest::testFileActions()
|
void FileSystemAccessTest::testFileActions()
|
||||||
{
|
{
|
||||||
FilePath testFilePath = createFile("test");
|
FilePath testFilePath = createFile("test");
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ private slots:
|
|||||||
void cleanupTestCase();
|
void cleanupTestCase();
|
||||||
|
|
||||||
void testDirStatuses();
|
void testDirStatuses();
|
||||||
|
void testBytesAvailable();
|
||||||
void testFileActions();
|
void testFileActions();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -230,18 +230,18 @@ public:
|
|||||||
return ok && result == 0;
|
return ok && result == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString outputForRunInShell(const CommandLine &cmd)
|
QString outputForRunInShell(const QString &cmd)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(m_shell, return {});
|
QTC_ASSERT(m_shell, return {});
|
||||||
|
|
||||||
static int val = 0;
|
static int val = 0;
|
||||||
const QByteArray delim = QString::number(++val, 16).toUtf8();
|
const QByteArray delim = QString::number(++val, 16).toUtf8();
|
||||||
|
|
||||||
DEBUG("RUN2 " << cmd.toUserOutput());
|
DEBUG("RUN2 " << cmd);
|
||||||
m_shell->readAllStandardOutput(); // clean possible left-overs
|
m_shell->readAllStandardOutput(); // clean possible left-overs
|
||||||
const QByteArray marker = "___QTC___" + delim + "_OUTPUT_MARKER___";
|
const QByteArray marker = "___QTC___" + delim + "_OUTPUT_MARKER___";
|
||||||
DEBUG(" CMD: " << cmd.toUserOutput().toUtf8() + "\necho " + marker + "\n");
|
DEBUG(" CMD: " << cmd.toUtf8() + "\necho " + marker + "\n");
|
||||||
m_shell->write(cmd.toUserOutput().toUtf8() + "\necho " + marker + "\n");
|
m_shell->write(cmd.toUtf8() + "\necho " + marker + "\n");
|
||||||
QByteArray output;
|
QByteArray output;
|
||||||
while (!output.contains(marker)) {
|
while (!output.contains(marker)) {
|
||||||
DEBUG("OUTPUT" << output);
|
DEBUG("OUTPUT" << output);
|
||||||
@@ -249,7 +249,7 @@ public:
|
|||||||
output.append(m_shell->readAllStandardOutput());
|
output.append(m_shell->readAllStandardOutput());
|
||||||
}
|
}
|
||||||
DEBUG("GOT2 " << output);
|
DEBUG("GOT2 " << output);
|
||||||
LOG("Run command in shell:" << cmd.toUserOutput() << "output size:" << output.size());
|
LOG("Run command in shell:" << cmd << "output size:" << output.size());
|
||||||
const int pos = output.indexOf(marker);
|
const int pos = output.indexOf(marker);
|
||||||
if (pos >= 0)
|
if (pos >= 0)
|
||||||
output = output.left(pos);
|
output = output.left(pos);
|
||||||
@@ -272,6 +272,7 @@ public:
|
|||||||
|
|
||||||
bool setupShell();
|
bool setupShell();
|
||||||
bool runInShell(const CommandLine &cmd, const QByteArray &data = {});
|
bool runInShell(const CommandLine &cmd, const QByteArray &data = {});
|
||||||
|
QString outputForRunInShell(const QString &cmd);
|
||||||
QString outputForRunInShell(const CommandLine &cmd);
|
QString outputForRunInShell(const CommandLine &cmd);
|
||||||
|
|
||||||
LinuxDevice *q = nullptr;
|
LinuxDevice *q = nullptr;
|
||||||
@@ -452,10 +453,10 @@ bool LinuxDevicePrivate::runInShell(const CommandLine &cmd, const QByteArray &da
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString LinuxDevicePrivate::outputForRunInShell(const CommandLine &cmd)
|
QString LinuxDevicePrivate::outputForRunInShell(const QString &cmd)
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&m_shellMutex);
|
QMutexLocker locker(&m_shellMutex);
|
||||||
DEBUG(cmd.toUserOutput());
|
DEBUG(cmd);
|
||||||
if (!m_handler->isRunning()) {
|
if (!m_handler->isRunning()) {
|
||||||
const bool ok = setupShell();
|
const bool ok = setupShell();
|
||||||
QTC_ASSERT(ok, return {});
|
QTC_ASSERT(ok, return {});
|
||||||
@@ -468,6 +469,11 @@ QString LinuxDevicePrivate::outputForRunInShell(const CommandLine &cmd)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString LinuxDevicePrivate::outputForRunInShell(const CommandLine &cmd)
|
||||||
|
{
|
||||||
|
return outputForRunInShell(cmd.toUserOutput());
|
||||||
|
}
|
||||||
|
|
||||||
bool LinuxDevice::isExecutableFile(const FilePath &filePath) const
|
bool LinuxDevice::isExecutableFile(const FilePath &filePath) const
|
||||||
{
|
{
|
||||||
QTC_ASSERT(handlesFile(filePath), return false);
|
QTC_ASSERT(handlesFile(filePath), return false);
|
||||||
@@ -597,6 +603,20 @@ qint64 LinuxDevice::fileSize(const FilePath &filePath) const
|
|||||||
return output.toLongLong();
|
return output.toLongLong();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qint64 LinuxDevice::bytesAvailable(const FilePath &filePath) const
|
||||||
|
{
|
||||||
|
QTC_ASSERT(handlesFile(filePath), return -1);
|
||||||
|
CommandLine cmd("df", {"-k"});
|
||||||
|
cmd.addArg(filePath.path());
|
||||||
|
cmd.addArgs("|tail -n 1 |sed 's/ */ /g'|cut -d ' ' -f 4", CommandLine::Raw);
|
||||||
|
const QString output = d->outputForRunInShell(cmd.toUserOutput());
|
||||||
|
bool ok = false;
|
||||||
|
const qint64 size = output.toLongLong(&ok);
|
||||||
|
if (ok)
|
||||||
|
return size * 1024;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
QFileDevice::Permissions LinuxDevice::permissions(const FilePath &filePath) const
|
QFileDevice::Permissions LinuxDevice::permissions(const FilePath &filePath) const
|
||||||
{
|
{
|
||||||
QTC_ASSERT(handlesFile(filePath), return {});
|
QTC_ASSERT(handlesFile(filePath), return {});
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ public:
|
|||||||
QDateTime lastModified(const Utils::FilePath &filePath) const override;
|
QDateTime lastModified(const Utils::FilePath &filePath) const override;
|
||||||
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;
|
||||||
|
qint64 bytesAvailable(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;
|
bool setPermissions(const Utils::FilePath &filePath, QFileDevice::Permissions permissions) const override;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user