[ark] add unar support

Rex Dieter rdieter at fedoraproject.org
Thu Aug 14 13:07:44 UTC 2014


commit d7d5b61bd527afe6b204a151ba38af9e8c858e5a
Author: Rex Dieter <rdieter at math.unl.edu>
Date:   Thu Aug 14 08:07:46 2014 -0500

    add unar support

 ark-unar-06.patch |  236 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 ark.spec          |    9 ++-
 2 files changed, 244 insertions(+), 1 deletions(-)
---
diff --git a/ark-unar-06.patch b/ark-unar-06.patch
new file mode 100644
index 0000000..ab2ef27
--- /dev/null
+++ b/ark-unar-06.patch
@@ -0,0 +1,236 @@
+diff --git a/plugins/cliunarchiverplugin/kerfuffle_cliunarchiver.desktop b/plugins/cliunarchiverplugin/kerfuffle_cliunarchiver.desktop
+new file mode 100644
+index 0000000..2b5bd9e
+--- /dev/null
++++ b/plugins/cliunarchiverplugin/kerfuffle_cliunarchiver.desktop
+@@ -0,0 +1,15 @@
++[Desktop Entry]
++Type=Service
++X-KDE-ServiceTypes=Kerfuffle/Plugin
++X-KDE-Library=kerfuffle_cliunarchiver
++X-KDE-PluginInfo-Author=Luke Shumaker
++X-KDE-PluginInfo-Email=lukeshu at sbcglobal.net
++X-KDE-PluginInfo-Name= kerfuffle_cliunarchiver
++X-KDE-PluginInfo-Version=0.0.1
++X-KDE-PluginInfo-Website=http://www.kde.org
++X-KDE-PluginInfo-License=GPLv2+
++X-KDE-Priority=150
++X-KDE-Kerfuffle-APIRevision=1
++X-KDE-Kerfuffle-ReadWrite=false
++Name=The Unarchiver plugin
++MimeType=application/x-rar;
+diff --git a/plugins/cliunarchiverplugin/cliplugin.cpp b/plugins/cliunarchiverplugin/cliplugin.cpp
+new file mode 100644
+index 0000000..e0adcf7
+--- /dev/null
++++ b/plugins/cliunarchiverplugin/cliplugin.cpp
+@@ -0,0 +1,170 @@
++ /*
++ * ark -- archiver for the KDE project
++ *
++ * Copyright (C) 2011 Luke Shumaker <lukeshu at sbcglobal.net>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ *
++ */
++
++#include "kerfuffle/cliinterface.h"
++#include "kerfuffle/kerfuffle_export.h"
++
++#include <KDebug>
++
++#include <QDateTime>
++#include <QDir>
++#include <QRegExp>
++#include <QString>
++#include <QStringList>
++
++using namespace Kerfuffle;
++
++class CliPlugin: public CliInterface
++{
++public:
++    explicit CliPlugin(QObject *parent, const QVariantList & args)
++        : CliInterface(parent, args) {
++        m_indentLevel = 0;
++    }
++
++    virtual ~CliPlugin() {
++    }
++
++    virtual ParameterList parameterList() const {
++        static ParameterList p;
++        if (p.isEmpty()) {
++            /* Limitations:
++             *  01 - creates an empty file upon entering wrong password
++             *  02 - unar detects if output is being redirected and then does not accept any input
++             */
++
++            ///////////////[ COMMON ]/////////////
++
++            p[CaptureProgress] = false;
++            p[PasswordPromptPattern] = QLatin1String("Password (will not be shown): ");
++
++            ///////////////[ LIST ]/////////////
++
++            p[ListProgram] = QLatin1String("lsar");
++            p[ListArgs] = QStringList() << QLatin1String("-json") << QLatin1String("$Archive");
++
++            ///////////////[ EXTRACT ]/////////////
++
++            p[ExtractProgram] = QLatin1String("unar");
++            p[ExtractArgs] = QStringList() << QLatin1String("$Archive") << QLatin1String("$Files") << QLatin1String("$PasswordSwitch") << QLatin1String("$RootNodeSwitch");
++            p[NoTrailingSlashes]  = true;
++            p[PasswordSwitch] = QStringList() << QLatin1String("-password") << QLatin1String("$Password");
++	    p[RootNodeSwitch] = QStringList() << QLatin1String("-output-directory") << QLatin1String("$Path");
++            p[FileExistsExpression] = QLatin1String("^\\\"(.+)\\\" already exists.");
++            p[FileExistsInput] = QStringList()
++                     << QLatin1String("o") //overwrite
++                     << QLatin1String("s") //skip
++                     << QLatin1String("O") //overwrite all
++                     << QLatin1String("S") //autoskip
++                     << QLatin1String("q") //cancel
++                     ;
++
++            ///////////////[ DELETE ]/////////////
++
++            p[DeleteProgram] = QLatin1String("x-fakeprogram");
++            //p[DeleteArgs]    =
++
++            ///////////////[ ADD ]/////////////
++
++            p[AddProgram] = QLatin1String("x-fakeprogram");
++            //p[AddArgs]    =
++
++            ///////////////[ ERRORS ]/////////////
++
++            p[ExtractionFailedPatterns] = QStringList()
++                << QLatin1String("Failed! \\((.+)\\)$")
++                << QLatin1String("Segmentation fault$");
++
++            p[WrongPasswordPatterns] = QStringList()
++                << QLatin1String("Failed! \\((.+)\\)$");
++        }
++        return p;
++    }
++
++    QString m_entryFilename, m_internalId;
++    ArchiveEntry m_currentEntry;
++    int m_indentLevel;
++
++    bool readListLine(const QString &line) {
++        /* lsar will give us JSON output.  However, we actually parse based on
++         * the indentation.  Ugly, I know, but
++         *  1. It's easier
++         *  2. lsar's JSON is invalid JSON, so actual parsers bork.
++         */
++
++        int spaces;
++        for(spaces=0;(spaces<line.size())&&(line[spaces]==QLatin1Char(' '));spaces++){}
++        // Since this is so ugly anyway, I'm not even going to check to
++        // make sure that spaces is even.  I mean, what would I do about it?
++        int m_newIndentLevel = spaces/2;
++
++        if (m_newIndentLevel>m_indentLevel) {
++            if (m_newIndentLevel==3) {
++                m_currentEntry.clear();
++                m_currentEntry[IsDirectory] = false;
++            }
++        } else if (m_newIndentLevel<m_indentLevel) {
++            if ( (m_newIndentLevel<3) && (m_indentLevel>=3) ) {
++                EntryMetaDataType index = IsDirectory;
++                if (m_currentEntry[index].toBool()) {
++                    m_currentEntry[FileName].toString().append(QLatin1String("/"));
++                }
++                kDebug() << "Added entry:" << m_currentEntry;
++                entry(m_currentEntry);
++            }
++        }
++        m_indentLevel = m_newIndentLevel;
++
++        QRegExp rx(QLatin1String("^\\s*\"([^\"]*)\": (.*),$"));
++        if (rx.indexIn(line) >= 0) {
++            QRegExp rx_unquote(QLatin1String("^\"(.*)\"$"));
++            QString key = rx.cap(1);
++            QString value = rx.cap(2);
++
++            if (false) {
++            } else if (key==QLatin1String("XADFileName")) {
++                rx_unquote.indexIn(value);
++                m_currentEntry[FileName] = m_currentEntry[InternalID] = rx_unquote.cap(1);
++            } else if (key==QLatin1String("XADFileSize")) {
++                m_currentEntry[Size] = value.toInt();
++            } else if (key==QLatin1String("XADCompressedSize")) {
++                m_currentEntry[CompressedSize] = value.toInt();
++            } else if (key==QLatin1String("XADLastModificationDate")) {
++                QDateTime ts(QDate::fromString(value, QLatin1String("\"YYYY-MM-DD hh:mm:ss")));
++                m_currentEntry[Timestamp] = ts;
++            } else if (key==QLatin1String("XADIsDirectory")) {
++                m_currentEntry[IsDirectory] = (value==QLatin1String("1"));
++            } else if (key==QLatin1String("RARCRC32")) {
++                m_currentEntry[CRC] = value.toInt();
++            } else if (key==QLatin1String("RARCompressionMethod")) {
++                m_currentEntry[Method] = value.toInt();
++            } else if (key==QLatin1String("Encrypted")) {
++                m_currentEntry[IsPasswordProtected] = (value.toInt() != 0);
++            }
++            // TODO: add RAR version. ([Version])
++        }
++
++        return true;
++    }
++};
++
++KERFUFFLE_EXPORT_PLUGIN(CliPlugin)
++
+diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt
+index 3619412..6368839 100644
+--- a/plugins/CMakeLists.txt
++++ b/plugins/CMakeLists.txt
+@@ -20,6 +20,7 @@ if (LIBARCHIVE_FOUND)
+ endif (LIBARCHIVE_FOUND)
+ 
+ add_subdirectory( clirarplugin )
++add_subdirectory( cliunarchiverplugin )
+ add_subdirectory( cli7zplugin )
+ add_subdirectory( clizipplugin )
+ add_subdirectory( libsinglefileplugin )
+diff --git a/plugins/cliunarchiverplugin/CMakeLists.txt b/plugins/cliunarchiverplugin/CMakeLists.txt
+new file mode 100644
+index 0000000..ccd52e7
+--- /dev/null
++++ b/plugins/cliunarchiverplugin/CMakeLists.txt
+@@ -0,0 +1,21 @@
++
++include_directories(
++                     ${CMAKE_CURRENT_SOURCE_DIR}/../..
++                     ${CMAKE_CURRENT_BINARY_DIR}/../..
++                   )
++
++########### next target ###############
++
++set(kerfuffle_cliunarchiver_SRCS cliplugin.cpp)
++
++kde4_add_plugin(kerfuffle_cliunarchiver ${kerfuffle_cliunarchiver_SRCS})
++
++target_link_libraries(kerfuffle_cliunarchiver  ${KDE4_KDECORE_LIBS} ${KDE4_KIO_LIBS} kerfuffle )
++
++
++
++########### install files ###############
++
++install(TARGETS kerfuffle_cliunarchiver  DESTINATION ${PLUGIN_INSTALL_DIR} )
++install( FILES kerfuffle_cliunarchiver.desktop  DESTINATION  ${SERVICES_INSTALL_DIR} )
++
diff --git a/ark.spec b/ark.spec
index 21d2123..bc0680b 100644
--- a/ark.spec
+++ b/ark.spec
@@ -5,7 +5,7 @@
 Name:    ark
 Summary: Archive manager
 Version: 4.13.97
