emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* Bug: org-agenda-sort-notime-is-late is not correctly handled by timestamp comparison [9.4.6 (9.4.6-12-gdcc3a8-elpaplus @ /Users/charlestam/.emacs.d/elpa/org-plus-contrib-20210830/)]
@ 2021-09-02  4:47 Charles Tam
  2021-12-30  9:20 ` [PATCH] " Timothy
  0 siblings, 1 reply; 3+ messages in thread
From: Charles Tam @ 2021-09-02  4:47 UTC (permalink / raw)
  To: emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 13589 bytes --]

org-agenda-sorting-strategy claims that scheduled-up (-down) causes
items to be sorted in ascending (descending) order by scheduled
timestamp.

org-agenda-sort-notime-is-late claims that if it is non-nil, the absence
of a timestamp is treated as being maximal.

Instead, when using the scheduled-up (-down) sorting strategy, with
non-nil org-agenda-sort-notime-is-late, the absence of a timestamp is
treated as being minimal. Note that the documentation is not strictly
wrong; the correct behavior is exhibited for time-of-day comparisons,
just not timestamp comparisons.

Steps to Reproduce:

  (setq org-agenda-sorting-strategy '((agenda scheduled-up)
                                      (todo scheduled-up)
                                      (tags scheduled-up)
                                      (search scheduled-up))
        org-agenda-sort-notime-is-late t)

  Place the following text in an org agenda file:

  * Reproduce ordering bug
  ** TODO Early item
     SCHEDULED: <1990-01-01 Mon>
  ** TODO Late item
     SCHEDULED: <2020-01-01 Wed>
  ** TODO Unscheduled item

  (Replace TODO with any non-DONE todo state if you need to.)

  Place the point on the "Reproduce" item and `M-x org-agenda < < t`
  (that is, list all TODO items restricted to the "Reproduce" subtree).

Expected:

  TODO Early item
  TODO Late item
  TODO Unscheduled item

Actual:

  TODO Unscheduled item
  TODO Early item
  TODO Late item

Suggested fix:

  Find `defsubst org-cmp-ts` in org-agenda.el. The definition of `def`
  in the `let*` should be something like

  (if org-agenda-sort-notime-is-late 99999999 -1)

(In the state dump below, `org-agenda-sort-notime-is-late` is not mentioned
but has its default value of t.)

Thanks,
Charles

Emacs  : GNU Emacs 27.2 (build 1, x86_64-apple-darwin18.7.0, NS
appkit-1671.60 Version 10.14.6 (Build 18G95))
 of 2021-03-27
Package: Org mode version 9.4.6 (9.4.6-12-gdcc3a8-elpaplus @
/Users/charlestam/.emacs.d/elpa/org-plus-contrib-20210830/)

current state:
==============
(setq
 org-roam-db-location "/Users/charlestam/mise/roam/org-roam.db"
 org-src-mode-hook '(org-src-babel-configure-edit-buffer
org-src-mode-configure-edit-buffer)
 org-after-todo-state-change-hook '(org-checklist)
 org-capture-prepare-finalize-hook '(org-roam-capture--install-finalize-h)
 org-link-shell-confirm-function 'yes-or-no-p
 org-expiry-wait "+30d"
 org-metadown-hook '(org-babel-pop-to-session-maybe)
 org-clock-out-hook '(org-clock-remove-empty-clock-drawer)
 org-roam-db-node-include-function #[0 "\300\207" [t] 1]
 org-refile-targets '((nil :maxlevel . 2) (org-agenda-files :maxlevel . 1))
 org-html-format-inlinetask-function
'org-html-format-inlinetask-default-function
 org-pretty-entities t
 org-special-ctrl-a/e t
 org-agenda-files '("~/mise/TODO")
 org-ascii-format-inlinetask-function 'org-ascii-format-inlinetask-default
 org-reveal-start-hook '(org-decrypt-entry)
 org-modules '(org-expiry org-habit ol-w3m ol-bbdb ol-bibtex ol-docview
ol-gnus ol-info ol-irc ol-mhe ol-rmail
               ol-eww)
 org-startup-folded 'showall
 org-archive-location "%s_archive::datetree/"
 org-mode-hook '((lambda nil (font-lock-add-keywords nil '(("{{{.+}}}" 0
'org-macro-face))) (set-fill-column 92))
                 #[0 "\300\301\302\303\304$\207" [add-hook
change-major-mode-hook org-show-all append local] 5]
                 #[0 "\300\301\302\303\304$\207"
                   [add-hook change-major-mode-hook
org-babel-show-result-all append local] 5]
                 org-babel-result-hide-spec org-babel-hide-all-hashes
                 #[0 "\301\211 \207" [imenu-create-index-function
org-imenu-get-tree] 2] turn-on-font-lock
                 auto-fill-mode org-eldoc-load)
 org-tags-match-list-sublevels nil
 org-archive-hook '(org-attach-archive-delete-maybe)
 org-confirm-elisp-link-function 'yes-or-no-p
 org-agenda-before-write-hook '(org-agenda-add-entry-text)
 org-metaup-hook '(org-babel-load-in-session-maybe)
 org-bibtex-headline-format-function #[257 "\300 \236A\207" [:title] 3
"\n\n(fn ENTRY)"]
 org-latex-format-drawer-function #[514 "\207" [] 3 "\n\n(fn _ CONTENTS)"]
 org-expiry-handler-function 'org-toggle-archive-tag
 org-agenda-deadline-faces '((1.0 . org-warning) (0.8 .
org-imminent-deadline) (0.5 . org-upcoming-deadline)
                             (0.0 . org-upcoming-distant-deadline))
 org-babel-pre-tangle-hook '(save-buffer)
 org-tab-first-hook '(org-babel-hide-result-toggle-maybe
org-babel-header-arg-expand)
 org-hide-leading-stars t
 org-babel-load-languages '((python . t))
 org-log-done 'time
 org-roam-capture-preface-hook '(org-roam-dailies--override-capture-time-h)
 org-hide-emphasis-markers t
 org-export-backends '(ascii html latex md)
 org-roam-completion-everywhere t
 org-roam-capture-templates '(("d" "default" plain "%?" :target
                               (file+head "%<%Y%m%d%H%M%S>-${slug}.org"
"#+title: ${title}\n#+filetags: \n")
                               :unnarrowed t)
                              ("t" "task" entry "* NONE %?" :target
                               (file+head+olp "%<%Y%m%d%H%M%S>-${slug}.org"
"#+title: ${title}\n#+filetags: \n"
                                ("Action Items"))
                               )
                              )
 org-checklist-export-function 'org-export-as-ascii
 org-ascii-format-drawer-function #[771 " \207" [] 4 "\n\n(fn NAME CONTENTS
WIDTH)"]
 org-agenda-span 10
 org-agenda-loop-over-headlines-in-active-region nil
 org-src-lang-modes '(("redis" . redis) ("php" . php) ("arduino" . arduino)
("C" . c) ("C++" . c++)
                      ("asymptote" . asy) ("bash" . sh) ("beamer" . latex)
("calc" . fundamental) ("cpp" . c++)
                      ("ditaa" . artist) ("dot" . fundamental) ("elisp" .
emacs-lisp) ("ocaml" . tuareg)
                      ("screen" . shell-script) ("shell" . sh) ("sqlite" .
sql))
 org-roam-db-autosync-mode-hook '(vulpea-db-autosync-enable)
 org-agenda-clock-consistency-checks '(:max-duration "10:00" :min-duration
0 :max-gap "0:05" :gap-ok-around
                                       ("4:00") :default-face
org-agenda-clock-gap :overlap-face nil :gap-face
                                       nil :no-end-time-face nil :long-face
nil :short-face nil)
 org-roam-find-file-hook '(org-roam-buffer--setup-redisplay-h
org-roam--register-completion-functions-h
                           org-roam--replace-roam-links-on-save-h
org-roam-open-id-with-org-roam-db-h
                           org-roam-db-autosync--setup-update-on-save-h)
 org-agenda-prefix-format '((agenda . " %i %?-12t% s") (todo . " %i ")
(tags . " %i ") (search . " %i "))
 org-occur-hook '(org-first-headline-recenter)
 org-agenda-start-with-log-mode t
 org-footnote-auto-adjust t
 org-odd-levels-only t
 org-clock-out-switch-to-state "WAIT"
 org-structure-template-alist '(("p" . "src python") ("a" . "export ascii")
("c" . "center") ("C" . "comment")
                                ("e" . "example") ("E" . "export") ("h" .
"export html") ("l" . "export latex")
                                ("q" . "quote") ("s" . "src") ("v" .
"verse"))
 org-cycle-hook '(org-cycle-hide-archived-subtrees org-cycle-hide-drawers
org-cycle-show-empty-lines
                  org-optimize-window-after-visibility-change)
 org-todo-keywords '((sequence "NONE" "HELP" "WAIT" "ACTV" "|" "CONT"
"DONE" "DEAD" "PASS"))
 org-speed-command-hook '(org-speed-command-activate
org-babel-speed-command-activate)
 org-roam-node-annotation-function 'org-roam-node-read--annotation
 org-tags-column -100
 org-habit-graph-column 70
 org-roam-ref-annotation-function 'org-roam-ref-read--annotation
 org-roam-dailies-directory "diary/"
 org-babel-tangle-lang-exts '(("python" . "py") ("emacs-lisp" . "el")
("elisp" . "el"))
 org-refile-use-outline-path t
 org-export-before-parsing-hook '(org-attach-expand-links)
 org-confirm-shell-link-function 'yes-or-no-p
 org-link-parameters '(("attachment" :follow org-attach-follow :complete
org-attach-complete-link)
                       ("message" :follow org-mac-message-open)
                       ("x-devonthink-item" :follow
org-devonthink-item-open)
                       ("mac-evernote" :follow org-mac-evernote-note-open)
                       ("mac-outlook" :follow org-mac-outlook-message-open)
                       ("acrobat" :follow org-mac-acrobat-open) ("skim"
:follow org-mac-skim-open)
                       ("addressbook" :follow org-mac-addressbook-item-open)
                       ("x-together-item" :follow
org-mac-together-item-open)
                       ("mairix" :follow org-mairix-open :store
org-mairix-store-gnus-link)
                       ("roam" :follow org-roam-link-follow-link) ("id"
:follow org-id-open)
                       ("eww" :follow org-eww-open :store
org-eww-store-link)
                       ("rmail" :follow org-rmail-open :store
org-rmail-store-link)
                       ("mhe" :follow org-mhe-open :store
org-mhe-store-link)
                       ("irc" :follow org-irc-visit :store
org-irc-store-link :export org-irc-export)
                       ("info" :follow org-info-open :export
org-info-export :store org-info-store-link)
                       ("gnus" :follow org-gnus-open :store
org-gnus-store-link)
                       ("docview" :follow org-docview-open :export
org-docview-export :store
                        org-docview-store-link)
                       ("bibtex" :follow org-bibtex-open :store
org-bibtex-store-link)
                       ("bbdb" :follow org-bbdb-open :export
org-bbdb-export :complete org-bbdb-complete-link
                        :store org-bbdb-store-link)
                       ("w3m" :store org-w3m-store-link) ("file+sys")
("file+emacs")
                       ("shell" :follow org-link--open-shell)
                       ("news" :follow
                        #[514 "\301\300\302 Q \"\207" ["news" browse-url
":"] 6 "\n\n(fn URL ARG)"])
                       ("mailto" :follow
                        #[514 "\301\300\302 Q \"\207" ["mailto" browse-url
":"] 6 "\n\n(fn URL ARG)"])
                       ("https" :follow
                        #[514 "\301\300\302 Q \"\207" ["https" browse-url
":"] 6 "\n\n(fn URL ARG)"])
                       ("http" :follow
                        #[514 "\301\300\302 Q \"\207" ["http" browse-url
":"] 6 "\n\n(fn URL ARG)"])
                       ("ftp" :follow
                        #[514 "\301\300\302 Q \"\207" ["ftp" browse-url
":"] 6 "\n\n(fn URL ARG)"])
                       ("help" :follow org-link--open-help) ("file"
:complete org-link-complete-file)
                       ("elisp" :follow org-link--open-elisp) ("doi"
:follow org-link--open-doi))
 org-agenda-skip-scheduled-if-done t
 org-latex-format-headline-function
'org-latex-format-headline-default-function
 org-expiry-inactive-timestamps t
 org-capture-templates '(("t" "Task" entry (file+headline "~/mise/TODO"
"Schedule Me")
                          "*** NONE %^{Summary}\n    /Captured %U/\n
 %?\n")
                         ("s" "Snippet" plain (file+olp+datetree
"~/mise/TODO" "Snippets") "        * %?"
                          :empty-lines-after 1 :tree-type week)
                         ("j" "Journal" plain (file+olp+datetree
"~/mise/NOTES") "      %?" :empty-lines-before 1
                          :empty-lines-after 1)
                         ("n" "Note" entry (file+headline "~/mise/NOTES"
"Notes")
                          "*** %^{Topic}\n    /Captured %U/\n    %?\n"
:empty-lines-before 1 :empty-lines-after 1
                          :prepend t)
                         )
 org-link-elisp-confirm-function 'yes-or-no-p
 org-todo-keyword-faces '(("UNINIT'D" . org-todo-uninited) ("NEEDHELP" .
org-todo-needhelp)
                          ("BUFFERED" . org-todo-buffered) ("PROGRESS" .
org-todo-progress)
                          ("CONTINUE" . org-todo-continue) ("COMPLETE" .
org-todo-complete)
                          ("OBSOLETE" . org-todo-obsolete) ("DELEGATE" .
org-todo-delegate)
                          ("NONE" . org-todo-uninited) ("HELP" .
org-todo-needhelp) ("WAIT" . org-todo-buffered)
                          ("ACTV" . org-todo-progress) ("CONT" .
org-todo-continue) ("DONE" . org-todo-complete)
                          ("DEAD" . org-todo-obsolete) ("PASS" .
org-todo-delegate))
 org-roam-db-autosync-mode t
 org-roam-dailies-capture-templates '(("d" "default" entry "* %U\n  %?"
:target
                                       (file+head "%<%Y-%m-%d-%a>.org"
                                        "#+title: %<%Y-%m-%d>
(%<%a>)\n#+filetags: diary\n\n")
                                       )
                                      )
 org-latex-format-inlinetask-function
'org-latex-format-inlinetask-default-function
 org-html-format-drawer-function #[514 "\207" [] 3 "\n\n(fn NAME CONTENTS)"]
 org-roam-directory "/Users/charlestam/mise/roam"
 org-clock-in-switch-to-state "ACTV"
 org-html-format-headline-function
'org-html-format-headline-default-function
 org-mairix-display-hook 'org-mairix-gnus-display-results
 org-pretty-entities-include-sub-superscripts nil
 org-habit-show-all-today t
 org-confirm-babel-evaluate nil
 org-roam-node-display-template "${title:*} ${tags:20}"
 org-agenda-sorting-strategy '((agenda habit-down time-up priority-down
effort-up category-keep)
                               (todo scheduled-up) (tags time-up) (search
alpha-up))
 org-tags-exclude-from-inheritance '("todo")
 org-agenda-skip-deadline-if-done t
 org-mairix-gnus-select-display-group-function
'org-mairix-gnus-select-display-group-function-gg
 )

[-- Attachment #2: Type: text/html, Size: 17970 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH] Re: Bug: org-agenda-sort-notime-is-late is not correctly handled by timestamp comparison [9.4.6 (9.4.6-12-gdcc3a8-elpaplus @ /Users/charlestam/.emacs.d/elpa/org-plus-contrib-20210830/)]
  2021-09-02  4:47 Bug: org-agenda-sort-notime-is-late is not correctly handled by timestamp comparison [9.4.6 (9.4.6-12-gdcc3a8-elpaplus @ /Users/charlestam/.emacs.d/elpa/org-plus-contrib-20210830/)] Charles Tam
@ 2021-12-30  9:20 ` Timothy
  2022-01-30  7:43   ` Ihor Radchenko
  0 siblings, 1 reply; 3+ messages in thread
From: Timothy @ 2021-12-30  9:20 UTC (permalink / raw)
  To: Charles Tam; +Cc: emacs-orgmode


[-- Attachment #1.1: Type: text/plain, Size: 393 bytes --]

Hi Charles,

Thanks for reporting this, and sorry it’s taken so long for someone to respond
(it’s been a busy year for the maintainers).

I’ve confirmed both your issue report (thanks for the detailed steps), and your
suggested fix. As such, I’ve produced a patch (attached). It would be good if
someone else could check this looks fine and apply it.

All the best,
Timothy

[-- Attachment #1.2: Type: text/html, Size: 26003 bytes --]

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-org-agenda-Make-timestamp-ordering-match-docs.patch --]
[-- Type: text/x-patch, Size: 1155 bytes --]

From 9ecd0a9266338d7222281c7ccb16808c319646aa Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Date: Thu, 30 Dec 2021 17:16:29 +0800
Subject: [PATCH] org-agenda: Make timestamp ordering match docs

* lisp/org-agenda.el: When `org-agenda-sort-notime-is-late' is non-nil,
an absent timestamp is now (correctly) treated as maximal.

