Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package kf6-kcalendarcore for 
openSUSE:Factory checked in at 2026-05-11 16:50:53
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/kf6-kcalendarcore (Old)
 and      /work/SRC/openSUSE:Factory/.kf6-kcalendarcore.new.1966 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "kf6-kcalendarcore"

Mon May 11 16:50:53 2026 rev:27 rq:1352065 version:6.26.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/kf6-kcalendarcore/kf6-kcalendarcore.changes      
2026-04-11 22:27:26.318998208 +0200
+++ 
/work/SRC/openSUSE:Factory/.kf6-kcalendarcore.new.1966/kf6-kcalendarcore.changes
    2026-05-11 16:55:28.268178353 +0200
@@ -1,0 +2,28 @@
+Sat May  2 07:52:30 UTC 2026 - Christophe Marin <[email protected]>
+
+- Update to 6.26.0
+  * New feature release
+  * For more details please see:
+  * https://kde.org/announcements/frameworks/6/6.26.0
+- Changes since 6.25.0:
+  * Documentation fixes
+  * Update dependency version to 6.26.0
+  * Expose calendar color role in CalendarListModel
+  * Read/write calendar name from iCal
+  * Add support for the calendar color property
+  * Avoid failing the build on warnings in generated code
+  * Add Python bindings for KCalendarCore
+  * Remove undefined MAX_DATE symbol
+  * .gitlab-ci.yml - add clazy builds to merge requests
+  * clazy use-static-qregularexpression fix
+  * cppcheck unreadVariable fix
+  * clazy fully-qualified-moc-types fix
+  * clazy range-loop-detach fixes
+  * clazy range-loop-reference fix
+  * cppcheck variableScope fixes
+  * clazy detaching-temporary fixes
+  * cppcheck constVariablePointer fixes
+  * CI - cppcheck suppressions and define ICAL_CHECK_VERSION
+  * Update version to 6.26.0
+
+-------------------------------------------------------------------

Old:
----
  kcalendarcore-6.25.0.tar.xz
  kcalendarcore-6.25.0.tar.xz.sig

New:
----
  kcalendarcore-6.26.0.tar.xz
  kcalendarcore-6.26.0.tar.xz.sig

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

Other differences:
------------------
++++++ kf6-kcalendarcore.spec ++++++
--- /var/tmp/diff_new_pack.50T2ci/_old  2026-05-11 16:55:30.600274478 +0200
+++ /var/tmp/diff_new_pack.50T2ci/_new  2026-05-11 16:55:30.628275632 +0200
@@ -16,15 +16,28 @@
 #
 
 
-%define qt6_version 6.8.0
+%define qt6_version 6.9.0
 
 %define sonum 6
 %define rname kcalendarcore
-# Full KF6 version (e.g. 6.25.0)
+
+%bcond_without kde_python_bindings
+%if %{with kde_python_bindings}
+%if 0%{suse_version} > 1500
+%define pythons %{primary_python}
+%else
+%{?sle15_python_module_pythons}
+%endif
+%define mypython %pythons
+%define __mypython %{expand:%%__%{mypython}}
+%define mypython_sitearch %{expand:%%%{mypython}_sitearch}
+%endif
+
+# Full KF6 version (e.g. 6.26.0)
 %{!?_kf6_version: %global _kf6_version %{version}}
 %bcond_without released
 Name:           kf6-kcalendarcore
-Version:        6.25.0
+Version:        6.26.0
 Release:        0
 Summary:        Library to access and handle calendar data
 License:        LGPL-2.0-or-later
@@ -42,6 +55,16 @@
 BuildRequires:  cmake(Qt6Qml) >= %{qt6_version}
 BuildRequires:  cmake(Qt6Gui) >= %{qt6_version}
 BuildRequires:  cmake(Qt6ToolsTools) >= %{qt6_version}
+# SECTION bindings
+%if %{with kde_python_bindings}
+BuildRequires:  %{mypython}-build
+BuildRequires:  %{mypython}-devel >= 3.9
+BuildRequires:  %{mypython}-setuptools
+BuildRequires:  %{mypython}-wheel
+BuildRequires:  cmake(Shiboken6)
+BuildRequires:  cmake(PySide6)
+%endif
+# /SECTION
 
 %description
 KCalendarCore is a library to provide access to and handling of calendar data.
@@ -77,6 +100,14 @@
 scheduling standard iTIP. This package contains the headers necessary to
 develop applications making use of KCalendarCore.
 
+%if %{with kde_python_bindings}
+%package -n python3-kf6-kcalendarcore
+Summary:        Python bindings for kf6-kcalendarcore
+
+%description -n python3-kf6-kcalendarcore
+This package provides Python bindings for kf6-kcalendarcore.
+%endif
+
 %prep
 %autosetup -p1 -n %{rname}-%{version}
 
@@ -85,7 +116,11 @@
 %define _lto_cflags %{nil}
 %endif
 
-%cmake_kf6
+%cmake_kf6 \
+%if %{with kde_python_bindings}
+  -DPython_EXECUTABLE:STRING=%{__mypython}
+%endif
+%{nil}
 
 %kf6_build
 
@@ -111,4 +146,14 @@
 %{_kf6_includedir}/KCalendarCore/
 %{_kf6_libdir}/libKF6CalendarCore.so
 %{_kf6_pkgconfigdir}/KF6CalendarCore.pc
