emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/org b26745b985: org-agenda: Fix meaning of 'repeated-af


From: ELPA Syncer
Subject: [elpa] externals/org b26745b985: org-agenda: Fix meaning of 'repeated-after-deadline value of `org-agenda-skip-scheduled-if-deadline-is-shown'
Date: Wed, 7 Feb 2024 09:58:21 -0500 (EST)

branch: externals/org
commit b26745b985ecc209deb62548f8724de05359e081
Author: Ihor Radchenko <yantar92@posteo.net>
Commit: Ihor Radchenko <yantar92@posteo.net>

    org-agenda: Fix meaning of 'repeated-after-deadline value of 
`org-agenda-skip-scheduled-if-deadline-is-shown'
    
    * lisp/org-agenda.el (org-agenda-skip-scheduled-if-deadline-is-shown):
    Move 'repeated-after-deadline value into a new custom option.
    (org-agenda-skip-scheduled-repeats-after-deadline): Create a new
    custom option to make agenda hide scheduled entries repeated past
    deadline.
    * lisp/org-agenda.el (org-agenda-get-scheduled): Use the new custom
    option.  Do not demand deadline to be actually shown when deciding
    whether to skip scheduled repeats past deadline.  This fixes a bug
    when repeats continue to be displayed if past deadline is not
    displayed within agenda span.
    * doc/org-manual.org (Repeated tasks): Adjust manual entry, mentioning
    the new custom option.
    * etc/ORG-NEWS (~repeated-after-deadline~ value of
    ~org-agenda-skip-scheduled-repeats-after-deadline~ is moved to a new
    customization): Announce the change.
    *
    testing/lisp/test-org-agenda.el 
(test-org-agenda/skip-scheduled-repeats-after-deadline):
    Add new test.
    
    Reported-by: Morgan Smith <Morgan.J.Smith@outlook.com>
    Link: https://orgmode.org/list/874jft6vpj.fsf@localhost
---
 doc/org-manual.org              | 14 +++++-----
 etc/ORG-NEWS                    | 17 ++++++++++++
 lisp/org-agenda.el              | 37 ++++++++++++++++----------
 testing/lisp/test-org-agenda.el | 57 +++++++++++++++++++++++++++++++++++++++++
 4 files changed, 104 insertions(+), 21 deletions(-)

diff --git a/doc/org-manual.org b/doc/org-manual.org
index 2eb991a4ab..1a025a1396 100644
--- a/doc/org-manual.org
+++ b/doc/org-manual.org
@@ -6680,16 +6680,16 @@ special repeaters =++= and =.+=.  For example:
    Marking this DONE shifts the date to exactly one hour from now.
 #+end_example
 
-#+vindex: org-agenda-skip-scheduled-if-deadline-is-shown
+#+vindex: org-agenda-skip-scheduled-repeats-after-deadline
 You may have both scheduling and deadline information for a specific
 task.  If the repeater is set for the scheduling information only, you
 probably want the repeater to be ignored after the deadline.  If so,
-set the variable ~org-agenda-skip-scheduled-if-deadline-is-shown~ to
-~repeated-after-deadline~.  However, any scheduling information
-without a repeater is no longer relevant once the task is done, and
-thus, removed upon repeating the task.  If you want both scheduling
-and deadline information to repeat after the same interval, set the
-same repeater for both timestamps.
+set the variable ~org-agenda-skip-scheduled-repeats-after-deadline~ to
+~t~.  However, any scheduling information without a repeater is no
+longer relevant once the task is done, and thus, removed upon
+repeating the task.  If you want both scheduling and deadline
+information to repeat after the same interval, set the same repeater
+for both timestamps.
 
 An alternative to using a repeater is to create a number of copies of
 a task subtree, with dates shifted in each copy.  The command
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 965872d239..92d363b80b 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -469,6 +469,23 @@ The change is breaking when ~org-use-property-inheritance~ 
is set to ~t~.
 
 The =TEST= parameter is better served by Emacs debugging tools.
 ** New and changed options
+*** ~repeated-after-deadline~ value of 
~org-agenda-skip-scheduled-repeats-after-deadline~ is moved to a new 
customization
+
+A new custom option ~org-agenda-skip-scheduled-repeats-after-deadline~
+is introduced in place of ~repeated-after-deadline~ value of
+~org-agenda-skip-scheduled-repeats-after-deadline~.
+
+Introducing a new option allow more control over agenda display and
+resolves a confusion about the meaning of ~repeated-after-deadline~.
+~repeated-after-deadline~ has nothing to do with /showing/ deadline.
+It just prevents agenda display repeated scheduled entries past
+deadline. The following example illustrates the meaning:
+
+: * TODO Do me every day before Jan, 12th (included)
+: SCHEDULED: <2024-01-03 Wed +1d> DEADLINE: <2024-01-05 Fri>
+
+The old customization will continue to work, ensuring backwards compatibility.
+
 *** New custom setting ~org-icalendar-ttl~ for the ~ox-icalendar~ backend
 
 The option ~org-icalendar-ttl~ allows to advise a subscriber to the
diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el
index bfd715060c..b270fbddc2 100644
--- a/lisp/org-agenda.el
+++ b/lisp/org-agenda.el
@@ -894,17 +894,13 @@ the entry is scheduled today or was scheduled previously 
is not
 shown.
 
 When set to the symbol `not-today', skip scheduled previously,
