summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libs/installer/libarchivearchive.cpp22
-rw-r--r--tests/auto/installer/libarchivearchive/tst_libarchivearchive.cpp32
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();