Hello community,

here is the log from the commit of package libkpeople for openSUSE:Factory 
checked in at 2014-04-26 10:05:50
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libkpeople (Old)
 and      /work/SRC/openSUSE:Factory/.libkpeople.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libkpeople"

Changes:
--------
--- /work/SRC/openSUSE:Factory/libkpeople/libkpeople.changes    2014-02-21 
20:54:18.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.libkpeople.new/libkpeople.changes       
2014-04-26 10:05:52.000000000 +0200
@@ -1,0 +2,6 @@
+Sat Apr 26 00:21:20 UTC 2014 - [email protected]
+
+- Update to 0.2.2
+  * New bugfix release, no changelog provided
+
+-------------------------------------------------------------------

Old:
----
  libkpeople-0.2.1.tar.bz2

New:
----
  libkpeople-0.2.2.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libkpeople.spec ++++++
--- /var/tmp/diff_new_pack.fa0XFu/_old  2014-04-26 10:05:52.000000000 +0200
+++ /var/tmp/diff_new_pack.fa0XFu/_new  2014-04-26 10:05:52.000000000 +0200
@@ -19,13 +19,13 @@
 %define soversion 3
 
 Name:           libkpeople
-Version:        0.2.1
+Version:        0.2.2
 Release:        0
 Summary:        Provides access to all contacts and the people who hold them
 License:        LGPL-2.1+
 Group:          Development/Libraries/Other
 Url:            https://projects.kde.org/projects/playground/network/libkpeople
-Source0:        
http://download.kde.org/unstable/%{name}/%{version}/%{name}-%{version}.tar.bz2
+Source0:        
http://download.kde.org/unstable/%{name}/%{version}/src/%{name}-%{version}.tar.bz2
 BuildRequires:  libkde4-devel >= 4.10.1
 BuildRequires:  libkdepimlibs4-devel
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build

++++++ libkpeople-0.2.1.tar.bz2 -> libkpeople-0.2.2.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/CMakeLists.txt 
new/libkpeople-0.2.2/CMakeLists.txt
--- old/libkpeople-0.2.1/CMakeLists.txt 2014-02-20 17:06:50.000000000 +0100
+++ new/libkpeople-0.2.2/CMakeLists.txt 2014-04-26 01:58:25.000000000 +0200
@@ -12,7 +12,7 @@
 
 set(KPEOPLE_VERSION_MAJOR 0)
 set(KPEOPLE_VERSION_MINOR 2)
-set(KPEOPLE_VERSION_PATCH 1)
+set(KPEOPLE_VERSION_PATCH 2)
 
 set(KPEOPLE_VERSION 
"${KPEOPLE_VERSION_MAJOR}.${KPEOPLE_VERSION_MINOR}.${KPEOPLE_VERSION_PATCH}")
 set(KPEOPLE_SOVERSION 3)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/po/CMakeLists.txt 
new/libkpeople-0.2.2/po/CMakeLists.txt
--- old/libkpeople-0.2.1/po/CMakeLists.txt      2014-02-20 17:06:50.000000000 
+0100
+++ new/libkpeople-0.2.2/po/CMakeLists.txt      2014-04-26 01:58:25.000000000 
+0200
@@ -2,13 +2,15 @@
 add_subdirectory( cs )
 add_subdirectory( da )
 add_subdirectory( de )
-add_subdirectory( el )
+add_subdirectory( fi )
 add_subdirectory( fr )
 add_subdirectory( hu )
 add_subdirectory( lt )
 add_subdirectory( nl )
+add_subdirectory( pl )
 add_subdirectory( pt )
 add_subdirectory( pt_BR )
+add_subdirectory( ro )
 add_subdirectory( ru )
 add_subdirectory( sk )
 add_subdirectory( sl )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/po/da/libkpeople.po 
new/libkpeople-0.2.2/po/da/libkpeople.po
--- old/libkpeople-0.2.1/po/da/libkpeople.po    2014-02-20 17:05:56.000000000 
+0100
+++ new/libkpeople-0.2.2/po/da/libkpeople.po    2014-04-26 01:57:50.000000000 
+0200
@@ -1,13 +1,13 @@
 # Copyright (C) YEAR This_file_is_part_of_KDE
 # This file is distributed under the same license as the PACKAGE package.
 #
-# Martin Schlander <[email protected]>, 2013.
+# Martin Schlander <[email protected]>, 2013, 2014.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://bugs.kde.org\n";
 "POT-Creation-Date: 2014-02-18 01:50+0000\n"
-"PO-Revision-Date: 2013-09-23 19:40+0200\n"
+"PO-Revision-Date: 2014-02-23 14:40+0100\n"
 "Last-Translator: Martin Schlander <[email protected]>\n"
 "Language-Team: Danish <[email protected]>\n"
 "Language: da\n"
@@ -32,7 +32,7 @@
 #. i18n: ectx: property (text), widget (QLabel, avatarPixmapLabel)
 #: widgets/person-details-presentation.ui:43
 msgid "Avatar"
-msgstr ""
+msgstr "Avatar"
 
 #: widgets/plugins/emaildetailswidget.cpp:51
 msgid "Email"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/po/el/CMakeLists.txt 
new/libkpeople-0.2.2/po/el/CMakeLists.txt
--- old/libkpeople-0.2.1/po/el/CMakeLists.txt   2014-02-20 17:05:57.000000000 
+0100
+++ new/libkpeople-0.2.2/po/el/CMakeLists.txt   1970-01-01 01:00:00.000000000 
+0100
@@ -1,2 +0,0 @@
-file(GLOB _po_files *.po)
-GETTEXT_PROCESS_PO_FILES( el ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} 
${_po_files} )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/po/el/libkpeople.po 
new/libkpeople-0.2.2/po/el/libkpeople.po
--- old/libkpeople-0.2.1/po/el/libkpeople.po    2014-02-20 17:05:57.000000000 
+0100
+++ new/libkpeople-0.2.2/po/el/libkpeople.po    1970-01-01 01:00:00.000000000 
+0100
@@ -1,51 +0,0 @@
-# Copyright (C) YEAR This_file_is_part_of_KDE
-# This file is distributed under the same license as the PACKAGE package.
-#
-# Antonis Geralis <[email protected]>, 2014.
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: http://bugs.kde.org\n";
-"POT-Creation-Date: 2014-02-18 01:50+0000\n"
-"PO-Revision-Date: 2014-02-04 21:37+0200\n"
-"Last-Translator: Antonis Geralis <[email protected]>\n"
-"Language-Team: Greek <[email protected]>\n"
-"Language: el\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Lokalize 1.5\n"
-
-#: examples/contactlistqml.cpp:29
-msgid "SweetPeople - KPeople Example"
-msgstr "SweetPeople - Παράδειγμα KPeople"
-
-#: widgets/mergedialog.cpp:65
-msgid "Duplicates Manager"
-msgstr "Διαχειριστής διπλότυπων"
-
-#: widgets/mergedialog.cpp:74
-msgid "Select contacts to be merged"
-msgstr "Επιλέξτε επαφές για συγχώνευση"
-
-#. i18n: ectx: property (text), widget (QLabel, avatarPixmapLabel)
-#: widgets/person-details-presentation.ui:43
-msgid "Avatar"
-msgstr ""
-
-#: widgets/plugins/emaildetailswidget.cpp:51
-msgid "Email"
-msgstr "Email"
-
-#: widgets/plugins/mergecontactswidget.cpp:51
-msgid "Show Merge Suggestions..."
-msgstr "Εμφάνιση προτάσεων για συγχώνευση..."
-
-#: widgets/plugins/mergecontactswidget.cpp:89
-msgid "Merge with Selected Contacts"
-msgstr "Συγχώνευση με επιλεγμένες επαφές"
-
-#: widgets/plugins/phonedetailswidget.cpp:40
-msgid "Phone"
-msgstr "Τηλέφωνο"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/po/fi/CMakeLists.txt 
new/libkpeople-0.2.2/po/fi/CMakeLists.txt
--- old/libkpeople-0.2.1/po/fi/CMakeLists.txt   1970-01-01 01:00:00.000000000 
+0100
+++ new/libkpeople-0.2.2/po/fi/CMakeLists.txt   2014-04-26 01:57:53.000000000 
+0200
@@ -0,0 +1,2 @@
+file(GLOB _po_files *.po)
+GETTEXT_PROCESS_PO_FILES( fi ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} 
${_po_files} )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/po/fi/libkpeople.po 
new/libkpeople-0.2.2/po/fi/libkpeople.po
--- old/libkpeople-0.2.1/po/fi/libkpeople.po    1970-01-01 01:00:00.000000000 
+0100
+++ new/libkpeople-0.2.2/po/fi/libkpeople.po    2014-04-26 01:57:53.000000000 
+0200
@@ -0,0 +1,51 @@
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+# Lasse Liehu <[email protected]>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: http://bugs.kde.org\n";
+"POT-Creation-Date: 2014-02-18 01:50+0000\n"
+"PO-Revision-Date: 2014-02-17 17:02+0200\n"
+"Last-Translator: Lasse Liehu <[email protected]>\n"
+"Language-Team: Finnish <[email protected]>\n"
+"Language: fi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: examples/contactlistqml.cpp:29
+msgid "SweetPeople - KPeople Example"
+msgstr "SweetPeople – KPeople-esimerkki"
+
+#: widgets/mergedialog.cpp:65
+msgid "Duplicates Manager"
+msgstr "Kaksoiskappaleiden hallinta"
+
+#: widgets/mergedialog.cpp:74
+msgid "Select contacts to be merged"
+msgstr "Valitse yhdistettävät yhteystiedot"
+
+#. i18n: ectx: property (text), widget (QLabel, avatarPixmapLabel)
+#: widgets/person-details-presentation.ui:43
+msgid "Avatar"
+msgstr "Avatar"
+
+#: widgets/plugins/emaildetailswidget.cpp:51
+msgid "Email"
+msgstr "Sähköposti"
+
+#: widgets/plugins/mergecontactswidget.cpp:51
+msgid "Show Merge Suggestions..."
+msgstr "Näytä yhdistämisehdotukset…"
+
+#: widgets/plugins/mergecontactswidget.cpp:89
+msgid "Merge with Selected Contacts"
+msgstr "Yhdistä valitut yhteystiedot"
+
+#: widgets/plugins/phonedetailswidget.cpp:40
+msgid "Phone"
+msgstr "Puhelin"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/po/fr/libkpeople.po 
new/libkpeople-0.2.2/po/fr/libkpeople.po
--- old/libkpeople-0.2.1/po/fr/libkpeople.po    2014-02-20 17:06:06.000000000 
+0100
+++ new/libkpeople-0.2.2/po/fr/libkpeople.po    2014-04-26 01:57:54.000000000 
+0200
@@ -1,13 +1,13 @@
 # Copyright (C) YEAR This_file_is_part_of_KDE
 # This file is distributed under the same license as the PACKAGE package.
