Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package lager for openSUSE:Factory checked in at 2026-03-13 21:17:51 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/lager (Old) and /work/SRC/openSUSE:Factory/.lager.new.8177 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "lager" Fri Mar 13 21:17:51 2026 rev:5 rq:1338671 version:0.1.3 Changes: -------- --- /work/SRC/openSUSE:Factory/lager/lager.changes 2026-01-26 11:04:03.014331571 +0100 +++ /work/SRC/openSUSE:Factory/.lager.new.8177/lager.changes 2026-03-13 21:21:57.786110138 +0100 @@ -1,0 +2,6 @@ +Fri Mar 6 09:46:32 UTC 2026 - Christophe Marin <[email protected]> + +- Update to 0.1.3 + * CMake: Improvements + +------------------------------------------------------------------- Old: ---- lager-0.1.2.tar.gz New: ---- lager-0.1.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ lager.spec ++++++ --- /var/tmp/diff_new_pack.o5xtLo/_old 2026-03-13 21:21:58.398135385 +0100 +++ /var/tmp/diff_new_pack.o5xtLo/_new 2026-03-13 21:21:58.402135550 +0100 @@ -17,14 +17,14 @@ Name: lager -Version: 0.1.2 +Version: 0.1.3 Release: 0 Summary: C++ library to assist value-oriented design License: MIT URL: https://sinusoid.es/lager/ Source0: https://github.com/arximboldi/lager/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz BuildRequires: boost-devel -BuildRequires: cmake +BuildRequires: cmake >= 3.21 BuildRequires: gcc-c++ # For tests BuildRequires: cmake(Catch2) < 3.0 ++++++ lager-0.1.2.tar.gz -> lager-0.1.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lager-0.1.2/CMakeLists.txt new/lager-0.1.3/CMakeLists.txt --- old/lager-0.1.2/CMakeLists.txt 2026-01-13 21:45:42.000000000 +0100 +++ new/lager-0.1.3/CMakeLists.txt 2026-02-25 11:16:33.000000000 +0100 @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.21) cmake_policy(SET CMP0048 NEW) # enable project VERSION cmake_policy(SET CMP0056 NEW) # honor link flags in try_compile() list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") @@ -21,11 +21,11 @@ include(GNUInstallDirs) -option(lager_BUILD_TESTS "Build tests" ON) -option(lager_BUILD_FAILURE_TESTS "Build failure tests" ON) -option(lager_BUILD_EXAMPLES "Build examples" ON) -option(lager_BUILD_DEBUGGER_EXAMPLES "Build examples that showcase the web based debugger" ON) -option(lager_BUILD_DOCS "Build docs" ON) +option(lager_BUILD_TESTS "Build tests" "${PROJECT_IS_TOP_LEVEL}") +option(lager_BUILD_FAILURE_TESTS "Build failure tests" "${PROJECT_IS_TOP_LEVEL}") +option(lager_BUILD_EXAMPLES "Build examples" "${PROJECT_IS_TOP_LEVEL}") +option(lager_BUILD_DEBUGGER_EXAMPLES "Build examples that showcase the web based debugger" "${PROJECT_IS_TOP_LEVEL}") +option(lager_BUILD_DOCS "Build docs" "${PROJECT_IS_TOP_LEVEL}") option(lager_EMBED_RESOURCES_PATH "Embed installation paths for easier, non-portable resource location" ON) option(lager_DISABLE_STORE_DEPENDENCY_CHECKS "Disable compile-time checks for store dependencies" OFF) option(lager_ENABLE_EXCEPTIONS "Always enable exceptions regardless of detected compiler support" OFF) @@ -52,8 +52,8 @@ find_program(CCACHE ccache) if (CCACHE) message(STATUS "Using ccache: ${CCACHE}") - set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) - set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE}) + set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE}) + set(CMAKE_CXX_LINK_LAUNCHER ${CCACHE}) else() message(STATUS "Could not find ccache") endif() @@ -63,6 +63,7 @@ # the library add_library(lager INTERFACE) +add_library(lager::lager ALIAS lager) target_include_directories(lager INTERFACE $<BUILD_INTERFACE:${lager_BINARY_DIR}/> $<BUILD_INTERFACE:${lager_SOURCE_DIR}/> @@ -83,11 +84,85 @@ target_compile_definitions(lager INTERFACE LAGER_NO_EXCEPTIONS) endif() -install(TARGETS lager EXPORT LagerConfig) +target_sources(lager PUBLIC FILE_SET HEADERS + FILES + lager/commit.hpp + lager/config.hpp + lager/constant.hpp + lager/context.hpp + lager/cursor.hpp + lager/debug/debugger.hpp + lager/debug/http_server.hpp + lager/debug/tree_debugger.hpp + lager/deps.hpp + lager/detail/access.hpp + lager/detail/lens_nodes.hpp + lager/detail/merge_nodes.hpp + lager/detail/no_value.hpp + lager/detail/nodes.hpp + lager/detail/signal.hpp + lager/detail/smart_lens.hpp + lager/detail/xform_nodes.hpp + lager/effect.hpp + lager/event_loop/boost_asio.hpp + lager/event_loop/manual.hpp + lager/event_loop/qml.hpp + lager/event_loop/qt.hpp + lager/event_loop/queue.hpp + lager/event_loop/safe_queue.hpp + lager/event_loop/sdl.hpp + lager/extra/cereal/enum.hpp + lager/extra/cereal/immer_array.hpp + lager/extra/cereal/immer_box.hpp + lager/extra/cereal/immer_flex_vector.hpp + lager/extra/cereal/immer_map.hpp + lager/extra/cereal/immer_set.hpp + lager/extra/cereal/immer_table.hpp + lager/extra/cereal/immer_vector.hpp + lager/extra/cereal/inline.hpp + lager/extra/cereal/json.hpp + lager/extra/cereal/optional_nvp.hpp + lager/extra/cereal/struct.hpp + lager/extra/cereal/tuple.hpp + lager/extra/cereal/variant_with_name.hpp + lager/extra/derive.hpp + lager/extra/derive/cereal.hpp + lager/extra/derive/eq.hpp + lager/extra/derive/hana.hpp + lager/extra/derive/hash.hpp + lager/extra/derive/size_check.hpp + lager/extra/enum.hpp + lager/extra/qt.hpp + lager/extra/struct.hpp + lager/extra/thunk.hpp + lager/future.hpp + lager/lens.hpp + lager/lenses.hpp + lager/lenses/at.hpp + lager/lenses/at_or.hpp + lager/lenses/attr.hpp + lager/lenses/optional.hpp + lager/lenses/tuple.hpp + lager/lenses/unbox.hpp + lager/lenses/variant.hpp + lager/reader.hpp + lager/resources_path.hpp.in + lager/sensor.hpp + lager/setter.hpp + lager/state.hpp + lager/store.hpp + lager/tags.hpp + lager/util.hpp + lager/watch.hpp + lager/with.hpp + lager/writer.hpp +) + +install(TARGETS lager EXPORT LagerConfig FILE_SET HEADERS) # requirements for tests and examples if (lager_BUILD_TESTS OR lager_BUILD_EXAMPLES) - find_package(Boost 1.56 CONFIG COMPONENTS system REQUIRED) + find_package(Boost 1.56 CONFIG) find_package(Threads REQUIRED) find_package(Immer REQUIRED) find_package(Zug REQUIRED) @@ -150,8 +225,7 @@ if (lager_BUILD_DEBUGGER_EXAMPLES) add_library(lager-debugger-example INTERFACE) target_link_libraries(lager-debugger-example INTERFACE - lager-example - Boost::system) + lager-example) add_custom_target(gui ALL COMMAND make diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lager-0.1.2/lager/cursor.hpp new/lager-0.1.3/lager/cursor.hpp --- old/lager-0.1.2/lager/cursor.hpp 2026-01-13 21:45:42.000000000 +0100 +++ new/lager-0.1.3/lager/cursor.hpp 2026-02-25 11:16:33.000000000 +0100 @@ -35,6 +35,7 @@ using writer_mixin<DerivT>::zoom; using writer_mixin<DerivT>::xform; using reader_mixin<DerivT>::xform; + using reader_mixin<DerivT>::operator bool; protected: ~cursor_mixin() = default; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lager-0.1.2/lager/detail/nodes.hpp new/lager-0.1.3/lager/detail/nodes.hpp --- old/lager-0.1.2/lager/detail/nodes.hpp 2026-01-13 21:45:42.000000000 +0100 +++ new/lager-0.1.3/lager/detail/nodes.hpp 2026-02-25 11:16:33.000000000 +0100 @@ -218,11 +218,19 @@ needs_send_down_ = false; needs_notify_ = true; has_sent_down_ = true; - for (auto& wchild : this->children()) { + + const auto& children = this->children(); + const size_t n_children = children.size(); + for (auto& wchild : children) { if (auto child = wchild.lock()) { child->send_down(); } } + assert(n_children == children.size() && + "Children must not change during send_down, \ + because iterators would be invalidated leading to UB. \ + Maybe you created a new cursor inside a cursor.map(...) \ + call?"); } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lager-0.1.2/lager/event_loop/qt.hpp new/lager-0.1.3/lager/event_loop/qt.hpp --- old/lager-0.1.2/lager/event_loop/qt.hpp 2026-01-13 21:45:42.000000000 +0100 +++ new/lager-0.1.3/lager/event_loop/qt.hpp 2026-02-25 11:16:33.000000000 +0100 @@ -14,9 +14,11 @@ #include <lager/config.hpp> -#include <QObject> -#include <QThreadPool> -#include <QtConcurrent> +#include <QtConcurrent/QtConcurrent> +#include <QtCore/QCoreApplication> +#include <QtCore/QEvent> +#include <QtCore/QObject> +#include <QtCore/QThreadPool> #include <functional> #include <stdexcept> @@ -30,7 +32,11 @@ std::reference_wrapper<QThreadPool> thread_pool = *QThreadPool::globalInstance(); - ~with_qt_event_loop() { thread_pool.get().waitForDone(); } + ~with_qt_event_loop() + { + QCoreApplication::removePostedEvents(&obj.get(), QEvent::MetaCall); + thread_pool.get().waitForDone(); + } template <typename Fn> void async(Fn&& fn) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lager-0.1.2/lager/extra/cereal/immer_table.hpp new/lager-0.1.3/lager/extra/cereal/immer_table.hpp --- old/lager-0.1.2/lager/extra/cereal/immer_table.hpp 1970-01-01 01:00:00.000000000 +0100 +++ new/lager-0.1.3/lager/extra/cereal/immer_table.hpp 2026-02-25 11:16:33.000000000 +0100 @@ -0,0 +1,58 @@ +// +// lager - library for functional interactive c++ programs +// Copyright (C) 2017 Juan Pedro Bolivar Puente +// +// This file is part of lager. +// +// lager is free software: you can redistribute it and/or modify +// it under the terms of the MIT License, as detailed in the LICENSE +// file located at the root of this source code distribution, +// or here: <https://github.com/arximboldi/lager/blob/master/LICENSE> +// + +#pragma once + +#include <lager/config.hpp> + +#include <cereal/cereal.hpp> +#include <immer/table.hpp> + +namespace cereal { + +template <typename Archive, + typename T, + typename KF, + typename H, + typename E, + typename MP, + std::uint32_t B> +void CEREAL_LOAD_FUNCTION_NAME(Archive& ar, immer::table<T, KF, H, E, MP, B>& m) +{ + size_type size; + ar(make_size_tag(size)); + + for (auto i = size_type{}; i < size; ++i) { + T x; + ar(x); + m = std::move(m).insert(std::move(x)); + } + if (size != m.size()) + throw std::runtime_error{"duplicate ids?"}; +} + +template <typename Archive, + typename T, + typename KF, + typename H, + typename E, + typename MP, + std::uint32_t B> +void CEREAL_SAVE_FUNCTION_NAME(Archive& ar, + const immer::table<T, KF, H, E, MP, B>& m) +{ + ar(make_size_tag(static_cast<size_type>(m.size()))); + for (auto&& v : m) + ar(v); +} + +} // namespace cereal diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lager-0.1.2/lager/reader.hpp new/lager-0.1.3/lager/reader.hpp --- old/lager-0.1.2/lager/reader.hpp 2026-01-13 21:45:42.000000000 +0100 +++ new/lager-0.1.3/lager/reader.hpp 2026-02-25 11:16:33.000000000 +0100 @@ -32,6 +32,11 @@ template <typename DerivT> struct reader_mixin { + explicit operator bool() const + { + return maybe_node_() != nullptr; + }; + decltype(auto) get() const { return node_()->last(); } decltype(auto) operator*() const { return get(); } decltype(auto) operator->() const { return &get(); } @@ -71,12 +76,16 @@ auto node_() const { - if (auto node = - detail::access::node(*static_cast<const DerivT*>(this))) { + if (auto node = maybe_node_()) { return node; } LAGER_THROW(std::runtime_error("Accessing uninitialized reader")); } + + auto maybe_node_() const + { + return detail::access::node(*static_cast<const DerivT*>(this)); + } }; template <typename NodeT> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lager-0.1.2/lager/writer.hpp new/lager-0.1.3/lager/writer.hpp --- old/lager-0.1.2/lager/writer.hpp 2026-01-13 21:45:42.000000000 +0100 +++ new/lager-0.1.3/lager/writer.hpp 2026-02-25 11:16:33.000000000 +0100 @@ -28,6 +28,11 @@ template <typename DerivT> struct writer_mixin { + explicit operator bool() const + { + return maybe_node_() != nullptr; + }; + template <typename T> void set(T&& value) { @@ -70,12 +75,16 @@ auto node_() const { - if (auto node = - detail::access::node(*static_cast<const DerivT*>(this))) { + if (auto node = maybe_node_()) { return node; } LAGER_THROW(std::runtime_error("Accessing uninitialized writer")); } + + auto maybe_node_() const + { + return detail::access::node(*static_cast<const DerivT*>(this)); + } }; template <typename NodeT> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lager-0.1.2/test/cereal/immer_table.cpp new/lager-0.1.3/test/cereal/immer_table.cpp --- old/lager-0.1.2/test/cereal/immer_table.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/lager-0.1.3/test/cereal/immer_table.cpp 2026-02-25 11:16:33.000000000 +0100 @@ -0,0 +1,44 @@ +// +// lager - library for functional interactive c++ programs +// Copyright (C) 2017 Juan Pedro Bolivar Puente +// +// This file is part of lager. +// +// lager is free software: you can redistribute it and/or modify +// it under the terms of the MIT License, as detailed in the LICENSE +// file located at the root of this source code distribution, +// or here: <https://github.com/arximboldi/lager/blob/master/LICENSE> +// + +#include "cerealize.hpp" + +#include <lager/extra/cereal/immer_table.hpp> + +#include <catch2/catch.hpp> + +struct entry_t +{ + size_t id; + size_t value; + + bool operator==(const entry_t& other) const + { + return id == other.id && value == other.value; + } + + template <typename Archive> + void serialize(Archive& ar) + { + ar(CEREAL_NVP(id), CEREAL_NVP(value)); + } +}; + +TEST_CASE("basic") +{ + auto x = immer::table<entry_t>{{.id = 1, .value = 2}, + {.id = 3, .value = 4}, + {.id = 12, .value = 42}, + {.id = 0, .value = 5}}; + auto y = cerealize(x); + CHECK(x == y); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lager-0.1.2/test/cursor.cpp new/lager-0.1.3/test/cursor.cpp --- old/lager-0.1.2/test/cursor.cpp 2026-01-13 21:45:42.000000000 +0100 +++ new/lager-0.1.3/test/cursor.cpp 2026-02-25 11:16:33.000000000 +0100 @@ -37,30 +37,36 @@ TEST_CASE("in, construction and assignment from temporary") { reader<int> in1; + CHECK(!in1); // Access to uninitialized reader should throw an exception REQUIRE_THROWS(in1.get()); in1 = make_state(0); + CHECK(in1); reader<int> in2{make_state(0)}; } TEST_CASE("out, construction_and_assignment_from_temporary") { writer<int> out1; + CHECK(!out1); // Access to uninitialized writer should throw an exception REQUIRE_THROWS(out1.set(42)); REQUIRE_THROWS(out1.update([](auto) { return 42; })); out1 = make_state(0); + CHECK(out1); writer<int> out2{make_state(0)}; } TEST_CASE("inout, construction_and_assignment_from_temporary") { cursor<int> inout1; + CHECK(!inout1); // Access to uninitialized cursor should throw an exception REQUIRE_THROWS(inout1.get()); REQUIRE_THROWS(inout1.set(42)); REQUIRE_THROWS(inout1.update([](auto) { return 42; })); inout1 = make_state(0); + CHECK(inout1); cursor<int> inout2{make_state(0)}; }
