Subject: bug#68969: closed (Re: bug#68969: [PATCH] Fix handling of delta values with negative month field)

From: [email-masked] (GNU bug Tracking System)
Date: Sat, 01 Mar 2025 03:42:02 +0000

Your bug report

#68969: [PATCH] Fix handling of delta values with negative month field

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
68969: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=68969
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#68969: [PATCH] Fix handling of delta values with negative month field
From: Stefan Kangas <[email-masked]>
To: Łukasz Stelmach <[email-masked]>
Cc: [email-masked]
Date: Fri, 28 Feb 2025 19:41:22 -0800
List-Id: <debbugs-submit.debbugs.gnu.org>

Version: 31.1

Łukasz Stelmach <[email-masked]> writes:

> Stefan Kangas <[email-masked]> writes:
>
>> Łukasz Stelmach <[email-masked]> writes:
>>
>>> * lisp/calendar/time-date.el (decoded-time-add): If the new
>>> variable is less then zero, the year needs to be decremented
>>> by quotient of new and 12 increased by one.
>>> * test/lisp/calendar/time-date-tests.el (test-decoded-add):
>>> Add applicable test cases.
>>> ---
>>>  lisp/calendar/time-date.el            |  2 +-
>>>  test/lisp/calendar/time-date-tests.el | 12 ++++++++++++
>>>  2 files changed, 13 insertions(+), 1 deletion(-)
>>
>> Thanks, and sorry for the late reply here.
>>
>> Could you please explain what is the issue that this patch fixes?  Is
>> there a concrete use case that made you run into this?
>
> I was playing with Gnus' message list limiting
> gnus-summary-limit-to-age[1] and making my own
> lksz-gnus-summary-limit-to-month before sending this patch, but honestly
> I can't remember exactly. Beginning of a year may suggest that I was
> moving some e-mail messages between archive folders and something wasn't
> right across the year boundary. This is as close as I can guess.
>
> I still believe, however, the patch as it is needed and makes sense.
>
> [1] https://debbugs.gnu.org/cgi/bugreport.cgi?bug=58820

Thanks for the patch.  I installed it on master.

I'm therefore closing this bug report.

Subject: [PATCH] Fix handling of delta values with negative month field
From: Łukasz Stelmach <[email-masked]>
To: [email-masked]
Cc: Łukasz Stelmach <[email-masked]>
Date: Wed, 7 Feb 2024 14:37:39 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

* lisp/calendar/time-date.el (decoded-time-add): If the new
variable is less then zero, the year needs to be decremented
by quotient of new and 12 increased by one.
* test/lisp/calendar/time-date-tests.el (test-decoded-add):
Add applicable test cases.
---
 lisp/calendar/time-date.el            |  2 +-
 test/lisp/calendar/time-date-tests.el | 12 ++++++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/lisp/calendar/time-date.el b/lisp/calendar/time-date.el
index e96e2e7e2db..68b05314f3c 100644
--- a/lisp/calendar/time-date.el
+++ b/lisp/calendar/time-date.el
@@ -473,7 +473,7 @@ decoded-time-add
     (when (decoded-time-month delta)
       (let ((new (+ (1- (decoded-time-month time)) (decoded-time-month delta))))
         (setf (decoded-time-month time) (1+ (mod new 12)))
-        (cl-incf (decoded-time-year time) (/ new 12))))
+        (cl-incf (decoded-time-year time) (- (/ new 12) (if (< new 0) 1 0)))))
 
     ;; Adjust for month length (as described in the doc string).
     (setf (decoded-time-day time)
diff --git a/test/lisp/calendar/time-date-tests.el b/test/lisp/calendar/time-date-tests.el
index 01f9f8a5108..4ca274fcec6 100644
--- a/test/lisp/calendar/time-date-tests.el
+++ b/test/lisp/calendar/time-date-tests.el
@@ -131,6 +131,18 @@ test-decoded-add
     (should (equal (decoded-time-add time (mdec :month 10))
                    '(12 15 16 8 5 2020 1 t 7200)))
 
+    (should (equal (decoded-time-add time (mdec :month -1))
+                   '(12 15 16 8 6 2019 1 t 7200)))
+
+    (should (equal (decoded-time-add time (mdec :month -10))
+                   '(12 15 16 8 9 2018 1 t 7200)))
+
+    (should (equal (decoded-time-add time (mdec :month -14))
+                   '(12 15 16 8 5 2018 1 t 7200)))
+
+    (should (equal (decoded-time-add time (mdec :month -24))
+                   '(12 15 16 8 7 2017 1 t 7200)))
+
     (should (equal (decoded-time-add time (mdec :day 1))
                    '(12 15 16 9 7 2019 1 t 7200)))
 
-- 
2.39.2