File migration_from_digikam4.diff of Package digikam

Index: digikam-5.2.0/core/utilities/assistants/firstrun/CMakeLists.txt
===================================================================
--- digikam-5.2.0.orig/core/utilities/assistants/firstrun/CMakeLists.txt
+++ digikam-5.2.0/core/utilities/assistants/firstrun/CMakeLists.txt
@@ -11,6 +11,7 @@ endif (POLICY CMP0063)
 
 set(libfirstrun_SRCS
     firstrundlg.cpp
+    migratefromdigikam4page.cpp
     firstrundlgpage.cpp
     welcomepage.cpp
     collectionpage.cpp
@@ -26,6 +27,7 @@ set(libfirstrun_SRCS
 include_directories($<TARGET_PROPERTY:Qt5::Gui,INTERFACE_INCLUDE_DIRECTORIES>
                     $<TARGET_PROPERTY:Qt5::Widgets,INTERFACE_INCLUDE_DIRECTORIES>
                     $<TARGET_PROPERTY:Qt5::Core,INTERFACE_INCLUDE_DIRECTORIES>
+                    $<TARGET_PROPERTY:Qt5::Sql,INTERFACE_INCLUDE_DIRECTORIES>
 
                     $<TARGET_PROPERTY:KF5::I18n,INTERFACE_INCLUDE_DIRECTORIES>
                     $<TARGET_PROPERTY:KF5::ConfigCore,INTERFACE_INCLUDE_DIRECTORIES>
Index: digikam-5.2.0/core/utilities/assistants/firstrun/firstrundlg.cpp
===================================================================
--- digikam-5.2.0.orig/core/utilities/assistants/firstrun/firstrundlg.cpp
+++ digikam-5.2.0/core/utilities/assistants/firstrun/firstrundlg.cpp
@@ -27,10 +27,15 @@
 
 #include <QPushButton>
 
+// KDE includes
+
+#include <kdelibs4migration.h>
+
 // Local incudes
 
 #include "dxmlguiwindow.h"
 #include "welcomepage.h"
+#include "migratefromdigikam4page.h"
 #include "collectionpage.h"
 #include "databasepage.h"
 #include "rawpage.h"
@@ -49,6 +54,7 @@ public:
 
     Private() :
         welcomePage(0),
+        migrateFromDigikam4Page(0),
         collectionPage(0),
         databasePage(0),
         rawPage(0),
@@ -61,6 +67,7 @@ public:
     }
 
     WelcomePage*    welcomePage;
+    MigrateFromDigikam4Page*    migrateFromDigikam4Page;
     CollectionPage* collectionPage;
     DatabasePage*   databasePage;
     RawPage*        rawPage;
@@ -82,7 +89,21 @@ FirstRunDlg::FirstRunDlg(QWidget* const
                                                    << QWizard::NextButton
                                                    << QWizard::FinishButton);
 
+    bool migrateAvailable = false;
+
+#ifdef Q_OS_LINUX
+    ::Kdelibs4Migration migration;
+
+    // If there's a digikamrc file in $KDEHOME/share/config,
+    // then we create the migration page in the wizard
+    migrateAvailable = !migration.locateLocal("config", QStringLiteral("digikamrc")).isEmpty();
+#endif
+
     d->welcomePage    = new WelcomePage(this);    // First assistant page
+
+    if (migrateAvailable)
+       d->migrateFromDigikam4Page = new MigrateFromDigikam4Page(this);
+
     d->collectionPage = new CollectionPage(this);
     d->databasePage   = new DatabasePage(this);
     d->rawPage        = new RawPage(this);
@@ -151,14 +172,22 @@ bool FirstRunDlg::validateCurrentPage()
 
 void FirstRunDlg::slotFinishPressed()
 {
-    // Save settings to rc files.
-    d->collectionPage->saveSettings();
-    d->databasePage->saveSettings();
-    d->rawPage->saveSettings();
-    d->metadataPage->saveSettings();
-    d->previewPage->saveSettings();
-    d->openFilePage->saveSettings();
-    d->tooltipsPage->saveSettings();
+    if (d->migrateFromDigikam4Page && d->migrateFromDigikam4Page->isMigrationChecked())
+    {
+       // The user choosed to do a migration from digikam4
+       d->migrateFromDigikam4Page->doMigration();
+    }
+    else
+    {
+       // Save settings to rc files.
+       d->collectionPage->saveSettings();
+       d->databasePage->saveSettings();
+       d->rawPage->saveSettings();
+       d->metadataPage->saveSettings();
+       d->previewPage->saveSettings();
+       d->openFilePage->saveSettings();
+       d->tooltipsPage->saveSettings();
+    }
 }
 
 }   // namespace Digikam
Index: digikam-5.2.0/core/utilities/assistants/firstrun/migratefromdigikam4page.cpp
===================================================================
--- /dev/null
+++ digikam-5.2.0/core/utilities/assistants/firstrun/migratefromdigikam4page.cpp
@@ -0,0 +1,220 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date        : 2016-09-29
+ * Description : migration page from digikam4
+ *
+ * Copyright (C) 2016 by Antonio Larrosa <alarrosa at suse dot com>
+ *
+ * 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, 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.
+ *
+ * ============================================================ */
+
+#include "migratefromdigikam4page.h"
+
+// Qt includes
+
+#include <QLabel>
+#include <QRadioButton>
+#include <QButtonGroup>
+#include <QDir>
+#include <QFileInfo>
+#include <QFile>
+#include <QStringList>
+#include <QVBoxLayout>
+#include <QApplication>
+#include <QStyle>
+#include <QSqlDatabase>
+#include <QSqlQuery>
+#include <QSqlError>
+
+// KDE includes
+
+#include <klocalizedstring.h>
+#include <kdelibs4configmigrator.h>
+#include <kdelibs4migration.h>
+
+// Local includes
+
+#include "digikam_debug.h"
+#include "dbengineparameters.h"
+#include "dwidgetutils.h"
+
+namespace Digikam
+{
+
+MigrateFromDigikam4Page::MigrateFromDigikam4Page(FirstRunDlg* const dlg)
+    : FirstRunDlgPage(dlg, i18n("Migration from digiKam 4") ),
+      m_migrateBehavior(0L), m_migrate(0L), m_createnew(0L)
+{
+    const int spacing = QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing);
+
+    DVBox* const vbox    = new DVBox(this);
+    QLabel* const title = new QLabel(vbox);
+    title->setWordWrap(true);
+    title->setText(i18n("<qt>"
+                        "<p><h1><b>Migrate configuration and metadata from digiKam 4</b></h1></p>"
+                        "<p>You can choose here if you want to use the configuration and albums from digiKam 4 in digiKam 5 . "
+                        "Please note the following warnings:</p>"
+                        "<p>Migration is done <b>at your own risk</b>. Digikam developers "
+                        "don't recommend it and don't support it. On the other hand, Creating "
+                        "a new configuration might result in loss of tags and other metadata that wasn't embedded inside "
+                        "the pictures and was only available in digiKam 4's database.</p>"
+                        "<p>In either case you're recommended to backup "
+                        "the configuration files and databases before proceeding.</p>"
+                        "</qt>"));
+
+    QWidget* const btns      = new QWidget(vbox);
+    QVBoxLayout* const vlay  = new QVBoxLayout(btns);
+
+    m_migrateBehavior = new QButtonGroup(btns);
+    m_migrate     = new QRadioButton(btns);
+    m_migrate->setText(i18n("Migrate configuration from digiKam 4"));
+    m_migrate->setChecked(true);
+    connect(m_migrate, SIGNAL(toggled(bool)), this, SLOT(migrationToggled(bool)) );
+    m_migrateBehavior->addButton(m_migrate);
+
+    m_createnew = new QRadioButton(btns);
+    m_createnew->setText(i18n("Create a new configuration"));
+    m_migrateBehavior->addButton(m_createnew);
+
+    vlay->addWidget(m_migrate);
+    vlay->addWidget(m_createnew);
+    vlay->setContentsMargins(spacing, spacing, spacing, spacing);
+    vlay->setSpacing(spacing);
+
+    connect(m_migrateBehavior, SIGNAL(buttonClicked(int)), this, SIGNAL(completeChanged()));
+
+    setPageWidget(vbox);
+}
+
+MigrateFromDigikam4Page::~MigrateFromDigikam4Page()
+{
+}
+
+void MigrateFromDigikam4Page::doMigration()
+{
+  // Migrate digiKam config files from $KDEHOME/share/config/
+  Kdelibs4ConfigMigrator migrator(QStringLiteral("digikam"));
+  QStringList configFiles;
+  configFiles << QStringLiteral("digikamrc")
+              << QStringLiteral("digikam_tagsmanagerrc")
+              << QStringLiteral("kipipluginsrc")
+              << QStringLiteral("kipirc")
+              << QStringLiteral("showfotorc");
+  migrator.setConfigFiles( configFiles );
+  migrator.migrate();
+
+  // Migrate digiKam config files from $KDEHOME/share/apps/digikam/
+  Kdelibs4Migration migration;
+  QString oldappdatadir = migration.locateLocal("data", QStringLiteral("digikam"));
+  QStringList oldAppFiles = QDir(oldappdatadir).entryList( QDir::Files | QDir::Readable | QDir::NoDotAndDotDot );
+
+  Q_FOREACH( const QString &configFileName, oldAppFiles)
+  {
+     const QString newConfigLocation
+                = QStandardPaths::writableLocation(QStandardPaths::DataLocation)
+                  + QLatin1Char('/') + configFileName;
+
+     if (QFile(newConfigLocation).exists()) {
+               qCDebug(DIGIKAM_GENERAL_LOG) << newConfigLocation << " already exists. Skipping";
+               continue;
+     }
+
+     QFileInfo fileInfo(newConfigLocation);
+     QDir().mkpath(fileInfo.absolutePath());
+
+     const QString oldConfigFile = oldappdatadir + QLatin1Char('/') + configFileName;
+     if (!oldConfigFile.isEmpty()) {
+         if (QFile(oldConfigFile).copy(newConfigLocation)) {
+             qCDebug(DIGIKAM_GENERAL_LOG) << "Config file" << oldConfigFile << "was migrated to" << newConfigLocation;
+         }
+     }
+  }
+
+  // Migrate $KDEHOME/share/apps/kipi/geobookmarks.xml to ./.local/share/digikam/geobookmarks.xml
+  QString oldGeobookmarksFile = migration.locateLocal("data", QStringLiteral("kipi/geobookmarks.xml"));
+  const QString newGeobookmarksFile = QStandardPaths::writableLocation(QStandardPaths::DataLocation)
+                                    + QStringLiteral("/geobookmarks.xml");
+
+  if (QFile(newGeobookmarksFile).exists()) {
+     qCDebug(DIGIKAM_GENERAL_LOG) << newGeobookmarksFile << " already exists. Skipping";
+  } else {
+     QFileInfo fileInfo(newGeobookmarksFile);
+     QDir().mkpath(fileInfo.absolutePath());
+
+     if (!oldGeobookmarksFile.isEmpty()) {
+         if (QFile(oldGeobookmarksFile).copy(newGeobookmarksFile)) {
+             qCDebug(DIGIKAM_GENERAL_LOG) << "Config file" << oldGeobookmarksFile << "was migrated to" << newGeobookmarksFile;
+         }
+     }
+  }
+
+  // Fix albumroot identifier since digiKam 5 doesn't interpret correctly
+  // values like volumeid:?path=%2Fhome%2Fantonio%2FPictures and it needs
+  // to be url-decoded.
+  DbEngineParameters parameters = DbEngineParameters::parametersFromConfig(KSharedConfig::openConfig());
+  QSqlDatabase databaseHandler = QSqlDatabase::addDatabase(parameters.databaseType, QStringLiteral("digikam4migration"));
+
+  databaseHandler.setHostName(parameters.hostName);
+  databaseHandler.setPort(parameters.port);
+  databaseHandler.setDatabaseName(parameters.databaseNameCore);
+  databaseHandler.setUserName(parameters.userName);
+  databaseHandler.setPassword(parameters.password);
+  databaseHandler.setConnectOptions(parameters.connectOptions);
+  if (!databaseHandler.open()) {
+        qCDebug(DIGIKAM_GENERAL_LOG) << "Cannot open database:" << databaseHandler.lastError().text();
+        return;
+  }
+
+  QSqlQuery query(QStringLiteral("SELECT id,identifier FROM albumroots"), databaseHandler);
+  while (query.next()) {
+        int id = query.value(0).toInt();
+        QString identifier = query.value(1).toString();
+
+        if (identifier.startsWith(QStringLiteral("volumeid:?path=%2F")))
+        {
+           QUrl url(identifier);
+           url.setQuery(url.query(QUrl::FullyDecoded), QUrl::DecodedMode);
+           qCDebug(DIGIKAM_GENERAL_LOG) << "Updating albumroot " << id << " from " << identifier << " to " << url.toString();
+           QSqlQuery uquery(QStringLiteral("UPDATE albumroots SET identifier=? WHERE id=?"), databaseHandler);
+           uquery.bindValue(0, url.toString());
+           uquery.bindValue(1, id);
+           uquery.exec();
+        }
+    }
+  databaseHandler.close();
+
+  qCDebug(DIGIKAM_GENERAL_LOG) << "Migration finished";
+}
+
+bool MigrateFromDigikam4Page::isMigrationChecked() const
+{
+  return m_migrate->isChecked();
+}
+
+void MigrateFromDigikam4Page::migrationToggled(bool b)
+{
+  setFinalPage(b);
+}
+
+int MigrateFromDigikam4Page::nextId() const
+{
+  if (m_migrate->isChecked())
+     return -1;
+  else
+     return QWizardPage::nextId();
+}
+
+}   // namespace Digikam
Index: digikam-5.2.0/core/utilities/assistants/firstrun/migratefromdigikam4page.h
===================================================================
--- /dev/null
+++ digikam-5.2.0/core/utilities/assistants/firstrun/migratefromdigikam4page.h
@@ -0,0 +1,63 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date        : 2016-09-29
+ * Description : migration page from digikam4
+ *
+ * Copyright (C) 2016 by Antonio Larrosa <alarrosa at suse dot com>
+ *
+ * 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, 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.
+ *
+ * ============================================================ */
+
+#ifndef MIGRATEFROMDIGIKAM4_PAGE_H
+#define MIGRATEFROMDIGIKAM4_PAGE_H
+
+// Local includes
+
+#include "firstrundlgpage.h"
+
+class QRadioButton;
+class QButtonGroup;
+namespace Digikam
+{
+
+class MigrateFromDigikam4Page : public FirstRunDlgPage
+{
+Q_OBJECT
+
+public:
+
+    explicit MigrateFromDigikam4Page(FirstRunDlg* const dlg);
+    ~MigrateFromDigikam4Page();
+
+    /**
+     * Returns true if the user selected to do a migration
+     */
+    bool isMigrationChecked() const;
+    void doMigration();
+    int nextId() const;
+
+public Q_SLOTS:
+    void migrationToggled(bool b);
+
+protected:
+    QButtonGroup *m_migrateBehavior;
+    QRadioButton *m_migrate;
+    QRadioButton *m_createnew;
+};
+
+}   // namespace Digikam
+
+#endif /* MIGRATEFROMDIGIKAM4_PAGE_H */
Index: digikam-5.2.0/core/utilities/assistants/firstrun/welcomepage.cpp
===================================================================
--- digikam-5.2.0.orig/core/utilities/assistants/firstrun/welcomepage.cpp
+++ digikam-5.2.0/core/utilities/assistants/firstrun/welcomepage.cpp
@@ -52,6 +52,7 @@ WelcomePage::WelcomePage(FirstRunDlg* co
                         "application published as open-source.</p>"
                         "<p>This assistant will help you to configure first "
                         "run settings to be able to use digiKam quickly.</p>"
+#if defined Q_OS_WIN || defined Q_OS_OSX
                         "<br/>"
                         "<p>You can ignore the following if you use digiKam "
                         "for the first time:</p>"
@@ -75,10 +76,11 @@ WelcomePage::WelcomePage(FirstRunDlg* co
 #elif defined Q_OS_OSX
                         // MacOS settings place.
                         QLatin1String("~/Library/Preferences/"), QLatin1String("~/Library/Preferences/KDE/share/config/")
-#else
-			// Linux settings place.
-                        QLatin1String("~/.config/"), QLatin1String("~/.kde4/share/config")
-#endif                        
+#endif
+#else // defined Q_OS_LINUX
+                        "</qt>",
+                        QLatin1String(digikam_version_short)
+#endif
                   ));
 
     setPageWidget(vbox);