-# Sebastien Renard <[email protected]>, 2013.
+# Sebastien Renard <[email protected]>, 2013, 2014.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://bugs.kde.org\n";
 "POT-Creation-Date: 2014-02-18 01:50+0000\n"
-"PO-Revision-Date: 2013-12-01 14:55+0100\n"
+"PO-Revision-Date: 2014-03-16 18:45+0100\n"
 "Last-Translator: Sebastien Renard <[email protected]>\n"
 "Language-Team: French <[email protected]>\n"
 "Language: fr\n"
@@ -35,7 +35,7 @@
 #. i18n: ectx: property (text), widget (QLabel, avatarPixmapLabel)
 #: widgets/person-details-presentation.ui:43
 msgid "Avatar"
-msgstr ""
+msgstr "Avatar"
 
 #: widgets/plugins/emaildetailswidget.cpp:51
 msgid "Email"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/po/pl/CMakeLists.txt 
new/libkpeople-0.2.2/po/pl/CMakeLists.txt
--- old/libkpeople-0.2.1/po/pl/CMakeLists.txt   1970-01-01 01:00:00.000000000 
+0100
+++ new/libkpeople-0.2.2/po/pl/CMakeLists.txt   2014-04-26 01:58:11.000000000 
+0200
@@ -0,0 +1,2 @@
+file(GLOB _po_files *.po)
+GETTEXT_PROCESS_PO_FILES( pl ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} 
${_po_files} )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/po/pl/libkpeople.po 
new/libkpeople-0.2.2/po/pl/libkpeople.po
--- old/libkpeople-0.2.1/po/pl/libkpeople.po    1970-01-01 01:00:00.000000000 
+0100
+++ new/libkpeople-0.2.2/po/pl/libkpeople.po    2014-04-26 01:58:11.000000000 
+0200
@@ -0,0 +1,52 @@
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Łukasz Wojniłowicz <[email protected]>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: http://bugs.kde.org\n";
+"POT-Creation-Date: 2014-02-18 01:50+0000\n"
+"PO-Revision-Date: 2014-03-22 15:03+0100\n"
+"Last-Translator: Łukasz Wojniłowicz <[email protected]>\n"
+"Language-Team: Polish <[email protected]>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: examples/contactlistqml.cpp:29
+msgid "SweetPeople - KPeople Example"
+msgstr "SweetPeople - Przykład KPeople"
+
+#: widgets/mergedialog.cpp:65
+msgid "Duplicates Manager"
+msgstr "Zarządca powieleń"
+
+#: widgets/mergedialog.cpp:74
+msgid "Select contacts to be merged"
+msgstr "Wybierz kontakty do scalenia"
+
+#. i18n: ectx: property (text), widget (QLabel, avatarPixmapLabel)
+#: widgets/person-details-presentation.ui:43
+msgid "Avatar"
+msgstr "Awatar"
+
+#: widgets/plugins/emaildetailswidget.cpp:51
+msgid "Email"
+msgstr "E-mail"
+
+#: widgets/plugins/mergecontactswidget.cpp:51
+msgid "Show Merge Suggestions..."
+msgstr "Pokaż sugestie scalania..."
+
+#: widgets/plugins/mergecontactswidget.cpp:89
+msgid "Merge with Selected Contacts"
+msgstr "Scal z wybranymi kontaktami"
+
+#: widgets/plugins/phonedetailswidget.cpp:40
+msgid "Phone"
+msgstr "Telefon"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/po/ro/CMakeLists.txt 
new/libkpeople-0.2.2/po/ro/CMakeLists.txt
--- old/libkpeople-0.2.1/po/ro/CMakeLists.txt   1970-01-01 01:00:00.000000000 
+0100
+++ new/libkpeople-0.2.2/po/ro/CMakeLists.txt   2014-04-26 01:58:13.000000000 
+0200
@@ -0,0 +1,2 @@
+file(GLOB _po_files *.po)
+GETTEXT_PROCESS_PO_FILES( ro ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} 
${_po_files} )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/po/ro/libkpeople.po 
new/libkpeople-0.2.2/po/ro/libkpeople.po
--- old/libkpeople-0.2.1/po/ro/libkpeople.po    1970-01-01 01:00:00.000000000 
+0100
+++ new/libkpeople-0.2.2/po/ro/libkpeople.po    2014-04-26 01:58:13.000000000 
+0200
@@ -0,0 +1,52 @@
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Sergiu Bivol <[email protected]>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: http://bugs.kde.org\n";
+"POT-Creation-Date: 2014-02-18 01:50+0000\n"
+"PO-Revision-Date: 2014-03-25 16:18+0200\n"
+"Last-Translator: Sergiu Bivol <[email protected]>\n"
+"Language-Team: Romanian <[email protected]>\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
+"20)) ? 1 : 2;\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: examples/contactlistqml.cpp:29
+msgid "SweetPeople - KPeople Example"
+msgstr ""
+
+#: widgets/mergedialog.cpp:65
+msgid "Duplicates Manager"
+msgstr "Gestionar de duplicate"
+
+#: widgets/mergedialog.cpp:74
+msgid "Select contacts to be merged"
+msgstr "Alegeți contactele de îmbinat"
+
+#. i18n: ectx: property (text), widget (QLabel, avatarPixmapLabel)
+#: widgets/person-details-presentation.ui:43
+msgid "Avatar"
+msgstr "Avatar"
+
+#: widgets/plugins/emaildetailswidget.cpp:51
+msgid "Email"
+msgstr "Email"
+
+#: widgets/plugins/mergecontactswidget.cpp:51
+msgid "Show Merge Suggestions..."
+msgstr "Arată sugestii de îmbinare..."
+
+#: widgets/plugins/mergecontactswidget.cpp:89
+msgid "Merge with Selected Contacts"
+msgstr "Îmbină cu contactele alese"
+
+#: widgets/plugins/phonedetailswidget.cpp:40
+msgid "Phone"
+msgstr "Telefon"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/po/sl/libkpeople.po 
new/libkpeople-0.2.2/po/sl/libkpeople.po
--- old/libkpeople-0.2.1/po/sl/libkpeople.po    2014-02-20 17:06:39.000000000 
+0100
+++ new/libkpeople-0.2.2/po/sl/libkpeople.po    2014-04-26 01:58:16.000000000 
+0200
@@ -1,13 +1,13 @@
 # Copyright (C) YEAR This_file_is_part_of_KDE
 # This file is distributed under the same license as the PACKAGE package.
 #
