diff --git a/digikam.changes b/digikam.changes index 4e1ee15..65f220c 100644 --- a/digikam.changes +++ b/digikam.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Mon Oct 3 07:55:43 UTC 2016 - alarrosa@suse.com + +- Added migration_from_digikam4.diff to support migration of + settings and database from digikam4 the first time digikam5 + is run by adding a migration page in the welcome wizard and + letting the user choose what to do (kde#364258). + ------------------------------------------------------------------- Thu Sep 29 22:19:22 UTC 2016 - lbeltrame@kde.org diff --git a/digikam.spec b/digikam.spec index 56a3a5b..0735563 100644 --- a/digikam.spec +++ b/digikam.spec @@ -26,6 +26,8 @@ Url: http://www.digikam.org/ Source0: http://download.kde.org/stable/%{name}/%{name}-%{version}.tar.xz # PATCH-FIX-OPENSUSE find_libastro-qt5.patch -- fix build of geolocation support in Leap 42.1 Patch2: find_libastro-qt5.patch +# PATCH-FIX-UPSTREAM migration_from_digikam4.diff alarrosa@suse.com kde#364258 -- Migration wizard page to migrate configuration and db from digikam4 +Patch3: migration_from_digikam4.diff #This pulls in QWebEngine, which is not available on ppc64 %ifarch %ix86 x86_64 %arm aarch64 mips mips64 BuildRequires: akonadi-contact-devel @@ -170,6 +172,7 @@ The main digikam libraries that are being shared between showfoto and digikam # we renamed libastro to libastro-qt5 in Leap 42.1, make FindMARBLE.cmake find it %patch2 -p1 %endif +%patch3 -p1 # Remove build time references so build-compare can do its work FAKE_BUILDDATE=$(LC_ALL=C date -u -r %{_sourcedir}/%{name}.changes '+%%b %%e %%Y') diff --git a/migration_from_digikam4.diff b/migration_from_digikam4.diff new file mode 100644 index 0000000..9107b6d --- /dev/null +++ b/migration_from_digikam4.diff @@ -0,0 +1,458 @@ +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($ + $ + $ ++ $ + + $ + $ +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 + ++// KDE includes ++ ++#include ++ + // 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,203 @@ ++/* ============================================================ ++ * ++ * 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 ++ * ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++// KDE includes ++ ++#include ++#include ++#include ++ ++// 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("" ++ "

Migrate configuration and metadata from digiKam 4

" ++ "

You can choose here if you want to use the configuration and albums from digiKam 4 in digiKam 5 . " ++ "Please note the following warnings:

" ++ "

Migration is done at your own risk. 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.

" ++ "

In either case you're recommended to backup " ++ "the configuration files and databases before proceeding.

" ++ "
")); ++ ++ 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; ++ } ++ } ++ ++ } ++ ++ // 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 ++ * ++ * 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.

" + "

This assistant will help you to configure first " + "run settings to be able to use digiKam quickly.

" ++#if defined Q_OS_WIN || defined Q_OS_OSX + "
" + "

You can ignore the following if you use digiKam " + "for the first time:

" +@@ -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 ++#else // defined Q_OS_LINUX ++ "", ++ 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.

" + ++#: utilities/assistants/firstrun/migratefromdigikam4page.cpp:58 ++msgid "Migration from digiKam 4" ++msgstr "Migración desde Digikam4" ++ ++#: utilities/assistants/firstrun/migratefromdigikam4page.cpp:66 ++msgid "" ++"

Migrate configuration and metadata from digiKam 4

You can choose here if you want to use the configuration and albums " ++"from digiKam 4 in digiKam 5 . Please note the following warnings:

Migration is done at your own risk. 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." ++"

In either case you're recommended to backup the configuration files " ++"and databases before proceeding.

" ++msgstr "" ++"

Migración de configuración y metadatos desde digiKam 4

Puede elegir aquí si quieres usar la configuración y albums de " ++"digiKam 4 en digiKam 5. Por favor, observe las siguientes advertencias:

La migration se hace bajo su propia responsabilidad. 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.

En cualquier caso, se " ++"recomienda que hagas un backup de los ficheros de configuración y bases de " ++"datos antes de continuar.

" ++ ++#: 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 "Configure Open File Behavior" + msgstr "Configurar el comportamiento de apertura de archivos"