From 44320eea066f6db6ee82e5fd78b74cdb3d026b82 Mon Sep 17 00:00:00 2001 From: Valentin Herrmann Date: Sun, 13 Aug 2023 18:44:49 +0200 Subject: [PATCH] org.el: Respect org-extend-today-until in timestamps with ++ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * org.el (org-auto-repeat-maybe): Changed org-auto-repeat-maybe, so that switching a repeating todo with a timestamp of the form <… ++…> respects `org-extend-today-until'. * test-org.el (test-org/auto-repeat-maybe, org-test-with-time-locale): Tests for interaction of `org-extend-today-until' and `org-auto-repeat-maybe'. Added `org-test-with-time-locale' to make test results independent of running machine. Explicitly avoid matching log note with old timestamp in all the tests to avoid confusion. Co-authored-by: Ihor Radchenko TINYCHANGE --- lisp/org.el | 5 ++- testing/lisp/test-org.el | 78 +++++++++++++++++++++++++++++++++------- 2 files changed, 70 insertions(+), 13 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index c037b3ee0..325141b25 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -10101,7 +10101,10 @@ This function is run automatically after each state change to a DONE state." (let ((nshiftmax 10) (nshift 0)) (while (or (= nshift 0) - (not (time-less-p nil time))) + (if (equal what "h") + (not (time-less-p nil time)) + (>= (org-today) + (time-to-days time)))) (when (= nshiftmax (cl-incf nshift)) (or (y-or-n-p (format "%d repeater intervals were not \ diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index 1b00f6c45..40820dfb5 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -75,6 +75,11 @@ Otherwise, evaluate RESULT as an sexp and return its result." `(let ((org-time-stamp-formats '("%Y-%m-%d" . "%Y-%m-%d %H:%M"))) ,@body)) +(defmacro org-test-with-time-locale (time-loc &rest body) + (declare (indent 1)) + `(let ((system-time-locale ,time-loc)) + ,@body)) + ;;; Comments @@ -8370,26 +8375,75 @@ Paragraph" (buffer-string)))) ;; Handle every repeater type using hours step. (should - (string-match-p - "2014-03-04 .* 02:00" - (org-test-at-time "<2014-03-04 02:35>" + (string-search + "<2014-03-04 Tue 02:00 +8h>" + (org-test-with-time-locale "en_US.UTF-8" + (org-test-at-time "<2014-03-04 02:35>" (org-test-with-temp-text "* TODO H\n<2014-03-03 18:00 +8h>" (org-todo "DONE") - (buffer-string))))) + (buffer-string)))))) (should - (string-match-p - "2014-03-04 .* 10:00" - (org-test-at-time "<2014-03-04 02:35>" + (string-search + "<2014-03-04 Tue 10:00 ++8h>" + (org-test-with-time-locale "en_US.UTF-8" + (org-test-at-time "<2014-03-04 02:35>" (org-test-with-temp-text "* TODO H\n<2014-03-03 18:00 ++8h>" (org-todo "DONE") - (buffer-string))))) + (buffer-string)))))) (should - (string-match-p - "2014-03-04 .* 10:35" - (org-test-at-time "<2014-03-04 02:35>" + (string-search + "<2014-03-04 Tue 10:35 .+8h>" + (org-test-with-time-locale "en_US.UTF-8" + (org-test-at-time "<2014-03-04 02:35>" (org-test-with-temp-text "* TODO H\n<2014-03-03 18:00 .+8h>" (org-todo "DONE") - (buffer-string))))) + (buffer-string)))))) + ;; Handle `org-extend-today-until'. + (should + (string-search + "<2014-03-04 Tue ++1d>" + (let ((org-extend-today-until 4)) + (org-test-with-time-locale "en_US.UTF-8" + (org-test-at-time "<2014-03-04 02:35>" + (org-test-with-temp-text "* TODO H\n<2014-03-03 ++1d>" + (org-todo "DONE") + (buffer-string))))))) + (should + (string-search + "<2014-03-06 Thu 17:00 ++1d>" + (let ((org-extend-today-until 4)) + (org-test-with-time-locale "en_US.UTF-8" + (org-test-at-time "<2014-03-05 18:00>" + (org-test-with-temp-text "* TODO H\n<2014-03-04 17:00 ++1d>" + (org-todo "DONE") + (buffer-string))))))) + (should + (string-search + "<2014-03-04 Tue 10:00 ++8h>" + (let ((org-extend-today-until 4)) + (org-test-with-time-locale "en_US.UTF-8" + (org-test-at-time "<2014-03-04 02:35>" + (org-test-with-temp-text "* TODO H\n<2014-03-03 18:00 ++8h>" + (org-todo "DONE") + (buffer-string))))))) + (should + (string-search + "<2014-03-04 Tue 18:00 .+1d>" + (let ((org-extend-today-until 4)) + (org-test-with-time-locale "en_US.UTF-8" + (org-test-at-time "<2014-03-04 02:35>" + (org-test-with-temp-text "* TODO H\n<2014-03-03 18:00 .+1d>" + (org-todo "DONE") + (buffer-string))))))) + (should + (string-search + "<2014-03-04 Tue 10:35 .+8h>" + (let ((org-extend-today-until 4)) + (org-test-with-time-locale "en_US.UTF-8" + (org-test-at-time "<2014-03-04 02:35>" + (org-test-with-temp-text "* TODO H\n<2014-03-03 18:00 .+8h>" + (org-todo "DONE") + (buffer-string))))))) ;; Do not repeat inactive time stamps with a repeater. (should-not (string-match-p -- 2.40.1