+%if %{with kde_python_bindings}
+%dir %{_includedir}/PySide6/
+%{_includedir}/PySide6/KCalendarCore/
+%endif
+
+%if %{with kde_python_bindings}
+%files -n python3-kf6-kcalendarcore
+%{mypython_sitearch}/*.so
+%{_kf6_sharedir}/PySide6/typesystems/typesystem_kcalendarcore.xml
+%endif
 


++++++ kcalendarcore-6.25.0.tar.xz -> kcalendarcore-6.26.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/.gitlab-ci.yml 
new/kcalendarcore-6.26.0/.gitlab-ci.yml
--- old/kcalendarcore-6.25.0/.gitlab-ci.yml     2026-04-03 19:07:27.000000000 
+0200
+++ new/kcalendarcore-6.26.0/.gitlab-ci.yml     2026-05-01 14:20:54.000000000 
+0200
@@ -12,3 +12,24 @@
       - /gitlab-templates/windows-qt6.yml
       - /gitlab-templates/alpine-qt6.yml
       - /gitlab-templates/pre-commit.yml
+
+build_clazy:
+ extends:
+  - .ci_linux_base
+  - .suse_tumbleweed_qt6stable
+ rules:
+  # only run on merge requests
+  - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ variables:
+    # remove/comment the CXXFLAGS if you don't want the build to fail on clazy 
issues
+    CXXFLAGS: -Wno-deprecated-declarations
+    CC: clang
+    CXX: clazy
+ script:
+  - git config --global --add safe.directory $CI_PROJECT_DIR
+  - python3 -u ci-utilities/run-ci-build.py --project $CI_PROJECT_NAME 
--branch $CI_COMMIT_REF_NAME --platform Linux/Qt6/Shared 
--only-setup-environment
+  - mkdir -p /tmp/$CI_PROJECT_NAME-clazy-build
+  - cd /tmp/$CI_PROJECT_NAME-clazy-build
+  - cmake -DENABLE_PCH=OFF -DKF_SKIP_PO_PROCESSING=True -G Ninja 
-DCMAKE_INSTALL_PREFIX=$CI_PROJECT_DIR/_install -DKF6DocTools_FOUND=false 
$CI_PROJECT_DIR
+  - ninja -k 0
+ artifacts: null
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/.kde-ci.yml 
new/kcalendarcore-6.26.0/.kde-ci.yml
--- old/kcalendarcore-6.25.0/.kde-ci.yml        2026-04-03 19:07:27.000000000 
+0200
+++ new/kcalendarcore-6.26.0/.kde-ci.yml        2026-05-01 14:20:54.000000000 
+0200
@@ -6,3 +6,4 @@
 Options:
  test-before-installing: True
  require-passing-tests-on: ['@all']
+ cppcheck-arguments: '--enable=warning,performance,portability,style 
--suppress-xml=cppcheck-suppressions.xml -DICAL_CHECK_VERSION(X,Y,Z)='
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/CMakeLists.txt 
new/kcalendarcore-6.26.0/CMakeLists.txt
--- old/kcalendarcore-6.25.0/CMakeLists.txt     2026-04-03 19:07:27.000000000 
+0200
+++ new/kcalendarcore-6.26.0/CMakeLists.txt     2026-05-01 14:20:54.000000000 
+0200
@@ -1,11 +1,11 @@
 cmake_minimum_required(VERSION 3.29)
-set(KF_VERSION "6.25.0") # handled by release scripts
+set(KF_VERSION "6.26.0") # handled by release scripts
 
 project(KCalendarCore VERSION ${KF_VERSION})
 
 # ECM setup
 include(FeatureSummary)
-find_package(ECM 6.25.0 NO_MODULE)
+find_package(ECM 6.26.0 NO_MODULE)
 set_package_properties(
     ECM
     PROPERTIES
@@ -82,6 +82,32 @@
             REQUIRED
 )
 
+option(BUILD_PYTHON_BINDINGS "Build Python bindings" ON)
+
+# Only Linux and FreeBSD CI has the relevant packages
+if(ANDROID OR APPLE OR WIN32 OR HAIKU OR NOT BUILD_SHARED_LIBS)
+    set(BUILD_PYTHON_BINDINGS OFF)
+endif()
+
+if(BUILD_PYTHON_BINDINGS)
+    find_package(
+        Python3
+        3.9
+        REQUIRED
+        COMPONENTS
+            Interpreter
+            Development
+    )
+    find_package(Shiboken6 REQUIRED)
+    find_package(PySide6 REQUIRED)
+endif()
+
+add_feature_info(
+    PYTHON_BINDINGS
+    ${BUILD_PYTHON_BINDINGS}
+    "Python bindings"
+)
+
 ########### CMake Config Files ###########
 set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF6CalendarCore")
 
@@ -98,6 +124,11 @@
 ########### Targets ###########
 add_subdirectory(src)
 
+if(BUILD_PYTHON_BINDINGS)
+    include(ECMGeneratePythonBindings)
+    add_subdirectory(python)
+endif()
+
 if(BUILD_TESTING)
     find_package(Qt6 ${REQUIRED_QT_VERSION} CONFIG REQUIRED Test)
     add_subdirectory(autotests)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kcalendarcore-6.25.0/autotests/testcalendarobserver.cpp 
new/kcalendarcore-6.26.0/autotests/testcalendarobserver.cpp
--- old/kcalendarcore-6.25.0/autotests/testcalendarobserver.cpp 2026-04-03 
19:07:27.000000000 +0200
+++ new/kcalendarcore-6.26.0/autotests/testcalendarobserver.cpp 2026-05-01 
14:20:54.000000000 +0200
@@ -36,7 +36,7 @@
     void incidenceAdded(const KCalendarCore::Incidence::Ptr &incidence);
     void incidenceChanged(const KCalendarCore::Incidence::Ptr &incidence);
     void incidenceAboutToBeDeleted(const KCalendarCore::Incidence::Ptr 
&incidence);
-    void incidenceDeleted(const KCalendarCore::Incidence::Ptr &incidence, 
const Calendar *calendar);
+    void incidenceDeleted(const KCalendarCore::Incidence::Ptr &incidence, 
const KCalendarCore::Calendar *calendar);
 
 protected:
     void calendarIncidenceAdded(const KCalendarCore::Incidence::Ptr 
&incidence) override
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/autotests/testicalformat.cpp 
new/kcalendarcore-6.26.0/autotests/testicalformat.cpp
--- old/kcalendarcore-6.25.0/autotests/testicalformat.cpp       2026-04-03 
19:07:27.000000000 +0200
+++ new/kcalendarcore-6.26.0/autotests/testicalformat.cpp       2026-05-01 
14:20:54.000000000 +0200
@@ -18,6 +18,7 @@
 
 QTEST_MAIN(ICalFormatTest)
 
+using namespace Qt::Literals;
 using namespace KCalendarCore;
 
 void ICalFormatTest::testDeserializeSerialize()
@@ -196,7 +197,7 @@
 
     Incidence::Ptr event2 = format.fromString(serializedCalendar);
     QVERIFY(event2->attendeeCount() == 1);
-    Attendee attendee2 = event2->attendees()[0];
+    Attendee attendee2 = event2->attendees().at(0);
     QVERIFY(attendee2.cuType() == attendee.cuType());
     QVERIFY(attendee2.name() == attendee.name());
     QVERIFY(attendee2.email() == attendee.email());
@@ -216,7 +217,7 @@
         + format.toString(event.staticCast<Incidence>()) + 
QLatin1String("\nEND:VCALENDAR");
 
     Incidence::Ptr event2 = format.fromString(serialized);
-    Alarm::Ptr alarm2 = event2->alarms()[0];
+    Alarm::Ptr alarm2 = event2->alarms().at(0);
     QCOMPARE(*alarm, *alarm2);
 }
 
@@ -545,4 +546,34 @@
     QCOMPARE(recurrence->endDate(), QDate(2024, 4, 1));
 }
 
+void ICalFormatTest::testCalendarProperties()
+{
+    const auto input = R"(
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Hugo Calendar Templates//Event Template//EN
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+UID:5562947a-9f8d-4a38-9ed5-1536cb3a21f0
+LAST-MODIFIED:20260414T171115Z
+URL:https://kde.org/community/calendar/
+REFRESH-INTERVAL;VALUE=DURATION:P1W
+SOURCE;VALUE=URI:https://kde.org/community/calendar/calendar.ics
+COLOR:crimson
+NAME;LANGUAGE=en-US:KDE Community Calendar
+DESCRIPTION;LANGUAGE=en-US:All the community events where you can find the KDE 
Community.
+X-WR-CALNAME:KDE Community Calendar
+X-WR-CALDESC:All the community events where you can find the KDE Community.
+END:VCALENDAR)";
+    ICalFormat format;
+    MemoryCalendar::Ptr cal(new MemoryCalendar(QTimeZone::utc()));
+    QVERIFY(format.fromString(cal, QLatin1StringView(input)));
+    QCOMPARE(cal->name(), "KDE Community Calendar"_L1);
+    QCOMPARE(cal->color(), "crimson"_L1);
+    cal->setColor(u"blue"_s);
+    cal->setName(u"Test Calendar Name"_s);
+    QVERIFY(format.toString(cal).contains("COLOR:blue"_L1));
+    QVERIFY(format.toString(cal).contains("NAME:Test Calendar Name"_L1));
+}
+
 #include "moc_testicalformat.cpp"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/autotests/testicalformat.h 
new/kcalendarcore-6.26.0/autotests/testicalformat.h
--- old/kcalendarcore-6.25.0/autotests/testicalformat.h 2026-04-03 
19:07:27.000000000 +0200
+++ new/kcalendarcore-6.26.0/autotests/testicalformat.h 2026-05-01 
14:20:54.000000000 +0200
@@ -33,6 +33,7 @@
     void testNonTextCustomProperties();
     void testAllDaySchedulingMessage();
     void testAllDayRecurringUntil();
+    void testCalendarProperties();
 };
 
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/cppcheck-suppressions.xml 
new/kcalendarcore-6.26.0/cppcheck-suppressions.xml
--- old/kcalendarcore-6.25.0/cppcheck-suppressions.xml  1970-01-01 
01:00:00.000000000 +0100
+++ new/kcalendarcore-6.26.0/cppcheck-suppressions.xml  2026-05-01 
14:20:54.000000000 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<suppressions>
+  <suppress>
+    <id>useStlAlgorithm</id>
+  </suppress>
+  <suppress>
+    <id>shadowFunction</id>
+  </suppress>
+  <suppress>
+    <id>functionStatic</id>
+  </suppress>
+</suppressions>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/python/CMakeLists.txt 
new/kcalendarcore-6.26.0/python/CMakeLists.txt
--- old/kcalendarcore-6.25.0/python/CMakeLists.txt      1970-01-01 
01:00:00.000000000 +0100
+++ new/kcalendarcore-6.26.0/python/CMakeLists.txt      2026-05-01 
14:20:54.000000000 +0200
@@ -0,0 +1,79 @@
+# SPDX-FileCopyrightText: 2026 Kevin Ottens <[email protected]>
+# SPDX-License-Identifier: BSD-2-Clause
+
+set(bindings_library "KCalendarCore")
+
+set(wrapped_header ${CMAKE_CURRENT_SOURCE_DIR}/bindings.h)
+set(typesystem_file ${CMAKE_CURRENT_SOURCE_DIR}/typesystem_kcalendarcore.xml)
+
+set(generated_sources
+    ${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_module_wrapper.cpp
+    ${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_wrapper.cpp
+    ${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_alarm_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_attachment_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_attendee_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_calendarlistmodel_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_calendarpluginloader_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_calendarplugin_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_calendar_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_calfilter_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_calformat_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_calstorage_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_conference_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_customproperties_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_duration_wrapper.cpp
+    ${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_events_wrapper.cpp
+    ${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_event_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_exception_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_filestorage_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_freebusycache_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_freebusyperiod_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_freebusy_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_icalformat_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_incidencebase_incidenceobserver_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_incidencebase_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_incidences_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_incidence_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_journals_wrapper.cpp
+    ${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_journal_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_memorycalendar_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_occurrenceiterator_wrapper.cpp
+    ${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_period_wrapper.cpp
+    ${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_person_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_recurrence_recurrenceobserver_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_recurrencerule_ruleobserver_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_recurrencerule_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_recurrence_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_schedulemessage_wrapper.cpp
+    ${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_todos_wrapper.cpp
+    ${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_todo_wrapper.cpp
+    
${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_vcalformat_wrapper.cpp
+    ${CMAKE_CURRENT_BINARY_DIR}/KCalendarCore/kcalendarcore_visitor_wrapper.cpp
+)
+
+ecm_generate_python_bindings(
+    PACKAGE_NAME ${bindings_library}
+    VERSION ${KF_VERSION}
+    WRAPPED_HEADER ${wrapped_header}
+    TYPESYSTEM ${typesystem_file}
+    EXPORT_TYPESYSTEM
+    GENERATED_SOURCES ${generated_sources}
+    DEPENDENCIES KF6::CalendarCore
+    QT_VERSION ${REQUIRED_QT_VERSION}
+    HOMEPAGE_URL "https://invent.kde.org/frameworks/kcalendarcore";
+    ISSUES_URL 
"https://bugs.kde.org/describecomponents.cgi?product=frameworks-kcalendarcore";
+    AUTHOR "The KDE Community"
+    README ../README.md
+)
+
+target_link_libraries(${bindings_library} PRIVATE KF6CalendarCore)
+
+execute_process(
+    COMMAND
+        ${Python_EXECUTABLE} -Esc
+        "import sysconfig; print(sysconfig.get_path('platlib', 
vars={'platbase': '${CMAKE_INSTALL_PREFIX}', 'base': 
'${CMAKE_INSTALL_PREFIX}'}))"
+    OUTPUT_VARIABLE sysconfig_output
+)
+string(STRIP ${sysconfig_output} PYTHON_INSTALL_DIR)
+
+install(TARGETS ${bindings_library} LIBRARY DESTINATION 
"${PYTHON_INSTALL_DIR}")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/python/bindings.h 
new/kcalendarcore-6.26.0/python/bindings.h
--- old/kcalendarcore-6.25.0/python/bindings.h  1970-01-01 01:00:00.000000000 
+0100
+++ new/kcalendarcore-6.26.0/python/bindings.h  2026-05-01 14:20:54.000000000 
+0200
@@ -0,0 +1,41 @@
+// SPDX-FileCopyrightText: 2026 Kevin Ottens <[email protected]>
+// SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR 
LicenseRef-KDE-Accepted-LGPL
+
+#pragma once
+
+#include <QBitArray>
+
+#include <KCalendarCore/Alarm>
+#include <KCalendarCore/Attachment>
+#include <KCalendarCore/Attendee>
+#include <KCalendarCore/CalFilter>
+#include <KCalendarCore/CalFormat>
+#include <KCalendarCore/CalStorage>
+#include <KCalendarCore/Calendar>
+#include <KCalendarCore/CalendarListModel>
+#include <KCalendarCore/CalendarPlugin>
+#include <KCalendarCore/CalendarPluginLoader>
+#include <KCalendarCore/Conference>
+#include <KCalendarCore/CustomProperties>
+#include <KCalendarCore/Duration>
+#include <KCalendarCore/Event>
+#include <KCalendarCore/Exceptions>
+#include <KCalendarCore/FileStorage>
+#include <KCalendarCore/FreeBusy>
+#include <KCalendarCore/FreeBusyCache>
+#include <KCalendarCore/FreeBusyPeriod>
+#include <KCalendarCore/ICalFormat>
+#include <KCalendarCore/Incidence>
+#include <KCalendarCore/IncidenceBase>
+#include <KCalendarCore/Journal>
+#include <KCalendarCore/MemoryCalendar>
+#include <KCalendarCore/OccurrenceIterator>
+#include <KCalendarCore/Period>
+#include <KCalendarCore/Person>
+#include <KCalendarCore/Recurrence>
+#include <KCalendarCore/RecurrenceRule>
+#include <KCalendarCore/ScheduleMessage>
+#include <KCalendarCore/Sorting>
+#include <KCalendarCore/Todo>
+#include <KCalendarCore/VCalFormat>
+#include <KCalendarCore/Visitor>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kcalendarcore-6.25.0/python/typesystem_kcalendarcore.xml 
new/kcalendarcore-6.26.0/python/typesystem_kcalendarcore.xml
--- old/kcalendarcore-6.25.0/python/typesystem_kcalendarcore.xml        
1970-01-01 01:00:00.000000000 +0100
+++ new/kcalendarcore-6.26.0/python/typesystem_kcalendarcore.xml        
2026-05-01 14:20:54.000000000 +0200
@@ -0,0 +1,100 @@
+<?xml version="1.0"?>
+<typesystem package="KCalendarCore">
+<!--
+SPDX-FileCopyrightText: 2026 Kevin Ottens <[email protected]>
+SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR 
LicenseRef-KDE-Accepted-LGPL
+-->
+    <load-typesystem name="typesystem_core.xml" generate="no"/>
+    <load-typesystem name="typesystem_gui.xml" generate="no"/>
+
+    <namespace-type name="KCalendarCore">
+        <enum-type name="AccessMode"/>
+        <enum-type name="EventSortField"/>
+        <enum-type name="iTIPMethod"/>
+        <enum-type name="JournalSortField"/>
+        <enum-type name="SortDirection"/>
+        <enum-type name="TodoSortField"/>
+
+        <object-type name="Alarm">
+            <enum-type name="Type"/>
+        </object-type>
+        <value-type name="Attachment"/>
+        <value-type name="Attendee">
+            <enum-type name="CuType"/>
+            <enum-type name="PartStat"/>
+            <enum-type name="Role"/>
+        </value-type>
+        <object-type name="Calendar" disable-wrapper="yes"/>
+        <object-type name="CalendarListModel">
+            <enum-type name="Role"/>
+        </object-type>
+        <object-type name="CalendarPlugin" force-abstract="yes" 
disable-wrapper="yes"/>
+        <object-type name="CalendarPluginLoader"/>
+        <object-type name="CalFilter">
+            <enum-type name="Criteria"/>
+        </object-type>
+        <object-type name="CalFormat"/>
+        <object-type name="CalStorage"/>
+        <value-type name="Conference"/>
+        <object-type name="CustomProperties"/>
+        <value-type name="Duration">
+            <enum-type name="Type"/>
+        </value-type>
+        <object-type name="Event">
+            <enum-type name="Transparency"/>
+        </object-type>
+        <object-type name="Exception">
+            <enum-type name="ErrorCode"/>
+        </object-type>
+        <object-type name="FileStorage"/>
+        <object-type name="FreeBusy"/>
+        <object-type name="FreeBusyCache" force-abstract="yes" 
disable-wrapper="yes"/>
+        <object-type name="FreeBusyPeriod">
+            <enum-type name="FreeBusyType"/>
+        </object-type>
+        <object-type name="ICalFormat"/>
+        <object-type name="IncidenceBase">
+            <enum-type name="DateTimeRole"/>
+            <enum-type name="Field"/>
+            <enum-type name="IncidenceType"/>
+            <enum-type name="VirtualHook"/>
+            <object-type name="IncidenceObserver"/>
+            <modify-function signature="assign(const 
KCalendarCore::IncidenceBase &amp;)" remove="all"/>
+        </object-type>
+        <object-type name="Incidence">
+            <enum-type name="RelType"/>
+            <enum-type name="Secrecy"/>
+            <enum-type name="Status"/>
+        </object-type>
+        <object-type name="Journal"/>
+        <object-type name="MemoryCalendar"/>
+        <object-type name="OccurrenceIterator"/>
+        <value-type name="Period"/>
+        <object-type name="Person"/>
+        <object-type name="Recurrence">
+            <object-type name="RecurrenceObserver"/>
+        </object-type>
+        <value-type name="RecurrenceRule">
+            <object-type name="RuleObserver"/>
+            <enum-type name="PeriodType"/>
+            <modify-function signature="endDt(bool*) const">
+                <modify-argument index="1">
+                    <remove-argument />
+                </modify-argument>
+            </modify-function>
+        </value-type>
+        <object-type name="ScheduleMessage">
+            <enum-type name="Status"/>
+        </object-type>
+        <object-type name="Todo"/>
+        <object-type name="VCalFormat"/>
+        <object-type name="Visitor"/>
+
+        <namespace-type name="Events"/>
+        <namespace-type name="Todos"/>
+        <namespace-type name="Journals"/>
+        <namespace-type name="Incidences"/>
+
+    </namespace-type>
+
+</typesystem>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/src/calendar.cpp 
new/kcalendarcore-6.26.0/src/calendar.cpp
--- old/kcalendarcore-6.25.0/src/calendar.cpp   2026-04-03 19:07:27.000000000 
+0200
+++ new/kcalendarcore-6.26.0/src/calendar.cpp   2026-05-01 14:20:54.000000000 
+0200
@@ -231,11 +231,10 @@
 {
     const Incidence::List rawInc = rawIncidences();
     QStringList uniqueCategories;
-    QStringList thisCats;
     // @TODO: For now just iterate over all incidences. In the future,
     // the list of categories should be built when reading the file.
     for (const Incidence::Ptr &inc : rawInc) {
-        thisCats = inc->categories();
+        QStringList thisCats = inc->categories();
         for (const auto &cat : std::as_const(thisCats)) {
             if (!uniqueCategories.contains(cat)) {
                 uniqueCategories.append(cat);
@@ -983,6 +982,20 @@
     Q_EMIT iconChanged();
 }
 
+QString Calendar::color() const
+{
+    return d->mColor;
+}
+
+void Calendar::setColor(const QString &color)
+{
+    if (d->mColor == color) {
+        return;
+    }
+    d->mColor = color;
+    Q_EMIT colorChanged();
+}
+
 AccessMode Calendar::accessMode() const
 {
     return d->mAccessMode;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/src/calendar.h 
new/kcalendarcore-6.26.0/src/calendar.h
--- old/kcalendarcore-6.25.0/src/calendar.h     2026-04-03 19:07:27.000000000 
+0200
+++ new/kcalendarcore-6.26.0/src/calendar.h     2026-05-01 14:20:54.000000000 
+0200
@@ -258,6 +258,21 @@
     Q_PROPERTY(QIcon icon READ icon WRITE setIcon NOTIFY iconChanged)
 
     /*!
+     * \qmlproperty string calendar::color
+     * \since 6.26
+     *
+     * This calendar's color.
+     */
+
+    /*!
+     * \property KCalendarCore::Calendar::color
+     * \since 6.26
+     *
+     * This calendar's color.
+     */
+    Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged)
+
+    /*!
      * \qmlproperty KCalendarCore::AccessMode calendar::accessMode
      */
 