-# Andrej Mernik <[email protected]>, 2013.
+# Andrej Mernik <[email protected]>, 2013, 2014.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://bugs.kde.org\n";
 "POT-Creation-Date: 2014-02-18 01:50+0000\n"
-"PO-Revision-Date: 2013-12-02 22:15+0100\n"
+"PO-Revision-Date: 2014-02-21 10:13+0100\n"
 "Last-Translator: Andrej Mernik <[email protected]>\n"
 "Language-Team: Slovenian <[email protected]>\n"
 "Language: sl\n"
@@ -33,7 +33,7 @@
 #. i18n: ectx: property (text), widget (QLabel, avatarPixmapLabel)
 #: widgets/person-details-presentation.ui:43
 msgid "Avatar"
-msgstr ""
+msgstr "Podoba"
 
 #: widgets/plugins/emaildetailswidget.cpp:51
 msgid "Email"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/src/global.h 
new/libkpeople-0.2.2/src/global.h
--- old/libkpeople-0.2.1/src/global.h   2014-02-20 17:05:46.000000000 +0100
+++ new/libkpeople-0.2.2/src/global.h   2014-04-26 01:57:41.000000000 +0200
@@ -34,11 +34,12 @@
 namespace KPeople
 {
     /**
-     * Merge all ids (person IDs and contactIds into a single person)
-     * returns the ID that will be created.
+     * Merge all ids into a single person.
+     * Ids can be a mix of person Ids and contact IDs.
+     *
      * @arg ids a list of all identifiers to be merged
      *
-     * @return the identifier of the new person
+     * @return the identifier of the new person or an empty string upon failure
      */
     KPEOPLE_EXPORT QString mergeContacts(const QStringList &ids);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/src/personmanager.cpp 
new/libkpeople-0.2.2/src/personmanager.cpp
--- old/libkpeople-0.2.1/src/personmanager.cpp  2014-02-20 17:05:46.000000000 
+0100
+++ new/libkpeople-0.2.2/src/personmanager.cpp  2014-04-26 01:57:41.000000000 
+0200
@@ -136,6 +136,10 @@
     QStringList metacontacts;
     QStringList contacts;
 
+    bool rc = true;
+
+    QList<QDBusMessage> pendingMessages;
+
     // separate the passed ids to metacontacts and simple contacts
     Q_FOREACH (const QString &id, ids) {
         if (id.startsWith(QLatin1String("kpeople://"))) {
@@ -182,32 +186,38 @@
             updateQuery.prepare("UPDATE persons SET personID = ? WHERE 
contactID = ?");
             updateQuery.bindValue(0, personIdString.mid(strlen("kpeople://")));
             updateQuery.bindValue(1, id);
-            updateQuery.exec();
+            if (!updateQuery.exec()) {
+                rc = false;
+            }
 
             QDBusMessage message = 
QDBusMessage::createSignal(QLatin1String("/KPeople"),
                                                               
QLatin1String("org.kde.KPeople"),
                                                               
QLatin1String("ContactRemovedFromPerson"));
 
             message.setArguments(QVariantList() << id);
-            QDBusConnection::sessionBus().send(message);
+            pendingMessages << message;
 
             message = QDBusMessage::createSignal(QLatin1String("/KPeople"),
                                                               
QLatin1String("org.kde.KPeople"),
                                                               
QLatin1String("ContactAddedToPerson"));
 
             message.setArguments(QVariantList() << id << personIdString);
-            QDBusConnection::sessionBus().send(message);
+
         }
     }
 
     // process passed contacts
     if (contacts.size() > 0) {
+
+
         Q_FOREACH (const QString &id, contacts) {
             QSqlQuery insertQuery(m_db);
             insertQuery.prepare("INSERT INTO persons VALUES (?, ?)");
             insertQuery.bindValue(0, id);
             insertQuery.bindValue(1, 
personIdString.mid(strlen("kpeople://"))); //strip kpeople://
-            insertQuery.exec();
+            if (!insertQuery.exec()) {
+                rc = false;
+            }
 
             //FUTURE OPTIMIZATION - this would be best as one signal, but 
arguments become complex
             QDBusMessage message = 
QDBusMessage::createSignal(QLatin1String("/KPeople"),
@@ -215,8 +225,19 @@
                                                         
QLatin1String("ContactAddedToPerson"));
 
             message.setArguments(QVariantList() << id << personIdString);
+            pendingMessages << message;
+        }
+    }
+
+    //if success send all messages to other clients
+    //otherwise roll back our database changes and return an empty string
+    if (rc) {
+        Q_FOREACH(const QDBusMessage &message, pendingMessages) {
             QDBusConnection::sessionBus().send(message);
         }
+    } else {
+        t.cancel();
+        personIdString.clear();
     }
 
     return personIdString;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/src/personmanager_p.h 
new/libkpeople-0.2.2/src/personmanager_p.h
--- old/libkpeople-0.2.1/src/personmanager_p.h  2014-02-20 17:05:46.000000000 
+0100
+++ new/libkpeople-0.2.2/src/personmanager_p.h  2014-04-26 01:57:41.000000000 
+0200
@@ -74,10 +74,11 @@
 public Q_SLOTS:
     //merge all ids (person IDs and contactIds into a single person)
     //returns the ID that will be created
+    //users should KPeople::mergeContacts from global.h
     QString mergeContacts(const QStringList &ids);
 
     //unmerge a contact. Either remove a contact from a given person or remove 
a person
-    //
+    //users should KPeople::unmergeContact from global.h
     bool unmergeContact(const QString &id);
 
 Q_SIGNALS:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/src/personsmodel.cpp 
new/libkpeople-0.2.2/src/personsmodel.cpp
--- old/libkpeople-0.2.1/src/personsmodel.cpp   2014-02-20 17:05:46.000000000 
+0100
+++ new/libkpeople-0.2.2/src/personsmodel.cpp   2014-04-26 01:57:41.000000000 
+0200
@@ -9,7 +9,6 @@
 #include <KStandardDirs>
 #include <KDebug>
 
-#include <QDebug>
 #include <QPixmap>
 #include <QTimer>
 
@@ -20,9 +19,10 @@
     QHash<QString /*contactId*/, QString /*PersonId*/> contactToPersons;
 
     //hash of person objects indexed by ID
-    QHash<QString /*Person ID*/, MetaContact> metacontacts;
+    QHash<QString /*Person ID*/, QPersistentModelIndex /*Row*/> personIndex;
+
     //a list so we have an order in the model
-    QStringList personIds;
+    QList<MetaContact> metacontacts;
 
     QString genericAvatarImagePath;
     QList<AllContactsMonitorPtr> m_sourceMonitors;
@@ -43,10 +43,15 @@
     d->initialFetchesDoneCount = 0;
     Q_FOREACH (BasePersonsDataSource* dataSource, 
PersonPluginManager::dataSourcePlugins()) {
         const AllContactsMonitorPtr monitor = dataSource->allContactsMonitor();
-        connect(monitor.data(), SIGNAL(initialFetchComplete()),
-                this, SLOT(onMonitorInitialFetchComplete()));
+        if (monitor.data()->isInitialFetchComplete()) {
+            QTimer::singleShot(0, this, SLOT(onMonitorInitialFetchComplete()));
+        } else {
+            connect(monitor.data(), SIGNAL(initialFetchComplete()),
+                    this, SLOT(onMonitorInitialFetchComplete()));
+        }
         d->m_sourceMonitors << monitor;
     }
+    onContactsFetched();
 
     connect(PersonManager::instance(), 
SIGNAL(contactAddedToPerson(QString,QString)), 
SLOT(onAddContactToPerson(QString,QString)));
     connect(PersonManager::instance(), 
SIGNAL(contactRemovedFromPerson(QString)), 
SLOT(onRemoveContactsFromPerson(QString)));
@@ -63,6 +68,7 @@
 
 QVariant PersonsModel::data(const QModelIndex &index, int role) const
 {
+
     Q_D(const PersonsModel);
 
     //optimization - if we don't cover this role, ignore it
@@ -78,13 +84,12 @@
         if (role == ContactsVCardRole) {
             return 
QVariant::fromValue<KABC::AddresseeList>(KABC::AddresseeList());
         }
-        const QString &personId = d->personIds[index.parent().row()];
-        const MetaContact &mc = d->metacontacts[personId];
+        const MetaContact &mc = d->metacontacts.at(index.parent().row());
 
-        return dataForAddressee(personId, mc.contacts().at(index.row()), role);
+        return dataForAddressee(mc.id(), mc.contacts().at(index.row()), role);
     } else {
-        const QString &personId = d->personIds[index.row()];
-        return dataForAddressee(personId, 
d->metacontacts[personId].personAddressee(), role);
+        const MetaContact &mc = d->metacontacts.at(index.row());
+        return dataForAddressee(mc.id(), mc.personAddressee(), role);
     }
 }
 
@@ -108,7 +113,7 @@
     case PersonVCardRole:
         return QVariant::fromValue<KABC::Addressee>(person);
     case ContactsVCardRole:
-        return 
QVariant::fromValue<KABC::AddresseeList>(d->metacontacts[personId].contacts());
+        return 
QVariant::fromValue<KABC::AddresseeList>(d->metacontacts[d->personIndex[personId].row()].contacts());
     case GroupsRole:
         return person.categories();
     }
