Commit c98d64bf authored by Elvis Angelaccio's avatar Elvis Angelaccio

Fix extraction when an archive has a percentage in the name

QUrl::toDisplayString() results in a QString containing %25 instead of %.
This affects both batch extractions and normal extractions from the Ark Part.

Porting to QUrl::toLocalFile() fixes this issue.

BUG: 365798
FIXED-IN: 16.08.0

Differential Revision: D2229
parent bf2de67e
...@@ -213,12 +213,12 @@ void BatchExtract::forwardProgress(KJob *job, unsigned long percent) ...@@ -213,12 +213,12 @@ void BatchExtract::forwardProgress(KJob *job, unsigned long percent)
bool BatchExtract::addInput(const QUrl& url) bool BatchExtract::addInput(const QUrl& url)
{ {
qCDebug(ARK) << "Adding archive" << url.toDisplayString(QUrl::PreferLocalFile); qCDebug(ARK) << "Adding archive" << url.toLocalFile();
Kerfuffle::Archive *archive = Kerfuffle::Archive::create(url.toDisplayString(QUrl::PreferLocalFile), this); Kerfuffle::Archive *archive = Kerfuffle::Archive::create(url.toLocalFile(), this);
Q_ASSERT(archive); Q_ASSERT(archive);
if (!QFileInfo::exists(url.toDisplayString(QUrl::PreferLocalFile))) { if (!QFileInfo::exists(url.toLocalFile())) {
m_failedFiles.append(url.fileName()); m_failedFiles.append(url.fileName());
return false; return false;
} }
......
include(ECMAddTests) include(ECMAddTests)
add_subdirectory(app)
add_subdirectory(kerfuffle) add_subdirectory(kerfuffle)
add_subdirectory(plugins) add_subdirectory(plugins)
include_directories(${CMAKE_SOURCE_DIR}/app)
ecm_add_test(
batchextracttest.cpp
${CMAKE_SOURCE_DIR}/app/batchextract.cpp
${CMAKE_BINARY_DIR}/app/ark_debug.cpp
LINK_LIBRARIES Qt5::Test KF5::KIOFileWidgets kerfuffle
TEST_NAME batchextracttest
NAME_PREFIX app-)
/*
* Copyright (c) 2016 Elvis Angelaccio <elvis.angelaccio@kdemail.net>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ( INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "batchextract.h"
#include <QDirIterator>
#include <QTest>
class BatchExtractTest : public QObject
{
Q_OBJECT
private Q_SLOTS:
void testBatchExtraction_data();
void testBatchExtraction();
};
QTEST_GUILESS_MAIN(BatchExtractTest)
void BatchExtractTest::testBatchExtraction_data()
{
QTest::addColumn<QString>("archivePath");
QTest::addColumn<bool>("autoSubfolder");
QTest::addColumn<int>("expectedExtractedEntriesCount");
QString archivePath = QFINDTESTDATA("data/simple%archive.tar.gz");
QTest::newRow("extract the whole simple%archive.tar.gz (bug #365798)")
<< archivePath
<< true
<< 4;
}
void BatchExtractTest::testBatchExtraction()
{
auto batchJob = new BatchExtract(this);
QFETCH(QString, archivePath);
batchJob->addInput(QUrl::fromUserInput(archivePath));
QFETCH(bool, autoSubfolder);
batchJob->setAutoSubfolder(autoSubfolder);
QTemporaryDir destDir;
if (!destDir.isValid()) {
QSKIP("Could not create a temporary directory for extraction. Skipping test.", SkipSingle);
}
batchJob->setDestinationFolder(destDir.path());
QEventLoop eventLoop(this);
connect(batchJob, &KJob::result, &eventLoop, &QEventLoop::quit);
batchJob->start();
eventLoop.exec(); // krazy:exclude=crashy
QFETCH(int, expectedExtractedEntriesCount);
int extractedEntriesCount = 0;
QDirIterator dirIt(destDir.path(), QDir::AllEntries | QDir::Hidden | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
while (dirIt.hasNext()) {
extractedEntriesCount++;
dirIt.next();
}
if (autoSubfolder) {
// Also take into account the automatically created subfolder.
QCOMPARE(extractedEntriesCount, expectedExtractedEntriesCount + 1);
} else {
QCOMPARE(extractedEntriesCount, expectedExtractedEntriesCount);
}
}
#include "batchextracttest.moc"
...@@ -1075,7 +1075,7 @@ void Part::slotShowExtractionDialog() ...@@ -1075,7 +1075,7 @@ void Part::slotShowExtractionDialog()
} }
options[QStringLiteral("FollowExtractionDialogSettings")] = true; options[QStringLiteral("FollowExtractionDialogSettings")] = true;
const QString destinationDirectory = dialog.data()->destinationDirectory().toDisplayString(QUrl::PreferLocalFile); const QString destinationDirectory = dialog.data()->destinationDirectory().toLocalFile();
ExtractJob *job = m_model->extractFiles(files, destinationDirectory, options); ExtractJob *job = m_model->extractFiles(files, destinationDirectory, options);
registerJob(job); registerJob(job);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment