diff options
-rw-r--r-- | src/libs/installer/libarchivearchive.cpp | 22 | ||||
-rw-r--r-- | tests/auto/installer/libarchivearchive/tst_libarchivearchive.cpp | 32 |
2 files changed, 53 insertions, 1 deletions
diff --git a/src/libs/installer/libarchivearchive.cpp b/src/libs/installer/libarchivearchive.cpp index d3a79bd40..0e29be205 100644 --- a/src/libs/installer/libarchivearchive.cpp +++ b/src/libs/installer/libarchivearchive.cpp @@ -481,12 +481,32 @@ bool LibArchiveArchive::create(const QStringList &data) QScopedPointer<archive, ScopedPointerWriterDeleter> writer(archive_write_new()); configureWriter(writer.get()); + QStringList globbedData; + for (auto &dataEntry : data) { // Expand glob pattern entries with proper filenames + if (!dataEntry.contains(QLatin1Char('*'))) { + globbedData.append(dataEntry); + continue; + } + const QFileInfo entryInfo(dataEntry); + if (entryInfo.path().contains(QLatin1Char('*'))) { + setErrorString(QString::fromLatin1("Invalid argument \"%1\": glob patterns " + "are not supported between directory paths.").arg(dataEntry)); + return false; + } + const QDir parentDir = entryInfo.dir(); + const QList<QFileInfo> infoList = parentDir.entryInfoList(QStringList() + << entryInfo.fileName(), QDir::AllEntries | QDir::Hidden | QDir::NoDotAndDotDot); + + for (auto &info : infoList) + globbedData.append(info.absoluteFilePath()); + } + try { int status; if ((status = archive_write_open_filename(writer.get(), m_data->file.fileName().toLocal8Bit()))) throw Error(QLatin1String(archive_error_string(writer.get()))); - for (auto &dataEntry : data) { + for (auto &dataEntry : globbedData) { QScopedPointer<archive, ScopedPointerReaderDeleter> reader(archive_read_disk_new()); configureDiskReader(reader.get()); diff --git a/tests/auto/installer/libarchivearchive/tst_libarchivearchive.cpp b/tests/auto/installer/libarchivearchive/tst_libarchivearchive.cpp index a1f5a1994..280bb60d0 100644 --- a/tests/auto/installer/libarchivearchive/tst_libarchivearchive.cpp +++ b/tests/auto/installer/libarchivearchive/tst_libarchivearchive.cpp @@ -106,6 +106,38 @@ private slots: QVERIFY(QFile(filename).remove()); } + void testCreateArchiveWithGlobPattern_data() + { + archiveSuffixesTestData(); + } + + void testCreateArchiveWithGlobPattern() + { + QFETCH(QString, suffix); + + const QString baseDir(QDir::tempPath() + "/tst_libarchivearchive"); + QVERIFY(QDir().mkpath(baseDir)); + + const QString path1 = tempSourceFile( + "Source File 1.", + baseDir + "/file.XXXXXX" + ); + const QString path2 = tempSourceFile( + "Source File 2.", + baseDir + "/file.XXXXXX" + ); + + const QString filename = generateTemporaryFileName() + suffix; + LibArchiveArchive target(filename); + QVERIFY(target.open(QIODevice::ReadWrite)); + QVERIFY(target.create(QStringList() << baseDir + "/*")); + QCOMPARE(target.list().count(), 2); + target.close(); + + QVERIFY(QFile(filename).remove()); + QVERIFY(QDir(baseDir).removeRecursively()); + } + void testCreateArchiveWithSpaces_data() { archiveSuffixesTestData(); |