@@ -127,11 +132,11 @@
     Q_D(const PersonsModel);
 
     if (!parent.isValid()) {
-        return d->personIds.size();
+        return d->metacontacts.size();
     }
 
     if (parent.isValid() && !parent.parent().isValid()) {
-        return 
d->metacontacts[d->personIds.at(parent.row())].contacts().count();
+        return d->metacontacts.at(parent.row()).contacts().count();
     }
 
     return 0;
@@ -166,8 +171,6 @@
     d->initialFetchesDoneCount++;
     Q_ASSERT(d->initialFetchesDoneCount <= d->m_sourceMonitors.count());
     if (d->initialFetchesDoneCount == d->m_sourceMonitors.count()) {
-
-        onContactsFetched();
         Q_EMIT modelInitialized();
     }
 }
@@ -175,10 +178,10 @@
 void PersonsModel::onContactsFetched()
 {
     Q_D(PersonsModel);
+
     KABC::Addressee::Map addresseeMap;
 
     //fetch all already loaded contacts from plugins
-    KABC::AddresseeList contactList;
     Q_FOREACH (const AllContactsMonitorPtr &contactWatcher, 
d->m_sourceMonitors) {
         addresseeMap.unite(contactWatcher->contacts());
     }
@@ -218,8 +221,9 @@
 
     const QString &personId = personIdForContact(contactId);
 
-    if (d->personIds.contains(personId)) {
-        MetaContact &mc = d->metacontacts[personId];
+    if (d->personIndex.contains(personId)) {
+        int personRow = d->personIndex[personId].row();
+        MetaContact &mc = d->metacontacts[personRow];
 
         //if the MC object already contains this object, we want to update the 
row, not do an insert
         if (mc.contactIds().contains(contactId)) {
@@ -227,7 +231,7 @@
             onContactChanged(contactId, contact);
         } else {
             int newContactPos = mc.contacts().size();
-            beginInsertRows(index(d->personIds.indexOf(personId)), 
newContactPos, newContactPos);
+            beginInsertRows(index(personRow), newContactPos, newContactPos);
             mc.insertContact(contactId, contact);
             endInsertRows();
             personChanged(personId);
@@ -244,11 +248,12 @@
     Q_D(PersonsModel);
 
     const QString &personId = personIdForContact(contactId);
-    int row = d->metacontacts[personId].updateContact(contactId, contact);
+    int personRow = d->personIndex[personId].row();
+    int contactRow = d->metacontacts[personRow].updateContact(contactId, 
contact);
 
-    const QModelIndex contactIndex = index(row,
+    const QModelIndex contactIndex = index(contactRow,
                                            0,
-                                           
index(d->personIds.indexOf(personId)));
+                                           index(personRow));
 
     Q_EMIT dataChanged(contactIndex, contactIndex);
 
@@ -261,10 +266,12 @@
 
     const QString &personId = personIdForContact(contactId);
 
-    MetaContact &mc = d->metacontacts[personId];
-    int contactPosition = 
d->metacontacts[personId].contactIds().indexOf(contactId);
-    beginRemoveRows(index(d->personIds.indexOf(personId), 0), contactPosition, 
contactPosition);
-    d->metacontacts[personId].removeContact(contactId);
+    int personRow = d->personIndex[personId].row();
+
+    MetaContact &mc = d->metacontacts[personRow];
+    int contactPosition = mc.contactIds().indexOf(contactId);
+    beginRemoveRows(index(personRow, 0), contactPosition, contactPosition);
+    mc.removeContact(contactId);
     endRemoveRows();
 
     //if MC object is now invalid remove the person from the list
@@ -279,26 +286,38 @@
     Q_D(PersonsModel);
 
     const QString oldPersonId = personIdForContact(contactId);
+
     d->contactToPersons.insert(contactId, newPersonId);
 
+    int oldPersonRow = d->personIndex[oldPersonId].row();
+
+    if (oldPersonRow < 0) {
+        return;
+    }
+
+    MetaContact &oldMc = d->metacontacts[oldPersonRow];
+
     //get contact already in the model, remove it from the previous contact
-    const KABC::Addressee &contact = 
d->metacontacts[oldPersonId].contact(contactId);
-    int contactPosition = 
d->metacontacts[oldPersonId].contacts().indexOf(contact);
-    beginRemoveRows(index(d->personIds.indexOf(oldPersonId), 0), 
contactPosition, contactPosition);
-    d->metacontacts[oldPersonId].removeContact(contactId);
+    int contactPosition = oldMc.contactIds().indexOf(contactId);
+    const KABC::Addressee contact = oldMc.contacts().at(contactPosition);
+
+    beginRemoveRows(index(oldPersonRow), contactPosition, contactPosition);
+    oldMc.removeContact(contactId);
     endRemoveRows();
 
-    if (!d->metacontacts[oldPersonId].isValid()) {
+    if (!oldMc.isValid()) {
         removePerson(oldPersonId);
     } else {
         personChanged(oldPersonId);
     }
 
     //if the new person is already in the model, add the contact to it
-    if (d->personIds.contains(newPersonId)) {
-        int newContactPos = d->metacontacts[newPersonId].contacts().size();
-        beginInsertRows(index(d->personIds.indexOf(newPersonId), 0), 
newContactPos, newContactPos);
-        d->metacontacts[newPersonId].insertContact(contactId, contact);
+    if (d->personIndex.contains(newPersonId)) {
+        int newPersonRow = d->personIndex[newPersonId].row();
+        MetaContact &newMc = d->metacontacts[newPersonRow];
+        int newContactPos = newMc.contacts().size();
+        beginInsertRows(index(newPersonRow), newContactPos, newContactPos);
+        newMc.insertContact(contactId, contact);
         endInsertRows();
         personChanged(newPersonId);
     } else { //if the person is not in the model, create a new person and 
insert it
@@ -314,12 +333,15 @@
     Q_D(PersonsModel);
 
     const QString personId = personIdForContact(contactId);
-    const KABC::Addressee &contact = 
d->metacontacts[personId].contact(contactId);
-    d->metacontacts[personId].removeContact(contactId);
+    int personRow = d->personIndex[personId].row();
+    MetaContact &mc = d->metacontacts[personRow];
+
+    const KABC::Addressee &contact = mc.contact(contactId);
+    mc.removeContact(contactId);
     d->contactToPersons.remove(contactId);
 
     //if we don't want the person object anymore
-    if (!d->metacontacts[personId].isValid()) {
+    if (!mc.isValid()) {
         removePerson(personId);
     } else {
         personChanged(personId);
@@ -336,9 +358,10 @@
 
     const QString &id = mc.id();
 
-    beginInsertRows(QModelIndex(), d->personIds.size(), d->personIds.size());
-    d->metacontacts[id] = mc;
-    d->personIds << id;
+    int row = d->metacontacts.size();
+    beginInsertRows(QModelIndex(), row, row);
+    d->metacontacts.append(mc);
+    d->personIndex[id] = index(row);
     endInsertRows();
 }
 
@@ -346,21 +369,22 @@
 {
     Q_D(PersonsModel);
 
-    int row = d->personIds.indexOf(id);
-    if (row < 0) { //item not found
+    QPersistentModelIndex index = d->personIndex.value(id);
+    if (!index.isValid()) { //item not found
         return;
     }
 
-    beginRemoveRows(QModelIndex(), row, row);
-    d->metacontacts.remove(id);
-    d->personIds.removeOne(id);
+    beginRemoveRows(QModelIndex(), index.row(), index.row());
+    d->personIndex.remove(id);
+    d->metacontacts.removeAt(index.row());
     endRemoveRows();
 }
 
 void PersonsModel::personChanged(const QString &personId)
 {
     Q_D(const PersonsModel);
-    int row = d->personIds.indexOf(personId);
+
+    int row = d->personIndex[personId].row();
     if (row >= 0) {
         const QModelIndex personIndex = index(row);
         dataChanged(personIndex, personIndex);
@@ -370,6 +394,7 @@
 QString PersonsModel::personIdForContact(const QString &contactId) const
 {
     Q_D(const PersonsModel);
+
     //TODO optimize with constFind()
     if (d->contactToPersons.contains(contactId)) {
         return d->contactToPersons[contactId];
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libkpeople-0.2.1/src/plugins/akonadi/akonadidatasource.cpp 
new/libkpeople-0.2.2/src/plugins/akonadi/akonadidatasource.cpp
--- old/libkpeople-0.2.1/src/plugins/akonadi/akonadidatasource.cpp      
2014-02-20 17:05:46.000000000 +0100
+++ new/libkpeople-0.2.2/src/plugins/akonadi/akonadidatasource.cpp      
2014-04-26 01:57:41.000000000 +0200
@@ -27,6 +27,7 @@
 #include <Akonadi/Collection>
 #include <Akonadi/CollectionFetchJob>
 #include <Akonadi/CollectionFetchScope>
+#include <Akonadi/ServerManager>
 
 #include <KABC/Addressee>
 
@@ -50,6 +51,7 @@
     void onItemAdded(const Akonadi::Item &item);
     void onItemChanged(const Akonadi::Item &item);
     void onItemRemoved(const Akonadi::Item &item);
+    void onServerStateChanged(Akonadi::ServerManager::State);
 private:
     Akonadi::Monitor *m_monitor;
     KABC::Addressee::Map m_contacts;
@@ -60,6 +62,9 @@
     m_monitor(new Akonadi::Monitor(this)),
     m_activeFetchJobsCount(0)
 {
+    connect(Akonadi::ServerManager::self(), 
SIGNAL(stateChanged(Akonadi::ServerManager::State)), 
SLOT(onServerStateChanged(Akonadi::ServerManager::State)));
+    onServerStateChanged(Akonadi::ServerManager::state());
+
     connect(m_monitor, SIGNAL(itemAdded(Akonadi::Item,Akonadi::Collection)), 
SLOT(onItemAdded(Akonadi::Item)));
     connect(m_monitor, SIGNAL(itemChanged(Akonadi::Item,QSet<QByteArray>)), 
SLOT(onItemChanged(Akonadi::Item)));
     connect(m_monitor, SIGNAL(itemRemoved(Akonadi::Item)), 
SLOT(onItemRemoved(Akonadi::Item)));
@@ -131,7 +136,7 @@
         onItemAdded(item);
     }
 
-    if (--m_activeFetchJobsCount == 0) {
+    if (--m_activeFetchJobsCount == 0 && !isInitialFetchComplete()) {
         emitInitialFetchComplete();
     }
 }
@@ -153,11 +158,21 @@
             ++m_activeFetchJobsCount;
         }
     }
-    if (m_activeFetchJobsCount == 0) {
+    if (m_activeFetchJobsCount == 0 && !isInitialFetchComplete()) {
         emitInitialFetchComplete();
+
     }
 }
 
+void AkonadiAllContacts::onServerStateChanged(ServerManager::State state)
+{
+    //if we're broken tell kpeople we've loaded so kpeople doesn't block
+    if(state == Akonadi::ServerManager::Broken && !isInitialFetchComplete()) {
+        emitInitialFetchComplete();
+        qWarning() << "Akonadi failed to load, some metacontact features may 
not be available";
+        qWarning() << "For more information please load akonadi_console" ;
+    }
+}
 
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/src/widgets/persondetailsdialog.cpp 
new/libkpeople-0.2.2/src/widgets/persondetailsdialog.cpp
--- old/libkpeople-0.2.1/src/widgets/persondetailsdialog.cpp    2014-02-20 
17:05:46.000000000 +0100
+++ new/libkpeople-0.2.2/src/widgets/persondetailsdialog.cpp    2014-04-26 
01:57:41.000000000 +0200
@@ -61,6 +61,8 @@
 {
     Q_D(PersonDetailsDialog);
     d->view->setPerson(person);
+
+    setWindowTitle(person->person().formattedName());
 }
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libkpeople-0.2.1/src/widgets/persondetailsview.cpp 
new/libkpeople-0.2.2/src/widgets/persondetailsview.cpp
--- old/libkpeople-0.2.1/src/widgets/persondetailsview.cpp      2014-02-20 
17:05:46.000000000 +0100
+++ new/libkpeople-0.2.2/src/widgets/persondetailsview.cpp      2014-04-26 
01:57:41.000000000 +0200
@@ -88,7 +88,7 @@
 {
     Q_UNUSED(contacts)
     //don't handle emails here - KABC::Field just lists one which is rubbish. 
Instead use a custom plugin that lists everything
-    if (m_field->category() == KABC::Field::Email) {
+    if (m_field->category() & KABC::Field::Email) {
         return 0;
     }
 

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to