Index: digikam-5.2.0/po/es/digikam.po
===================================================================
--- digikam-5.2.0.orig/po/es/digikam.po
+++ digikam-5.2.0/po/es/digikam.po
@@ -16820,6 +16820,41 @@ msgstr ""
 "podrá alterar las operaciones de gestión de las fotografías haciéndolas más "
 "lentas.</p></qt>"
 
+#: utilities/assistants/firstrun/migratefromdigikam4page.cpp:58
+msgid "Migration from digiKam 4"
+msgstr "Migración desde Digikam4"
+
+#: utilities/assistants/firstrun/migratefromdigikam4page.cpp:66
+msgid ""
+"<qt><p><h1><b>Migrate configuration and metadata from digiKam 4</b></h1></"
+"p><p>You can choose here if you want to use the configuration and albums "
+"from digiKam 4 in digiKam 5 . Please note the following warnings:</"
+"p><p>Migration is done <b>at your own risk</b>. Digikam developers don't "
+"recommend it and don't support it. On the other hand, Creating a new "
+"configuration might result in loss of tags and other metadata that wasn't "
+"embedded inside the pictures and was only available in digiKam 4's database."
+"</p><p>In either case you're recommended to backup the configuration files "
+"and databases before proceeding.</p></qt>"
+msgstr ""
+"<qt><p><h1><b>Migración de configuración y metadatos desde digiKam 4</b></"
+"h1></p><p>Puede elegir aquí si quieres usar la configuración y albums de "
+"digiKam 4 en digiKam 5. Por favor, observe las siguientes advertencias:</"
+"p><p>La migration se hace <b>bajo su propia responsabilidad</b>. Los "
+"desarrolladores de Digikam no la recomiendan y no dan soporte. Por otra "
+"parte, crear una configuración nueva puede resultar en pérdida de etiquetas "
+"y otros metadatos que no estaban almacenados dentro de las imágenes y sólo "
+"estaban en la base de datos de digiKam 4.</p><p>En cualquier caso, se "
+"recomienda que hagas un backup de los ficheros de configuración y bases de "
+"datos antes de continuar.</p></qt>"
+
+#: utilities/assistants/firstrun/migratefromdigikam4page.cpp:83
+msgid "Migrate configuration from digiKam 4"
+msgstr "Migrar configuración de digiKam 4"
+
+#: utilities/assistants/firstrun/migratefromdigikam4page.cpp:89
+msgid "Create a new configuration"
+msgstr "Crear nueva configuración"
+
 #: utilities/assistants/firstrun/openfilepage.cpp:66
 msgid "<b>Configure Open File Behavior</b>"
 msgstr "<b>Configurar el comportamiento de apertura de archivos</b>"
openSUSE Build Service is sponsored by