diff options
-rw-r--r-- | src/libs/utils/filepath.cpp | 11 | ||||
-rw-r--r-- | src/libs/utils/filepath.h | 1 | ||||
-rw-r--r-- | src/libs/utils/fileutils.h | 1 | ||||
-rw-r--r-- | src/plugins/projectexplorer/devicesupport/devicemanager.cpp | 6 | ||||
-rw-r--r-- | src/plugins/projectexplorer/devicesupport/idevice.cpp | 7 | ||||
-rw-r--r-- | src/plugins/projectexplorer/devicesupport/idevice.h | 1 | ||||
-rw-r--r-- | src/plugins/remotelinux/filesystemaccess_test.cpp | 7 | ||||
-rw-r--r-- | src/plugins/remotelinux/filesystemaccess_test.h | 1 | ||||
-rw-r--r-- | src/plugins/remotelinux/linuxdevice.cpp | 34 | ||||
-rw-r--r-- | src/plugins/remotelinux/linuxdevice.h | 1 |
10 files changed, 63 insertions, 7 deletions
diff --git a/src/libs/utils/filepath.cpp b/src/libs/utils/filepath.cpp index 1e8d0eed8d..6246533abc 100644 --- a/src/libs/utils/filepath.cpp +++ b/src/libs/utils/filepath.cpp @@ -40,6 +40,7 @@ #include <QFileInfo> #include <QOperatingSystemVersion> #include <QRegularExpression> +#include <QStorageInfo> #include <QUrl> #include <qplatformdefs.h> @@ -1421,6 +1422,16 @@ qint64 FilePath::fileSize() const 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) { return s << fn.toString(); diff --git a/src/libs/utils/filepath.h b/src/libs/utils/filepath.h index ab1f83d96f..9fa455c45e 100644 --- a/src/libs/utils/filepath.h +++ b/src/libs/utils/filepath.h @@ -119,6 +119,7 @@ public: bool copyFile(const FilePath &target) const; bool renameFile(const FilePath &target) const; qint64 fileSize() const; + qint64 bytesAvailable() const; bool createDir() const; QList<FilePath> dirEntries(const QStringList &nameFilters, QDir::Filters filters = QDir::NoFilter, diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index bcdba3e776..61fac716bf 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -92,6 +92,7 @@ public: std::function<OsType(const FilePath &)> osType; std::function<Environment(const FilePath &)> environment; std::function<qint64(const FilePath &)> fileSize; + std::function<qint64(const FilePath &)> bytesAvailable; template <class ...Args> using Continuation = std::function<void(Args...)>; std::function<void(const Continuation<bool> &, const FilePath &, const FilePath &)> asyncCopyFile; diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index af095ce709..55d76a3a80 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -560,6 +560,12 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_unique<DeviceManager 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); DeviceProcessHooks processHooks; diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index c0d877c8ed..9ed6f24529 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -443,6 +443,13 @@ qint64 IDevice::fileSize(const FilePath &filePath) const return -1; } +qint64 IDevice::bytesAvailable(const Utils::FilePath &filePath) const +{ + Q_UNUSED(filePath) + QTC_CHECK(false); + return -1; +} + IDevice::~IDevice() = default; /*! diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index b8e5765b49..189c3a2303 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -273,6 +273,7 @@ public: virtual void runProcess(Utils::QtcProcess &process) const; virtual Utils::Environment systemEnvironment() const; virtual qint64 fileSize(const Utils::FilePath &filePath) const; + virtual qint64 bytesAvailable(const Utils::FilePath &filePath) const; virtual void aboutToBeRemoved() const {} diff --git a/src/plugins/remotelinux/filesystemaccess_test.cpp b/src/plugins/remotelinux/filesystemaccess_test.cpp index cf1c060c1d..5d45484a7d 100644 --- a/src/plugins/remotelinux/filesystemaccess_test.cpp +++ b/src/plugins/remotelinux/filesystemaccess_test.cpp @@ -122,6 +122,13 @@ void FileSystemAccessTest::testDirStatuses() 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() { FilePath testFilePath = createFile("test"); diff --git a/src/plugins/remotelinux/filesystemaccess_test.h b/src/plugins/remotelinux/filesystemaccess_test.h index e9e9d04752..b0c7a73f05 100644 --- a/src/plugins/remotelinux/filesystemaccess_test.h +++ b/src/plugins/remotelinux/filesystemaccess_test.h @@ -50,6 +50,7 @@ private slots: void cleanupTestCase(); void testDirStatuses(); + void testBytesAvailable(); void testFileActions(); private: diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index f8c374e867..74d9e4586f 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -230,18 +230,18 @@ public: return ok && result == 0; } - QString outputForRunInShell(const CommandLine &cmd) + QString outputForRunInShell(const QString &cmd) { QTC_ASSERT(m_shell, return {}); static int val = 0; const QByteArray delim = QString::number(++val, 16).toUtf8(); - DEBUG("RUN2 " << cmd.toUserOutput()); + DEBUG("RUN2 " << cmd); m_shell->readAllStandardOutput(); // clean possible left-overs const QByteArray marker = "___QTC___" + delim + "_OUTPUT_MARKER___"; - DEBUG(" CMD: " << cmd.toUserOutput().toUtf8() + "\necho " + marker + "\n"); - m_shell->write(cmd.toUserOutput().toUtf8() + "\necho " + marker + "\n"); + DEBUG(" CMD: " << cmd.toUtf8() + "\necho " + marker + "\n"); + m_shell->write(cmd.toUtf8() + "\necho " + marker + "\n"); QByteArray output; while (!output.contains(marker)) { DEBUG("OUTPUT" << output); @@ -249,7 +249,7 @@ public: output.append(m_shell->readAllStandardOutput()); } 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); if (pos >= 0) output = output.left(pos); @@ -272,6 +272,7 @@ public: bool setupShell(); bool runInShell(const CommandLine &cmd, const QByteArray &data = {}); + QString outputForRunInShell(const QString &cmd); QString outputForRunInShell(const CommandLine &cmd); LinuxDevice *q = nullptr; @@ -452,10 +453,10 @@ bool LinuxDevicePrivate::runInShell(const CommandLine &cmd, const QByteArray &da return ret; } -QString LinuxDevicePrivate::outputForRunInShell(const CommandLine &cmd) +QString LinuxDevicePrivate::outputForRunInShell(const QString &cmd) { QMutexLocker locker(&m_shellMutex); - DEBUG(cmd.toUserOutput()); + DEBUG(cmd); if (!m_handler->isRunning()) { const bool ok = setupShell(); QTC_ASSERT(ok, return {}); @@ -468,6 +469,11 @@ QString LinuxDevicePrivate::outputForRunInShell(const CommandLine &cmd) return ret; } +QString LinuxDevicePrivate::outputForRunInShell(const CommandLine &cmd) +{ + return outputForRunInShell(cmd.toUserOutput()); +} + bool LinuxDevice::isExecutableFile(const FilePath &filePath) const { QTC_ASSERT(handlesFile(filePath), return false); @@ -597,6 +603,20 @@ qint64 LinuxDevice::fileSize(const FilePath &filePath) const 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 { QTC_ASSERT(handlesFile(filePath), return {}); diff --git a/src/plugins/remotelinux/linuxdevice.h b/src/plugins/remotelinux/linuxdevice.h index 637e90ccb9..00498dcc2a 100644 --- a/src/plugins/remotelinux/linuxdevice.h +++ b/src/plugins/remotelinux/linuxdevice.h @@ -83,6 +83,7 @@ public: QDateTime lastModified(const Utils::FilePath &filePath) const override; void runProcess(Utils::QtcProcess &process) 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; bool setPermissions(const Utils::FilePath &filePath, QFileDevice::Permissions permissions) const override; |