From 5d0b3c705c45e6f8a0fafb13d010d24b207ae80d Mon Sep 17 00:00:00 2001
From: "Yuya.Nishida." <yuya@j96.org>
Date: Wed, 11 Nov 2026 19:14:13 +0900
Subject: [PATCH] fix: restore the settings of Redmine::Configuration.with when
 the block raises

A failed assertion in the block left the settings changed for the
following tests.

---
 lib/redmine/configuration.rb                |  3 ++-
 test/unit/lib/redmine/configuration_test.rb | 10 ++++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/lib/redmine/configuration.rb b/lib/redmine/configuration.rb
index 2cd8594e4..9fcf30e04 100644
--- a/lib/redmine/configuration.rb
+++ b/lib/redmine/configuration.rb
@@ -92,7 +92,8 @@ module Redmine
         was = settings.keys.index_with { |v| @config[v] }
         @config.merge! settings
         yield if block_given?
-        @config.merge! was
+      ensure
+        @config.merge! was if was
       end
 
       private
diff --git a/test/unit/lib/redmine/configuration_test.rb b/test/unit/lib/redmine/configuration_test.rb
index c5337b5cd..a186b6afd 100644
--- a/test/unit/lib/redmine/configuration_test.rb
+++ b/test/unit/lib/redmine/configuration_test.rb
@@ -53,6 +53,16 @@ class Redmine::ConfigurationTest < ActiveSupport::TestCase
     assert_equal 'foo', @conf['somesetting']
   end
 
+  def test_with_should_restore_settings_if_the_block_raises
+    load_conf('default.yml', 'test')
+    assert_raise RuntimeError do
+      @conf.with 'somesetting' => 'bar' do
+        raise 'error'
+      end
+    end
+    assert_equal 'foo', @conf['somesetting']
+  end
+
   private
 
   def load_conf(file, env)
-- 
2.51.1

