summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libs/utils/filepath.cpp11
-rw-r--r--src/libs/utils/filepath.h1
-rw-r--r--src/libs/utils/fileutils.h1
-rw-r--r--src/plugins/projectexplorer/devicesupport/devicemanager.cpp6
-rw-r--r--src/plugins/projectexplorer/devicesupport/idevice.cpp7
-rw-r--r--src/plugins/projectexplorer/devicesupport/idevice.h1
-rw-r--r--src/plugins/remotelinux/filesystemaccess_test.cpp7
-rw-r--r--src/plugins/remotelinux/filesystemaccess_test.h1
-rw-r--r--src/plugins/remotelinux/linuxdevice.cpp34
-rw-r--r--src/plugins/remotelinux/linuxdevice.h1
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;