@@ -465,6 +480,20 @@
     void setIcon(const QIcon &icon);
 
     /*!
+     * Returns this calendar's color.
+     * \sa RFC 7986 ยง5.9
+     * \since 6.26
+     */
+    [[nodiscard]] QString color() const;
+
+    /*!
+     * Sets this calendar's \a color.
+     * \since 6.26
+     * \sa color()
+     */
+    void setColor(const QString &color);
+
+    /*!
      * Returns this calendar's AccessMode, i.e. whether it is writable or 
read-only.
      * Defaults to ReadWrite.
      * \since 5.85
@@ -1392,6 +1421,13 @@
     void iconChanged();
 
     /*!
+     * Emitted when the icon color changes.
+     * \since 6.26
+     * \sa color()
+     */
+    void colorChanged();
+
+    /*!
      * Emitted when the AccessMode changes.
      * \since 5.85
      * \sa accessMode()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/src/calendar_p.h 
new/kcalendarcore-6.26.0/src/calendar_p.h
--- old/kcalendarcore-6.25.0/src/calendar_p.h   2026-04-03 19:07:27.000000000 
+0200
+++ new/kcalendarcore-6.26.0/src/calendar_p.h   2026-05-01 14:20:54.000000000 
+0200
@@ -66,6 +66,7 @@
     QString mId;
     QString mName;
     QIcon mIcon;
+    QString mColor;
     AccessMode mAccessMode = ReadWrite;
 };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/src/calendarlistmodel.cpp 
new/kcalendarcore-6.26.0/src/calendarlistmodel.cpp
--- old/kcalendarcore-6.25.0/src/calendarlistmodel.cpp  2026-04-03 
19:07:27.000000000 +0200
+++ new/kcalendarcore-6.26.0/src/calendarlistmodel.cpp  2026-05-01 
14:20:54.000000000 +0200
@@ -55,13 +55,15 @@
     case NameRole:
         return cal->name();
     case IconRole:
-        return cal->icon();
+        return cal->icon().isNull() ? QVariant() : cal->icon();
     case CalendarRole:
         return QVariant::fromValue(cal.get());
     case AccessModeRole:
         return cal->accessMode();
     case IdRole:
         return cal->id();
+    case ColorRole:
+        return cal->color();
     }
 
     return {};
@@ -75,6 +77,7 @@
     n.insert(CalendarRole, "calendar");
     n.insert(AccessModeRole, "accessMode");
     n.insert(IdRole, "id");
+    n.insert(ColorRole, "color");
     return n;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/src/calendarlistmodel.h 
new/kcalendarcore-6.26.0/src/calendarlistmodel.h
--- old/kcalendarcore-6.25.0/src/calendarlistmodel.h    2026-04-03 
19:07:27.000000000 +0200
+++ new/kcalendarcore-6.26.0/src/calendarlistmodel.h    2026-05-01 
14:20:54.000000000 +0200
@@ -45,6 +45,8 @@
       The access mode of the calendar (see KCalendarCore::AccessMode).
       \value IdRole
       The internal calendar id.
+      \value[since 6.26] ColorRole
+      The calendar color.
      */
     enum Role {
         NameRole = Qt::DisplayRole,
@@ -52,6 +54,7 @@
         CalendarRole = Qt::UserRole,
         AccessModeRole,
         IdRole,
+        ColorRole,
     };
 
     [[nodiscard]] int rowCount(const QModelIndex &parent = {}) const override;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/src/compat.cpp 