-but not scheduled today.
-
-When set to the symbol `repeated-after-deadline', skip scheduled
-items if they are repeated beyond the current deadline."
+but not scheduled today."
   :group 'org-agenda-skip
   :group 'org-agenda-daily/weekly
   :type '(choice
          (const :tag "Never" nil)
          (const :tag "Always" t)
-         (const :tag "Not when scheduled today" not-today)
-         (const :tag "When repeated past deadline" repeated-after-deadline)))
+         (const :tag "Not when scheduled today" not-today)))
 
 (defcustom org-agenda-skip-timestamp-if-deadline-is-shown nil
   "Non-nil means skip timestamp line if same entry shows because of deadline.
@@ -1341,10 +1337,16 @@ When set to the symbol `next' only the first future 
repeat is shown."
          (const :tag "Show all repeated entries" t)
          (const :tag "Show next repeated entry" next)
          (const :tag "Do not show repeated entries" nil))
-  :version "26.1"
   :package-version '(Org . "9.1")
   :safe #'symbolp)
 
+(defcustom org-agenda-skip-scheduled-repeats-after-deadline nil
+  "Non-nil hides scheduled repeated entries past deadline."
+  :group 'org-agenda-daily/weekly
+  :type 'boolean
+  :package-version '(Org . "9.7")
+  :safe t)
+
 (defcustom org-agenda-prefer-last-repeat nil
   "Non-nil sets date for repeated entries to their last repeat.
 
@@ -6661,18 +6663,25 @@ scheduled items with an hour specification like 
[h]h:mm."
             ;; Skip entry if it already appears as a deadline, per
             ;; `org-agenda-skip-scheduled-if-deadline-is-shown'.  This
             ;; doesn't apply to habits.
+             (when (or org-agenda-skip-scheduled-repeats-after-deadline
+                       ;; FIXME: Backwards-compatibility.
+                       (eq org-agenda-skip-scheduled-if-deadline-is-shown
+                           'repeated-after-deadline))
+               (let ((deadline
+                      (time-to-days
+                       (when (org-element-property :deadline el)
+                         (org-time-string-to-time
+                          (org-element-interpret-data
+                           (org-element-property :deadline el)))))))
+                (when (and (or (<= (org-agenda--timestamp-to-absolute s) 
deadline)
+                                (not (= schedule current)))
+                            (> current deadline))
+                   (throw :skip nil))))
             (when (pcase org-agenda-skip-scheduled-if-deadline-is-shown
                     ((guard
                       (or (not (memq (line-beginning-position 0) deadline-pos))
                           habitp))
                      nil)
-                    (`repeated-after-deadline
-                     (let ((deadline (time-to-days
-                                       (when (org-element-property :deadline 
el)
-                                         (org-time-string-to-time
-                                          (org-element-interpret-data
-                                           (org-element-property :deadline 
el)))))))
-                       (and (<= schedule deadline) (> current deadline))))
                     (`not-today pastschedp)
                     (`t t)
                     (_ nil))