-Release: 2%{?dist}
+Release: 3%{?dist}
 
 License: GPLv2+
 URL:     http://utils.kde.org/projects/ark 
@@ -24,6 +24,8 @@ Patch50: ark-4.7.80-namelink_skip.patch
 Patch52: ark-4.9.97-r107635.patch
 # https://git.reviewboard.kde.org/r/107634/
 Patch53: ark-4.9.97-improve_subfolder_autodetection.patch
+# https://git.reviewboard.kde.org/r/106294/
+Patch54: ark-unar-06.patch
 
 ## upstream patches
 
@@ -57,6 +59,7 @@ Requires: gzip
 %if 0%{?p7zip}
 Requires: p7zip-plugins
 %endif
+#Requires: unar
 Requires: unzip
 
 %description
@@ -83,6 +86,7 @@ Provides:  kdeutils-ark-libs = 6:%{version}-%{release}
 %patch50 -p1 -b .namelink_skip
 %patch52 -p1 -b .r107635
 %patch53 -p1 -b .improve_subfolder_autodetection
+%patch54 -p1 -b .unar-06
 
 
 %build
@@ -144,6 +148,9 @@ fi
 
 
 %changelog
+* Thu Aug 14 2014 Rex Dieter <rdieter at fedoraproject.org> 4.13.97-3
+- add unar support
+
 * Fri Aug 08 2014 Rex Dieter <rdieter at fedoraproject.org> 4.13.97-2
 - new appdata validation
 


More information about the scm-commits mailing list