new/kcalendarcore-6.26.0/src/compat.cpp
--- old/kcalendarcore-6.25.0/src/compat.cpp     2026-04-03 19:07:27.000000000 
+0200
+++ new/kcalendarcore-6.26.0/src/compat.cpp     2026-05-01 14:20:54.000000000 
+0200
@@ -34,13 +34,14 @@
 {
     Compat *compat = nullptr;
 
+    static QRegularExpression regexp(QStringLiteral("[ /]"));
     int korg = productId.indexOf(QLatin1String("KOrganizer"));
     int outl9 = productId.indexOf(QLatin1String("Outlook 9.0"));
 
     if (korg >= 0) {
         int versionStart = productId.indexOf(QLatin1Char(' '), korg);
         if (versionStart >= 0) {
-            int versionStop = 
productId.indexOf(QRegularExpression(QStringLiteral("[ /]")), versionStart + 1);
+            int versionStop = productId.indexOf(regexp, versionStart + 1);
             if (versionStop >= 0) {
                 QString version = productId.mid(versionStart + 1, versionStop 
- versionStart - 1);
 
@@ -86,6 +87,7 @@
 
 void Compat::fixEmptySummary(const Incidence::Ptr &incidence)
 {
+    static QRegularExpression regexp(QStringLiteral("\n.*"));
     // some stupid vCal exporters ignore the standard and use Description
     // instead of Summary for the default field. Correct for this: Copy the
     // first line of the description to the summary (if summary is just one
@@ -93,7 +95,7 @@
     if (incidence->summary().isEmpty() && 
!(incidence->description().isEmpty())) {
         QString oldDescription = incidence->description().trimmed();
         QString newSummary(oldDescription);
-        newSummary.remove(QRegularExpression(QStringLiteral("\n.*")));
+        newSummary.remove(regexp);
         incidence->setSummary(newSummary);
         if (oldDescription == newSummary) {
             incidence->setDescription(QLatin1String(""));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/src/icalformat_p.cpp 
new/kcalendarcore-6.26.0/src/icalformat_p.cpp
--- old/kcalendarcore-6.25.0/src/icalformat_p.cpp       2026-04-03 
19:07:27.000000000 +0200
+++ new/kcalendarcore-6.26.0/src/icalformat_p.cpp       2026-05-01 
14:20:54.000000000 +0200
@@ -343,9 +343,9 @@
     writeIncidence(vjournal, journal.staticCast<Incidence>(), tzUsedList);
 
     // start time
-    icalproperty *prop = nullptr;
     QDateTime dt = journal->dtStart();
     if (dt.isValid()) {
+        icalproperty *prop = nullptr;
         icaltimetype start;
         if (journal->allDay()) {
             start = writeICalDate(dt.date());
@@ -813,7 +813,7 @@
     r.freq = toIcalEnum(recur->recurrenceType());
 #endif
 
-    int index = 0;
+    int index;
     QList<int> bys;
 
     // Now write out the BY* parts:
@@ -2614,6 +2614,18 @@
     icalproperty_set_x_name(p, IMPLEMENTATION_VERSION_XPROPERTY);
     icalcomponent_add_property(calendar, p);
 
+    // calendar name
+    if (cal && !cal->name().isEmpty()) {
+        auto p = icalproperty_new_name(cal->name().toUtf8().constData());
+        icalcomponent_add_property(calendar, p);
+    }
+
+    // calendar color
+    if (cal && !cal->color().isEmpty()) {
+        auto p = icalproperty_new_color(cal->color().toUtf8().constData());
+        icalcomponent_add_property(calendar, p);
+    }
+
     // Add time zone
     // NOTE: Commented out since relevant timezones are added by the caller.
     // Previously we got some timezones listed twice in the ical file.
@@ -2735,6 +2747,16 @@
         }
     }
 
+    // calendar name
+    if (p = icalcomponent_get_first_property(calendar, ICAL_NAME_PROPERTY); p) 
{
+        cal->setName(QString::fromUtf8(icalproperty_get_value_as_string(p)));
+    }
+
+    // calendar color
+    if (p = icalcomponent_get_first_property(calendar, ICAL_COLOR_PROPERTY); 
p) {
+        cal->setColor(QString::fromUtf8(icalproperty_get_value_as_string(p)));
+    }
+
     // Populate the calendar's time zone collection with all VTIMEZONE 
components
     ICalTimeZoneCache timeZoneCache;
     ICalTimeZoneParser parser(&timeZoneCache);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/src/memorycalendar.cpp 
new/kcalendarcore-6.26.0/src/memorycalendar.cpp
--- old/kcalendarcore-6.25.0/src/memorycalendar.cpp     2026-04-03 
19:07:27.000000000 +0200
+++ new/kcalendarcore-6.26.0/src/memorycalendar.cpp     2026-05-01 
14:20:54.000000000 +0200
@@ -230,7 +230,7 @@
             instances.append(it.value());
         }
     }
-    for (Incidence::Ptr instance : instances) {
+    for (Incidence::Ptr &instance : instances) {
         deleteIncidence(instance);
     }
 
@@ -391,7 +391,7 @@
     QDateTime nd(end, QTime(23, 59, 59, 999), ts);
 
     // Get todos
-    for (const auto &incidence : d->mIncidences[Incidence::TypeTodo]) {
+    for (const auto &incidence : 
std::as_const(d->mIncidences[Incidence::TypeTodo])) {
         const auto todo = incidence.staticCast<Todo>();
 
         QDateTime rStart = todo->hasDueDate() ? todo->dtDue() : 
todo->hasStartDate() ? todo->dtStart() : QDateTime();
@@ -518,7 +518,7 @@
         // When dstart changes, move recurrence ids of exception accordingly.
         if (inc->recurs() && inc->dtStart() != d->mDtStartBeingUpdated) {
             const Duration delta(d->mDtStartBeingUpdated, inc->dtStart());
-            for (Incidence::Ptr exception : instances(inc)) {
+            for (Incidence::Ptr &exception : instances(inc)) {
                 
exception->setRecurrenceId(delta.end(exception->recurrenceId()));
             }
         }
@@ -552,7 +552,7 @@
 
     // Iterate over all events. Look for recurring events that occur on this 
date
     const auto ts = timeZone.isValid() ? timeZone : this->timeZone();
-    for (const auto &event : d->mIncidences[Incidence::TypeEvent]) {
+    for (const auto &event : 
std::as_const(d->mIncidences[Incidence::TypeEvent])) {
         const auto ev = event.staticCast<Event>();
         if (ev->recurs()) {
             if (ev->isMultiDay()) {
@@ -588,7 +588,7 @@
     QDateTime nd(end, QTime(23, 59, 59, 999), ts);
 
     // Get non-recurring events
-    for (const auto &e : d->mIncidences[Incidence::TypeEvent]) {
+    for (const auto &e : std::as_const(d->mIncidences[Incidence::TypeEvent])) {
         const auto event = e.staticCast<Event>();
         QDateTime rStart = event->dtStart();
         if (nd.isValid() && nd < rStart) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/src/person.cpp 
new/kcalendarcore-6.26.0/src/person.cpp
--- old/kcalendarcore-6.25.0/src/person.cpp     2026-04-03 19:07:27.000000000 
+0200
+++ new/kcalendarcore-6.26.0/src/person.cpp     2026-05-01 14:20:54.000000000 
+0200
@@ -91,7 +91,7 @@
     }
     // Taken from KContacts::Addressee::fullEmail
     QString fullName = name;
-    const QRegularExpression needQuotes(QStringLiteral("[^ 
0-9A-Za-z\\x{0080}-\\x{FFFF}]"));
+    static QRegularExpression needQuotes(QStringLiteral("[^ 
0-9A-Za-z\\x{0080}-\\x{FFFF}]"));
     bool weNeedToQuote = name.indexOf(needQuotes) != -1;
     if (weNeedToQuote) {
         if (fullName[0] != QLatin1Char('"')) {
@@ -172,12 +172,10 @@
     const int len = aStr.length();
     const char cQuotes = '"';
 
-    bool bInComment = false;
+    bool bInComment;
     bool bInQuotesOutsideOfEmail = false;
     int i = 0;
     int iAd = 0;
-    int iMailStart = 0;
-    int iMailEnd = 0;
     QChar c;
     unsigned int commentstack = 0;
 
@@ -223,6 +221,8 @@
         }
 
     } else {
+        int iMailStart = 0;
+        int iMailEnd = 0;
         // Loop backwards until we find the start of the string
         // or a ',' that is outside of a comment
         //          and outside of quoted text before the leading '<'.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/src/recurrence.cpp 
new/kcalendarcore-6.26.0/src/recurrence.cpp
--- old/kcalendarcore-6.25.0/src/recurrence.cpp 2026-04-03 19:07:27.000000000 
+0200
+++ new/kcalendarcore-6.26.0/src/recurrence.cpp 2026-05-01 14:20:54.000000000 
+0200
@@ -466,7 +466,7 @@
 
 int Recurrence::duration() const
 {
-    RecurrenceRule *rrule = defaultRRuleConst();
+    const RecurrenceRule *rrule = defaultRRuleConst();
     return rrule ? rrule->duration() : 0;
 }
 
@@ -530,7 +530,7 @@
         rr->shiftTimes(oldTz, newTz);
     }
 
-    for (auto exR : d->mExRules) {
+    for (auto &exR : d->mExRules) {
         exR->shiftTimes(oldTz, newTz);
     }
 }
@@ -599,7 +599,7 @@
 
 int Recurrence::frequency() const
 {
-    RecurrenceRule *rrule = defaultRRuleConst();
+    const RecurrenceRule *rrule = defaultRRuleConst();
     return rrule ? rrule->frequency() : 0;
 }
 
@@ -622,7 +622,7 @@
 
 int Recurrence::weekStart() const
 {
-    RecurrenceRule *rrule = defaultRRuleConst();
+    const RecurrenceRule *rrule = defaultRRuleConst();
     return rrule ? rrule->weekStart() : 1;
 }
 
@@ -631,7 +631,7 @@
 {
     QBitArray days(7);
     days.fill(0);
-    RecurrenceRule *rrule = defaultRRuleConst();
+    const RecurrenceRule *rrule = defaultRRuleConst();
     if (rrule) {
         const QList<RecurrenceRule::WDayPos> &bydays = rrule->byDays();
         for (int i = 0; i < bydays.size(); ++i) {
@@ -648,7 +648,7 @@
 // Emulate the old behavior
 QList<int> Recurrence::monthDays() const
 {
-    RecurrenceRule *rrule = defaultRRuleConst();
+    const RecurrenceRule *rrule = defaultRRuleConst();
     if (rrule) {
         return rrule->byMonthDays();
     } else {
@@ -659,7 +659,7 @@
 // Emulate the old behavior
 QList<RecurrenceRule::WDayPos> Recurrence::monthPositions() const
 {
-    RecurrenceRule *rrule = defaultRRuleConst();
+    const RecurrenceRule *rrule = defaultRRuleConst();
     return rrule ? rrule->byDays() : QList<RecurrenceRule::WDayPos>();
 }
 
@@ -667,7 +667,7 @@
 
 QList<int> Recurrence::yearDays() const
 {
-    RecurrenceRule *rrule = defaultRRuleConst();
+    const RecurrenceRule *rrule = defaultRRuleConst();
     return rrule ? rrule->byYearDays() : QList<int>();
 }
 
@@ -678,7 +678,7 @@
 
 QList<int> Recurrence::yearMonths() const
 {
-    RecurrenceRule *rrule = defaultRRuleConst();
+    const RecurrenceRule *rrule = defaultRRuleConst();
     return rrule ? rrule->byMonths() : QList<int>();
 }
 
@@ -796,7 +796,7 @@
         return;
     }
 
-    RecurrenceRule *rrule = defaultRRule(false);
+    const RecurrenceRule *rrule = defaultRRule(false);
     if (!rrule) {
         return;
     }
@@ -835,7 +835,7 @@
         return;
     }
 
-    RecurrenceRule *rrule = defaultRRule(true);
+    const RecurrenceRule *rrule = defaultRRule(true);
     if (!rrule) {
         return;
     }
@@ -880,7 +880,7 @@
 // Daynumber within year
 void Recurrence::addYearlyDay(int day)
 {
-    RecurrenceRule *rrule = defaultRRule(false); // It must already exist!
+    const RecurrenceRule *rrule = defaultRRule(false); // It must already 
exist!
     if (!rrule) {
         return;
     }
@@ -940,7 +940,7 @@
         return;
     }
 
-    RecurrenceRule *rrule = defaultRRule(false);
+    const RecurrenceRule *rrule = defaultRRule(false);
     if (!rrule) {
         return;
     }
@@ -1509,11 +1509,11 @@
     serializeQDateTimeAsKDateTime(out, r->d->mStartDateTime);
     out << r->d->mCachedType << r->d->mAllDay << r->d->mRecurReadOnly << 
r->d->mExDates << (qint32)r->d->mExRules.count() << 
(qint32)r->d->mRRules.count();
 
-    for (RecurrenceRule *rule : std::as_const(r->d->mExRules)) {
+    for (const RecurrenceRule *rule : std::as_const(r->d->mExRules)) {
         out << rule;
     }
 
-    for (RecurrenceRule *rule : std::as_const(r->d->mRRules)) {
+    for (const RecurrenceRule *rule : std::as_const(r->d->mRRules)) {
         out << rule;
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/src/recurrence.h 
new/kcalendarcore-6.26.0/src/recurrence.h
--- old/kcalendarcore-6.25.0/src/recurrence.h   2026-04-03 19:07:27.000000000 
+0200
+++ new/kcalendarcore-6.26.0/src/recurrence.h   2026-05-01 14:20:54.000000000 
+0200
@@ -668,9 +668,6 @@
      */
     Q_REQUIRED_RESULT QList<RecurrenceRule::WDayPos> yearPositions() const;
 
-    /*! Upper date limit for recurrences */
-    static const QDate MAX_DATE;
-
     /*!
       Debug output.
     */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/src/recurrencerule.cpp 
new/kcalendarcore-6.26.0/src/recurrencerule.cpp
--- old/kcalendarcore-6.25.0/src/recurrencerule.cpp     2026-04-03 
19:07:27.000000000 +0200
+++ new/kcalendarcore-6.26.0/src/recurrencerule.cpp     2026-05-01 
14:20:54.000000000 +0200
@@ -1751,8 +1751,8 @@
     }
 
     QDateTime st = start < d->mDateStart ? d->mDateStart : start;
-    bool done = false;
     if (d->mDuration > 0) {
+        bool done = false;
         if (!d->mCached) {
             d->buildCache();
         }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/src/todo.cpp 
new/kcalendarcore-6.26.0/src/todo.cpp
--- old/kcalendarcore-6.25.0/src/todo.cpp       2026-04-03 19:07:27.000000000 
+0200
+++ new/kcalendarcore-6.26.0/src/todo.cpp       2026-05-01 14:20:54.000000000 
+0200
@@ -495,7 +495,7 @@
 bool TodoPrivate::recurTodo(Todo *todo)
 {
     if (todo && todo->recurs()) {
-        Recurrence *r = todo->recurrence();
+        const Recurrence *r = todo->recurrence();
         const QDateTime recurrenceEndDateTime = r->endDateTime();
         QDateTime nextOccurrenceDateTime = todo->dtStart().isValid() ? 
r->getNextDateTime(todo->dtStart()) : 
r->getNextDateTime(QDateTime::currentDateTime());
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/src/vcalformat.cpp 
new/kcalendarcore-6.26.0/src/vcalformat.cpp
--- old/kcalendarcore-6.25.0/src/vcalformat.cpp 2026-04-03 19:07:27.000000000 
+0200
+++ new/kcalendarcore-6.26.0/src/vcalformat.cpp 2026-05-01 14:20:54.000000000 
+0200
@@ -373,14 +373,13 @@
 
             case Recurrence::rWeekly: {
                 QBitArray qba(7);
-                QString dayStr;
                 if (index == last) {
                     // e.g. W1 #0
                     qba.setBit(anEvent->dtStart().date().dayOfWeek() - 1);
                 } else {
                     // e.g. W1 SU #0
                     while (index < last) {
-                        dayStr = tmpStr.mid(index, 3);
+                        QString dayStr = tmpStr.mid(index, 3);
                         int dayNum = numFromDay(dayStr);
                         if (dayNum >= 0) {
                             qba.setBit(dayNum);
@@ -810,14 +809,13 @@
 
             case Recurrence::rWeekly: {
                 QBitArray qba(7);
-                QString dayStr;
                 if (index == last) {
                     // e.g. W1 #0
                     qba.setBit(anEvent->dtStart().date().dayOfWeek() - 1);
                 } else {
                     // e.g. W1 SU #0
                     while (index < last) {
-                        dayStr = tmpStr.mid(index, 3);
+                        QString dayStr = tmpStr.mid(index, 3);
                         int dayNum = numFromDay(dayStr);
                         if (dayNum >= 0) {
                             qba.setBit(dayNum);
@@ -1372,15 +1370,14 @@
         // like vcal-tzoffset-daylightoffsets, or better yet,
         // vcal-hash<the former>
 
-        QStringList tzList;
-        QString tz;
         int utcOffset;
         if (parseTZOffsetISO8601(ts, utcOffset)) {
             // qCDebug(KCALCORE_LOG) << "got standard offset" << ts << 
utcOffset;
             // standard from tz
             // starting date for now 01011900
             QDateTime dt = QDateTime(QDateTime(QDate(1900, 1, 1), QTime(0, 0, 
0)));
-            tz = 
QStringLiteral("STD;%1;false;%2").arg(QString::number(utcOffset), 
dt.toString());
+            QString tz = 
QStringLiteral("STD;%1;false;%2").arg(QString::number(utcOffset), 
dt.toString());
+            QStringList tzList;
             tzList.append(tz);
 
             // go through all the daylight tags
@@ -1634,7 +1631,6 @@
 void VCalFormat::readCustomProperties(VObject *o, const Incidence::Ptr &i)
 {
     VObjectIterator iter;
-    char *s;
 
     initPropIterator(&iter, o);
     while (moreIteration(&iter)) {
@@ -1644,7 +1640,8 @@
         if ((curname[0] == 'X' && curname[1] == '-') && strcmp(curname, 
ICOrganizerProp) != 0) {
             // TODO - for the time being, we ignore the parameters part
             // and just do the value handling here
-            i->setNonKDECustomProperty(curname, QString::fromUtf8(s = 
fakeCString(vObjectUStringZValue(cur))));
+            char *s = fakeCString(vObjectUStringZValue(cur));
+            i->setNonKDECustomProperty(curname, QString::fromUtf8(s));
             deleteStr(s);
         }
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kcalendarcore-6.25.0/src/xcalformat.cpp 
new/kcalendarcore-6.26.0/src/xcalformat.cpp
--- old/kcalendarcore-6.25.0/src/xcalformat.cpp 2026-04-03 19:07:27.000000000 
+0200
+++ new/kcalendarcore-6.26.0/src/xcalformat.cpp 2026-05-01 14:20:54.000000000 
+0200
@@ -132,7 +132,8 @@
         }
 
         if (reader.name().compare("iCalendar"_L1, Qt::CaseInsensitive) == 0) {
-            for (const auto &a : reader.namespaceDeclarations()) {
+            const auto declarations = reader.namespaceDeclarations();
+            for (const auto &a : declarations) {
                 if (a.namespaceUri() == 
"urn:ietf:params:xml:ns:icalendar-2.0"_L1) {
                     m_format = Rfc6321;
                 } else if (a.namespaceUri() == 
"urn:ietf:params:xml:ns:xcal"_L1) {

Reply via email to