Date: Thursday, March 15, 2012 @ 09:55:48 Author: andrea Revision: 153517
Fix a kmail bug with nepomuk (FS#28907); Set PYTHONDONTWRITEBYTECODE to build PyKDE4 with Python3 support (KDEBUG#276151) Added: kdelibs/trunk/fix-kmail-crash.patch kdelibs/trunk/use-pythondontwritebytecode.patch Modified: kdelibs/trunk/PKGBUILD -----------------------------------+ PKGBUILD | 16 +++++-- fix-kmail-crash.patch | 71 +++++++++++++++++++++++++++++++ use-pythondontwritebytecode.patch | 80 ++++++++++++++++++++++++++++++++++++ 3 files changed, 164 insertions(+), 3 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2012-03-15 13:53:43 UTC (rev 153516) +++ PKGBUILD 2012-03-15 13:55:48 UTC (rev 153517) @@ -4,7 +4,7 @@ pkgname=kdelibs pkgver=4.8.1 -pkgrel=1 +pkgrel=2 pkgdesc="KDE Core Libraries" arch=('i686' 'x86_64') url='http://www.kde.org' @@ -17,10 +17,14 @@ replaces=('kdelibs-experimental') install=${pkgname}.install source=("http://download.kde.org/stable/${pkgver}/src/${pkgname}-${pkgver}.tar.xz" - 'kde-applications-menu.patch' 'archlinux-menu.patch') + 'kde-applications-menu.patch' 'archlinux-menu.patch' + 'fix-kmail-crash.patch' + 'use-pythondontwritebytecode.patch') sha1sums=('da4e13f63ac340619351e9a2f4211cce8ec4fdf8' '86ee8c8660f19de8141ac99cd6943964d97a1ed7' - '63a850ab4196b9d06934f2b4a13acd9f7739bc67') + '63a850ab4196b9d06934f2b4a13acd9f7739bc67' + '081b0663480568359120b573d26abb91e1a348c0' + 'a1e35760d5b4e29471ad357c963a343c67200f32') build() { cd "${srcdir}"/${pkgname}-${pkgver} @@ -30,6 +34,12 @@ # add Archlinux menu entry patch -p1 -i "${srcdir}"/archlinux-menu.patch + # Upstream (FS#28907) + patch -p1 -i "${srcdir}"/fix-kmail-crash.patch + + # Set PYTHONDONTWRITEBYTECODE (KDEBUG#276151) + patch -p0 -i "${srcdir}"/use-pythondontwritebytecode.patch + cd "${srcdir}" mkdir build cd build Added: fix-kmail-crash.patch =================================================================== --- fix-kmail-crash.patch (rev 0) +++ fix-kmail-crash.patch 2012-03-15 13:55:48 UTC (rev 153517) @@ -0,0 +1,71 @@ +commit 979b0436510e7807c054e79c40c3753834ac2863 +Author: Sebastian Trueg <tr...@kde.org> +Date: Thu Mar 15 09:14:35 2012 +0100 + + Thread-safe ResourceWatcher handling. + + We simply perform all RW operations in the manager thread. + + BUG: 295474 + FIXED-IN: 4.8.2 + +diff --git a/nepomuk/core/resourcedata.cpp b/nepomuk/core/resourcedata.cpp +index abe55ea..9d45228 100644 +--- a/nepomuk/core/resourcedata.cpp ++++ b/nepomuk/core/resourcedata.cpp +@@ -175,7 +175,8 @@ void Nepomuk::ResourceData::resetAll( bool isDelete ) + if( !m_uri.isEmpty() ) { + m_rm->m_initializedData.remove( m_uri ); + if( m_rm->m_watcher && m_addedToWatcher ) { +- m_rm->m_watcher->removeResource(Resource::fromResourceUri(m_uri)); ++ // See load() for an explanation of the QMetaObject call ++ QMetaObject::invokeMethod(m_rm->m_watcher, "removeResource", Qt::AutoConnection, Q_ARG(Nepomuk::Resource, Resource::fromResourceUri(m_uri))); + m_addedToWatcher = false; + } + } +@@ -393,16 +394,23 @@ bool Nepomuk::ResourceData::load() + m_cache.clear(); + + if(!m_rm->m_watcher) { ++ // ++ // The ResourceWatcher is not thread-safe. Thus, we need to ensure the safety ourselves. ++ // We do that by simply handling all RW related operations in the manager thread. ++ // This also means to invoke methods on the watcher through QMetaObject to make sure they ++ // get queued in case of calls between different threads. ++ // + m_rm->m_watcher = new ResourceWatcher(m_rm->m_manager); ++ m_rm->m_watcher->moveToThread(m_rm->m_manager->thread()); + QObject::connect( m_rm->m_watcher, SIGNAL(propertyAdded(Nepomuk::Resource, Nepomuk::Types::Property, QVariant)), + m_rm->m_manager, SLOT(slotPropertyAdded(Nepomuk::Resource, Nepomuk::Types::Property, QVariant)) ); + QObject::connect( m_rm->m_watcher, SIGNAL(propertyRemoved(Nepomuk::Resource, Nepomuk::Types::Property, QVariant)), + m_rm->m_manager, SLOT(slotPropertyRemoved(Nepomuk::Resource, Nepomuk::Types::Property, QVariant)) ); + m_rm->m_watcher->addResource( Nepomuk::Resource::fromResourceUri(m_uri) ); +- m_rm->m_watcher->start(); ++ QMetaObject::invokeMethod(m_rm->m_watcher, "start", Qt::AutoConnection); + } + else { +- m_rm->m_watcher->addResource( Nepomuk::Resource::fromResourceUri(m_uri) ); ++ QMetaObject::invokeMethod(m_rm->m_watcher, "addResource", Qt::AutoConnection, Q_ARG(Nepomuk::Resource, Nepomuk::Resource::fromResourceUri(m_uri)) ); + } + m_addedToWatcher = true; + +diff --git a/nepomuk/core/resourcewatcher.h b/nepomuk/core/resourcewatcher.h +index 06b9622..92b12f5 100644 +--- a/nepomuk/core/resourcewatcher.h ++++ b/nepomuk/core/resourcewatcher.h +@@ -93,6 +93,7 @@ namespace Nepomuk { + */ + virtual ~ResourceWatcher(); + ++ public Q_SLOTS: + /** + * \brief Add a type to be watched. + * +@@ -204,7 +205,6 @@ namespace Nepomuk { + */ + QList<Types::Property> properties() const; + +- public Q_SLOTS: + /** + * \brief Start the signalling of changes. + * Added: use-pythondontwritebytecode.patch =================================================================== --- use-pythondontwritebytecode.patch (rev 0) +++ use-pythondontwritebytecode.patch 2012-03-15 13:55:48 UTC (rev 153517) @@ -0,0 +1,80 @@ +--- cmake/modules/PythonMacros.cmake ++++ cmake/modules/PythonMacros.cmake +@@ -23,40 +23,42 @@ + # Install the source file. + INSTALL(FILES ${SOURCE_FILE} DESTINATION ${DESINATION_DIR}) + +- # Byte compile and install the .pyc file. +- GET_FILENAME_COMPONENT(_absfilename ${SOURCE_FILE} ABSOLUTE) +- GET_FILENAME_COMPONENT(_filename ${SOURCE_FILE} NAME) +- GET_FILENAME_COMPONENT(_filenamebase ${SOURCE_FILE} NAME_WE) +- GET_FILENAME_COMPONENT(_basepath ${SOURCE_FILE} PATH) +- +- if(WIN32) +- string(REGEX REPLACE ".:/" "/" _basepath "${_basepath}") +- endif(WIN32) +- +- SET(_bin_py ${CMAKE_CURRENT_BINARY_DIR}/${_basepath}/${_filename}) +- SET(_bin_pyc ${CMAKE_CURRENT_BINARY_DIR}/${_basepath}/${_filenamebase}.pyc) +- +- FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${_basepath}) +- +- SET(_message "-DMESSAGE=Byte-compiling ${_bin_py}") +- +- GET_FILENAME_COMPONENT(_abs_bin_py ${_bin_py} ABSOLUTE) +- IF(_abs_bin_py STREQUAL ${_absfilename}) # Don't copy the file onto itself. +- ADD_CUSTOM_COMMAND( +- TARGET compile_python_files +- COMMAND ${CMAKE_COMMAND} -E echo ${message} +- COMMAND ${PYTHON_EXECUTABLE} ${_python_compile_py} ${_bin_py} +- DEPENDS ${_absfilename} +- ) +- ELSE(_abs_bin_py STREQUAL ${_absfilename}) +- ADD_CUSTOM_COMMAND( +- TARGET compile_python_files +- COMMAND ${CMAKE_COMMAND} -E echo ${message} +- COMMAND ${CMAKE_COMMAND} -E copy ${_absfilename} ${_bin_py} +- COMMAND ${PYTHON_EXECUTABLE} ${_python_compile_py} ${_bin_py} +- DEPENDS ${_absfilename} +- ) +- ENDIF(_abs_bin_py STREQUAL ${_absfilename}) ++ # Byte compile and install the .pyc file. ++ IF("$ENV{PYTHONDONTWRITEBYTECODE}" STREQUAL "") ++ GET_FILENAME_COMPONENT(_absfilename ${SOURCE_FILE} ABSOLUTE) ++ GET_FILENAME_COMPONENT(_filename ${SOURCE_FILE} NAME) ++ GET_FILENAME_COMPONENT(_filenamebase ${SOURCE_FILE} NAME_WE) ++ GET_FILENAME_COMPONENT(_basepath ${SOURCE_FILE} PATH) ++ ++ if(WIN32) ++ string(REGEX REPLACE ".:/" "/" _basepath "${_basepath}") ++ endif(WIN32) ++ ++ SET(_bin_py ${CMAKE_CURRENT_BINARY_DIR}/${_basepath}/${_filename}) ++ SET(_bin_pyc ${CMAKE_CURRENT_BINARY_DIR}/${_basepath}/${_filenamebase}.pyc) ++ ++ FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${_basepath}) ++ ++ SET(_message "-DMESSAGE=Byte-compiling ${_bin_py}") ++ ++ GET_FILENAME_COMPONENT(_abs_bin_py ${_bin_py} ABSOLUTE) ++ IF(_abs_bin_py STREQUAL ${_absfilename}) # Don't copy the file onto itself. ++ ADD_CUSTOM_COMMAND( ++ TARGET compile_python_files ++ COMMAND ${CMAKE_COMMAND} -E echo ${message} ++ COMMAND ${PYTHON_EXECUTABLE} ${_python_compile_py} ${_bin_py} ++ DEPENDS ${_absfilename} ++ ) ++ ELSE(_abs_bin_py STREQUAL ${_absfilename}) ++ ADD_CUSTOM_COMMAND( ++ TARGET compile_python_files ++ COMMAND ${CMAKE_COMMAND} -E echo ${message} ++ COMMAND ${CMAKE_COMMAND} -E copy ${_absfilename} ${_bin_py} ++ COMMAND ${PYTHON_EXECUTABLE} ${_python_compile_py} ${_bin_py} ++ DEPENDS ${_absfilename} ++ ) ++ ENDIF(_abs_bin_py STREQUAL ${_absfilename}) + +- INSTALL(FILES ${_bin_pyc} DESTINATION ${DESINATION_DIR}) ++ INSTALL(FILES ${_bin_pyc} DESTINATION ${DESINATION_DIR}) ++ ENDIF("$ENV{PYTHONDONTWRITEBYTECODE}" STREQUAL "") + ENDMACRO(PYTHON_INSTALL)