diff --git a/testing/lisp/test-org-agenda.el b/testing/lisp/test-org-agenda.el
index 976d88a9ec..f98214b259 100644
--- a/testing/lisp/test-org-agenda.el
+++ b/testing/lisp/test-org-agenda.el
@@ -590,6 +590,63 @@ DEADLINE: " (cdr timestamp))))
                     (org-agenda nil "f")
                     (buffer-string))))))))))))
 
+(ert-deftest test-org-agenda/skip-scheduled-repeats-after-deadline ()
+  "Test `org-agenda-skip-scheduled-repeats-after-deadline'."
+  (cl-assert (not org-agenda-sticky) nil "precondition violation")
+  (cl-assert (not (org-test-agenda--agenda-buffers))
+            nil "precondition violation")
+  (dolist (org-agenda-skip-scheduled-repeats-after-deadline '(nil t))
+    (org-test-at-time "2024-01-01 8:00"
+      (org-test-with-temp-text-in-file "
+* TODO Do me every day before Jan, 12th (included)
+SCHEDULED: <2024-01-03 Wed +1d> DEADLINE: <2024-01-05 Fri>
+"
+        (let ((org-agenda-span 'week)
+             (org-agenda-files `(,(buffer-file-name))))
+          ;; NOTE: Be aware that `org-agenda-list' may or may not display
+          ;; past scheduled items depending whether the date is today
+          ;; `org-today' or not.
+          (org-agenda-list nil  "<2024-01-01 Mon>")
+          (set-buffer org-agenda-buffer-name)
+          (if org-agenda-skip-scheduled-repeats-after-deadline
+              (should
+               ;; Not displayed after deadline.
+               (string-match-p
+                "Week-agenda (W01):
+Monday      1 January 2024 W01
+  [^:]+:In   4 d.:  TODO Do me every day before Jan, 12th (included)
+Tuesday     2 January 2024
+Wednesday   3 January 2024
+  [^:]+:Scheduled:  TODO Do me every day before Jan, 12th (included)
+Thursday    4 January 2024
+  [^:]+:Scheduled:  TODO Do me every day before Jan, 12th (included)
+Friday      5 January 2024
+  [^:]+:Scheduled:  TODO Do me every day before Jan, 12th (included)
+  [^:]+:Deadline:   TODO Do me every day before Jan, 12th (included)
+Saturday    6 January 2024
+Sunday      7 January 2024"
+                (buffer-string)))
+            (should
+             ;; Displayed after deadline.
+             (string-match-p
+              "Week-agenda (W01):
+Monday      1 January 2024 W01
+  [^:]+:In   4 d.:  TODO Do me every day before Jan, 12th (included)
+Tuesday     2 January 2024
+Wednesday   3 January 2024
+  [^:]+:Scheduled:  TODO Do me every day before Jan, 12th (included)
+Thursday    4 January 2024
+  [^:]+:Scheduled:  TODO Do me every day before Jan, 12th (included)
+Friday      5 January 2024
+  [^:]+:Scheduled:  TODO Do me every day before Jan, 12th (included)
+  [^:]+:Deadline:   TODO Do me every day before Jan, 12th (included)
+Saturday    6 January 2024
+  [^:]+:Scheduled:  TODO Do me every day before Jan, 12th (included)
+Sunday      7 January 2024
+  [^:]+:Scheduled:  TODO Do me every day before Jan, 12th (included)"
+              (buffer-string))))))
+      (org-test-agenda--kill-all-agendas))))
+
 (ert-deftest test-org-agenda/goto-date ()
   "Test `org-agenda-goto-date'."
   (unwind-protect



reply via email to

[Prev in Thread] Current Thread [Next in Thread]