Bug reported by: Charles Tam <me@charlest.net> in
https://list.orgmode.org/CAKu+9YVNPSHG4HVtPFa2L2tP6yBdjJ38Teyr8OSDmCg0ZEOe9Q@mail.gmail.com
---
 lisp/org-agenda.el | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el
index 721ef2ced..4321a4f0b 100644
--- a/lisp/org-agenda.el
+++ b/lisp/org-agenda.el
@@ -7729,7 +7729,7 @@ (defsubst org-cmp-ts (a b type)
 \"timestamp_ia\", compare within each of these type.  When TYPE
 is the empty string, compare all timestamps without respect of
 their type."
-  (let* ((def (and (not org-agenda-sort-notime-is-late) -1))
+  (let* ((def (if org-agenda-sort-notime-is-late 99999999 -1))
 	 (ta (or (and (string-match type (or (get-text-property 1 'type a) ""))
 		      (get-text-property 1 'ts-date a))
 		 def))
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] Re: Bug: org-agenda-sort-notime-is-late is not correctly handled by timestamp comparison [9.4.6 (9.4.6-12-gdcc3a8-elpaplus @ /Users/charlestam/.emacs.d/elpa/org-plus-contrib-20210830/)]
  2021-12-30  9:20 ` [PATCH] " Timothy
@ 2022-01-30  7:43   ` Ihor Radchenko
  0 siblings, 0 replies; 3+ messages in thread
From: Ihor Radchenko @ 2022-01-30  7:43 UTC (permalink / raw)
  To: Timothy; +Cc: emacs-orgmode, Charles Tam

Timothy <tecosaur@gmail.com> writes:

> I’ve confirmed both your issue report (thanks for the detailed steps), and your
> suggested fix. As such, I’ve produced a patch (attached). It would be good if
> someone else could check this looks fine and apply it.

I have applied the patch onto bugfix as 1b675f0.
The bug should be fixed now.

Best,
Ihor


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-01-30  7:41 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-02  4:47 Bug: org-agenda-sort-notime-is-late is not correctly handled by timestamp comparison [9.4.6 (9.4.6-12-gdcc3a8-elpaplus @ /Users/charlestam/.emacs.d/elpa/org-plus-contrib-20210830/)] Charles Tam
2021-12-30  9:20 ` [PATCH] " Timothy
2022-01-30  7:43   ` Ihor Radchenko

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).