forked from qt-creator/qt-creator
Utils: Fix fileInfoFlagsfromStatMode
Previously the checks for the mode bits were incorrectly using AND checks. As a fix the contents of "stat.h" was copied and converted so it can be used directly and on platforms that do not contain stat.h Change-Id: If735dcffb8ffc490d297dae7f8c43ae01e79f460 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -47,6 +47,11 @@ struct FilePathInfo
|
|||||||
|
|
||||||
Q_DECLARE_FLAGS(FileFlags, FileFlag)
|
Q_DECLARE_FLAGS(FileFlags, FileFlag)
|
||||||
|
|
||||||
|
bool operator==(const FilePathInfo &other) const
|
||||||
|
{
|
||||||
|
return fileSize == other.fileSize && fileFlags == other.fileFlags
|
||||||
|
&& lastModified == other.lastModified;
|
||||||
|
}
|
||||||
|
|
||||||
qint64 fileSize = 0;
|
qint64 fileSize = 0;
|
||||||
FileFlags fileFlags;
|
FileFlags fileFlags;
|
||||||
|
|||||||
@@ -586,8 +586,36 @@ FilePaths FileUtils::getOpenFilePaths(QWidget *parent,
|
|||||||
|
|
||||||
#endif // QT_WIDGETS_LIB
|
#endif // QT_WIDGETS_LIB
|
||||||
|
|
||||||
|
// Converts a hex string of the st_mode field of a stat structure to FileFlags.
|
||||||
FilePathInfo::FileFlags fileInfoFlagsfromStatRawModeHex(const QString &hexString)
|
FilePathInfo::FileFlags fileInfoFlagsfromStatRawModeHex(const QString &hexString)
|
||||||
{
|
{
|
||||||
|
// Copied from stat.h
|
||||||
|
enum st_mode {
|
||||||
|
IFMT = 00170000,
|
||||||
|
IFSOCK = 0140000,
|
||||||
|
IFLNK = 0120000,
|
||||||
|
IFREG = 0100000,
|
||||||
|
IFBLK = 0060000,
|
||||||
|
IFDIR = 0040000,
|
||||||
|
IFCHR = 0020000,
|
||||||
|
IFIFO = 0010000,
|
||||||
|
ISUID = 0004000,
|
||||||
|
ISGID = 0002000,
|
||||||
|
ISVTX = 0001000,
|
||||||
|
IRWXU = 00700,
|
||||||
|
IRUSR = 00400,
|
||||||
|
IWUSR = 00200,
|
||||||
|
IXUSR = 00100,
|
||||||
|
IRWXG = 00070,
|
||||||
|
IRGRP = 00040,
|
||||||
|
IWGRP = 00020,
|
||||||
|
IXGRP = 00010,
|
||||||
|
IRWXO = 00007,
|
||||||
|
IROTH = 00004,
|
||||||
|
IWOTH = 00002,
|
||||||
|
IXOTH = 00001,
|
||||||
|
};
|
||||||
|
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
uint mode = hexString.toUInt(&ok, 16);
|
uint mode = hexString.toUInt(&ok, 16);
|
||||||
|
|
||||||
@@ -595,31 +623,32 @@ FilePathInfo::FileFlags fileInfoFlagsfromStatRawModeHex(const QString &hexString
|
|||||||
|
|
||||||
FilePathInfo::FileFlags result;
|
FilePathInfo::FileFlags result;
|
||||||
|
|
||||||
if (mode & 0x100) // S_IRUSR
|
if (mode & IRUSR)
|
||||||
result |= FilePathInfo::ReadOwnerPerm;
|
result |= FilePathInfo::ReadOwnerPerm;
|
||||||
if (mode & 0x80) // S_IWUSR
|
if (mode & IWUSR)
|
||||||
result |= FilePathInfo::WriteOwnerPerm;
|
result |= FilePathInfo::WriteOwnerPerm;
|
||||||
if (mode & 0x40) // S_IXUSR
|
if (mode & IXUSR)
|
||||||
result |= FilePathInfo::ExeOwnerPerm;
|
result |= FilePathInfo::ExeOwnerPerm;
|
||||||
if (mode & 0x20) // S_IRGRP
|
if (mode & IRGRP)
|
||||||
result |= FilePathInfo::ReadGroupPerm;
|
result |= FilePathInfo::ReadGroupPerm;
|
||||||
if (mode & 0x10) // S_IWGRP
|
if (mode & IWGRP)
|
||||||
result |= FilePathInfo::WriteGroupPerm;
|
result |= FilePathInfo::WriteGroupPerm;
|
||||||
if (mode & 0x8) // S_IXGRP
|
if (mode & IXGRP)
|
||||||
result |= FilePathInfo::ExeGroupPerm;
|
result |= FilePathInfo::ExeGroupPerm;
|
||||||
if (mode & 0x4) // S_IROTH
|
if (mode & IROTH)
|
||||||
result |= FilePathInfo::ReadOtherPerm;
|
result |= FilePathInfo::ReadOtherPerm;
|
||||||
if (mode & 0x2) // S_IWOTH
|
if (mode & IWOTH)
|
||||||
result |= FilePathInfo::WriteOtherPerm;
|
result |= FilePathInfo::WriteOtherPerm;
|
||||||
if (mode & 0x1) // S_IXOTH
|
if (mode & IXOTH)
|
||||||
result |= FilePathInfo::ExeOtherPerm;
|
result |= FilePathInfo::ExeOtherPerm;
|
||||||
if (mode & 0xa000) // S_IFLNK
|
|
||||||
|
if ((mode & IFMT) == IFLNK)
|
||||||
result |= FilePathInfo::LinkType;
|
result |= FilePathInfo::LinkType;
|
||||||
if (mode & 0x8000) // S_IFREG
|
if ((mode & IFMT) == IFREG)
|
||||||
result |= FilePathInfo::FileType;
|
result |= FilePathInfo::FileType;
|
||||||
if (mode & 0x4000) // S_IFDIR
|
if ((mode & IFMT) == IFDIR)
|
||||||
result |= FilePathInfo::DirectoryType;
|
result |= FilePathInfo::DirectoryType;
|
||||||
if (mode & 0x6000) // S_IFBLK
|
if ((mode & IFMT) == IFBLK)
|
||||||
result |= FilePathInfo::LocalDiskFlag;
|
result |= FilePathInfo::LocalDiskFlag;
|
||||||
|
|
||||||
if (result != 0) // There is no Exist flag, but if anything was set before, it must exist.
|
if (result != 0) // There is no Exist flag, but if anything was set before, it must exist.
|
||||||
|
|||||||
@@ -118,6 +118,9 @@ private slots:
|
|||||||
void tmp_data();
|
void tmp_data();
|
||||||
void tmp();
|
void tmp();
|
||||||
|
|
||||||
|
void filePathInfoFromTriple_data();
|
||||||
|
void filePathInfoFromTriple();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QTemporaryDir tempDir;
|
QTemporaryDir tempDir;
|
||||||
QString rootPath;
|
QString rootPath;
|
||||||
@@ -1358,6 +1361,77 @@ void tst_fileutils::tmp()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_fileutils::filePathInfoFromTriple_data()
|
||||||
|
{
|
||||||
|
QTest::addColumn<QString>("statoutput");
|
||||||
|
QTest::addColumn<FilePathInfo>("expected");
|
||||||
|
|
||||||
|
QTest::newRow("empty") << QString() << FilePathInfo();
|
||||||
|
|
||||||
|
QTest::newRow("linux-root") << QString("41ed 1676354359 4096")
|
||||||
|
<< FilePathInfo{4096,
|
||||||
|
FilePathInfo::FileFlags(
|
||||||
|
FilePathInfo::ReadOwnerPerm
|
||||||
|
| FilePathInfo::WriteOwnerPerm
|
||||||
|
| FilePathInfo::ExeOwnerPerm
|
||||||
|
| FilePathInfo::ReadGroupPerm
|
||||||
|
| FilePathInfo::ExeGroupPerm
|
||||||
|
| FilePathInfo::ReadOtherPerm
|
||||||
|
| FilePathInfo::ExeOtherPerm
|
||||||
|
| FilePathInfo::DirectoryType
|
||||||
|
| FilePathInfo::ExistsFlag),
|
||||||
|
QDateTime::fromSecsSinceEpoch(1676354359)};
|
||||||
|
|
||||||
|
QTest::newRow("linux-grep-bin")
|
||||||
|
<< QString("81ed 1668852790 808104")
|
||||||
|
<< FilePathInfo{808104,
|
||||||
|
FilePathInfo::FileFlags(
|
||||||
|
FilePathInfo::ReadOwnerPerm | FilePathInfo::WriteOwnerPerm
|
||||||
|
| FilePathInfo::ExeOwnerPerm | FilePathInfo::ReadGroupPerm
|
||||||
|
| FilePathInfo::ExeGroupPerm | FilePathInfo::ReadOtherPerm
|
||||||
|
| FilePathInfo::ExeOtherPerm | FilePathInfo::FileType
|
||||||
|
| FilePathInfo::ExistsFlag),
|
||||||
|
QDateTime::fromSecsSinceEpoch(1668852790)};
|
||||||
|
|
||||||
|
QTest::newRow("linux-disk") << QString("61b0 1651167746 0")
|
||||||
|
<< FilePathInfo{0,
|
||||||
|
FilePathInfo::FileFlags(
|
||||||
|
FilePathInfo::ReadOwnerPerm
|
||||||
|
| FilePathInfo::WriteOwnerPerm
|
||||||
|
| FilePathInfo::ReadGroupPerm
|
||||||
|
| FilePathInfo::WriteGroupPerm
|
||||||
|
| FilePathInfo::LocalDiskFlag
|
||||||
|
| FilePathInfo::ExistsFlag),
|
||||||
|
QDateTime::fromSecsSinceEpoch(1651167746)};
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_fileutils::filePathInfoFromTriple()
|
||||||
|
{
|
||||||
|
QFETCH(QString, statoutput);
|
||||||
|
QFETCH(FilePathInfo, expected);
|
||||||
|
|
||||||
|
const FilePathInfo result = FileUtils::filePathInfoFromTriple(statoutput);
|
||||||
|
|
||||||
|
QCOMPARE(result, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
namespace QTest {
|
||||||
|
template<>
|
||||||
|
char *toString(const FilePathInfo &filePathInfo)
|
||||||
|
{
|
||||||
|
QByteArray ba = "FilePathInfo(";
|
||||||
|
ba += QByteArray::number(filePathInfo.fileSize);
|
||||||
|
ba += ", ";
|
||||||
|
ba += QByteArray::number(filePathInfo.fileFlags, 16);
|
||||||
|
ba += ", ";
|
||||||
|
ba += filePathInfo.lastModified.toString().toUtf8();
|
||||||
|
ba += ")";
|
||||||
|
return qstrdup(ba.constData());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace QTest
|
||||||
|
|
||||||
QTEST_GUILESS_MAIN(tst_fileutils)
|
QTEST_GUILESS_MAIN(tst_fileutils)
|
||||||
|
|
||||||
#include "tst_fileutils.moc"
|
#include "tst_fileutils.moc"
|
||||||
|
|||||||
Reference in New Issue
Block a user