Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(wrong-number-of-arguments (1 . 1) 2) in org-clock-sum when trying to run #5

Closed
boudiccas opened this issue Aug 21, 2017 · 56 comments
Closed

Comments

@boudiccas
Copy link

I'm getting an error report when I try to run org-clock-budget which says

(wrong-number-of-arguments (1 . 1) 2) in org-clock-sum

Nothing has changed in my setup, and I'm guessing that its related to something with the actual time clocking. Can you give me any guidance as to what is wrong please?

@Fuco1
Copy link
Owner

Fuco1 commented Aug 21, 2017

Can you produce the entire stack trace? Run M-x toggle-debug-on-error then reproduce the problem. A stacktrace buffer should pop up.

@boudiccas
Copy link
Author

This is the output.

Debug on Error enabled globally
(wrong-number-of-arguments (1 . 1) 2) in org-clock-sum

Does that help?

@boudiccas
Copy link
Author

It gets to the stage where its created the buffer to display the org-clock-budget report, but does not populate it, which is why I feel that there is some error in my clock budget timesheets which is causing the problem. Plus the rather strange syntax of (1 . 1) 2), as if somewhere in my timesheets 1+1 does not equal 2! Does that make sense?

@Fuco1
Copy link
Owner

Fuco1 commented Aug 21, 2017

The above is not the whole stack trace, it should have at least 20 lines. It shows me how the code is called in sequence so that I can debug the chain.

The syntax (1 . 1) 2 means that the function expects at least 1 and at most 1 argument (which means exactly one) but we are giving it two arguments. Which might mean that something changed in newer versions of org-mode and this code is no longer compatible.

Can you use C-h f org-clock-sum and paste the documentation here?

This is what I get

org-clock-sum is an autoloaded Lisp closure in `org-clock.el'.

(org-clock-sum &optional TSTART TEND HEADLINE-FILTER PROPNAME)

Sum the times for each subtree.
Puts the resulting times in minutes as a text property on each headline.
TSTART and TEND can mark a time range to be considered.
HEADLINE-FILTER is a zero-arg function that, if specified, is called for
each headline in the time range with point at the headline.  Headlines for
which HEADLINE-FILTER returns nil are excluded from the clock summation.
PROPNAME lets you set a custom text property instead of :org-clock-minutes.

[back]

As you can see on the second line it accepts 4 arguments.

@boudiccas
Copy link
Author

org-clock-sum is an autoloaded compiled Lisp function in ‘org-clock.el’.

(org-clock-sum &optional TSTART TEND HEADLINE-FILTER PROPNAME)

Sum the times for each subtree.
Puts the resulting times in minutes as a text property on each headline.
TSTART and TEND can mark a time range to be considered.
HEADLINE-FILTER is a zero-arg function that, if specified, is called for
each headline in the time range with point at the headline. Headlines for
which HEADLINE-FILTER returns nil are excluded from the clock summation.
PROPNAME lets you set a custom text property instead of :org-clock-minutes.

@Fuco1
Copy link
Owner

Fuco1 commented Aug 22, 2017

Hm, then the problem is somewhere else. Unfortunately I can't repro this and without the stack trace it's quite difficult to figure out.

Can you check what the value of the variable debug-on-error is? If it is nil, then use M-x toggle-debug-on-error once more and check it changes to t. (you can check the value of the variable with C-h v

@boudiccas
Copy link
Author

debug-on-error is a variable defined in ‘C source code’.
Its value is t
Original value was nil

What happens if you have two time-clock entries, exactly the same date and times in a different project? could that cause my problem? i can't check it at this end because everything seem to be okay, When I generate a clocksum for each of my projects that is tracked with org-clock-budget there doesn't seem to be any discrepancies thrown up.

I started using 'org-super-agenda' on 24/7/2107 so maybe this is what's causing my problem? That is the only program that I know that may affect org-clock-budget, and my updated org-plus-contrib from 14/08/2017.

@Fuco1
Copy link
Owner

Fuco1 commented Aug 22, 2017

It shouldn't matter, each entry is summed separately. The error here is that something somewhere changed the API and we are trying to send in data which it can't handle. If org-super-agenda redefines some built-in functions that can be a problem. But I don't know that package at all.

@alphapapa Do you have any ideas here? Any help is appreciated :)

@boudiccas
Copy link
Author

I've commented org-super-agenda out and removed it with a paradox. but the problem still remains, so its not org-super-agenda. I'm calling org-clock-budget from my easy menu with this line

       ["Clock budget report" org-clock-budget-report]

and this is its setting in my conf file

*** org-clock-budget
#+begin_src emacs-lisp
(require 'org-clock-budget)
#+end_src
[2016-08-14 Sun 09:50]

I have no entries for org-clock-budget in my custom.el, and my org-clock-budget.el is stored as

/home/boudiccas/.emacs.d/lisp/org-clock-budget.el

and is dated 21-08-2016.

Just for your info which might help in diagnosing the problem.

@alphapapa
Copy link

org-super-agenda doesn't redefine any functions, it only advises a single function, org-agenda-finalize-entries, and that only affects agenda views.

Two questions:

  1. What version of Emacs?
  2. What version of Org-mode?

Three suggestions:

  1. Try to reproduce with emacs -q and emacs -Q. If it doesn't happen with those, it must be someting in your personal config.
  2. Open a terminal to your ~/.emacs.d directory and run grep -r "(defun org-clock-sum", to see if anything is redefining that function. Although I guess that isn't the case, since the describe-function for it seems correct.
  3. If all else fails, use the bug-hunter package, which will bisect your init file and isolate the form that causes the problem, which might be the loading of a certain package.

@boudiccas
Copy link
Author

boudiccas commented Aug 23, 2017

Provisional answers
1 - emacs 25.1.1
2 - org-mode version = Org mode version 9.0.9 (9.0.9-88-g251f88-elpaplus @ /home/boudiccas/.emacs.d/elpa/org-plus-contrib-20170821/)

2 -

grep -r "(defun org-clock-sum"
elpa/org-plus-contrib-20170821/org-clock.el:(defun org-clock-sum-today (&optional headline-filter)
elpa/org-plus-contrib-20170821/org-clock.el:(defun org-clock-sum-custom (&optional headline-filter range propname)
elpa/org-plus-contrib-20170821/org-clock.el:(defun org-clock-sum (&optional tstart tend headline-filter propname)
elpa/org-plus-contrib-20170821/org-clock.el:(defun org-clock-sum-current-item (&optional tstart)

@boudiccas
Copy link
Author

No errors reported with bug-hunter on my init.el, so I ran bug-hunter-file on org-clock-budget.el, and this is what it says -

Doing some initial tests...
Initial tests done. Hunting for the cause...
#("/home/boudiccas/.emacs.d/lisp/org-clock-budget.el" 25 30 (face flx-highlight-face)), line 29 pos 0:
  The following error was signaled here:
    (file-error "Cannot open load file" "No such file or directory" "dash")
  Caused by the following expression:
    (require 'dash)

@Fuco1
Copy link
Owner

Fuco1 commented Aug 23, 2017

Then it seems you need to install the dash library. Did you use package.el to install this package? If so it should pull dependencies automatically. If not, grab it here: https://github.com/magnars/dash.el

@boudiccas
Copy link
Author

boudiccas commented Aug 23, 2017

dash was loaded as a dependency, I've now explicitly loaded it as (require 'dash) and restarted emacs but the problem still remains. dash is version 20170810.

Perhaps there is something changed in dash that affects org-clock-budget? or in org-clock? Or some Frankenstein-like error thrown up with the combination of both of them?

But I'm getting the same bug-hunter problem as already shown.

@alphapapa
Copy link

I recommend deleting all copies of dash and org-clock-budget and reinstalling org-clock-budget. There may be a problem with stale .elc files. I come across this from time-to-time and I haven't been able to figure out what happens, but clearing out stale .elc files often fixes it.

@boudiccas
Copy link
Author

i can't delete dash, its a dependency of ereader, xml+, wrap-region, tile, string-edit, spaceline, smartparens, skeletor, and even more. I gave up at that point! I then tried physically removing it from elpa and then started paradox again, which showed dash as being deleted but i wasn't able to reinstall it or delete it through paradox, so I'm stuck now! I've reinstalled all those I've marked earlier and it should hopefully be okay if I was to restart emacs. So I don't know what the solution is now.

@boudiccas
Copy link
Author

looking at dash I wonder if pull request #222 is causing the problem that I've found in org-clock-budget, as that seems to have triggered the update of 20170810?

@alphapapa
Copy link

alphapapa commented Aug 23, 2017

Sorry, I wasn't clear:

  1. Remove the directories ~/.emacs.d/elpa/dash-* and ~/.emacs.d/elpa/org-clock-budget-*
  2. In Emacs, run package-install and install dash and org-clock-budget.
  3. Close and restart Emacs.
  4. Test again.

I don't see how magnars/dash.el#222 could have caused any problems, since all it does is add new functions to dash.

I suspect that if you reinstall the relevant packages from scratch, after deleting all traces of them from the elpa directory, the problem will go away. That's usually the case for me when I have inexplicable problems with addon packages.

@boudiccas
Copy link
Author

boudiccas commented Aug 23, 2017

  1. If I physically remove ~/.emacs.d/elpa/dash-* then paradox (the package manager) lists it as deleted, and I then can't reinstall it. org-clock-budget is just one file living in ~/.emacs.d/lisp/. If I then try to install dash through M-x package-install it does not give me the option of installing dash, so I'm stymied again. I've removed and replaced org-clock-budget from a fresh update of the git repo, and its made no difference.

As bug-hunter-file run on org-clock-budget shows that its finding a problem at line #29 which is (require 'dash) I'm opining that the problem is lying within dash itself. And possibly with the merge-request of #222, which is possibly the reason for the dash update.

@alphapapa
Copy link

  1. Kill Emacs.
  2. rm -rf ~/.emacs.d/elpa/dash-* ~/.emacs.d/lisp/org-clock-budget*
  3. Start Emacs. You'll probably get errors since dash is missing.
  4. Install dash with package-install.
  5. Replace the org-clock-budget file.
  6. Kill Emacs.
  7. Start Emacs.
  8. Test again.

@boudiccas
Copy link
Author

boudiccas commented Aug 23, 2017

done exactly as you prescribed, but the problem still remains, unfortunately.

Although I do notice one difference, I removed dash 20170810 and have just installed dash 2.12.0

@Fuco1
Copy link
Owner

Fuco1 commented Aug 23, 2017

You can also try to use edebug to walk through the function and pinpoint the problematic place: https://www.gnu.org/software/emacs/manual/html_node/elisp/Using-Edebug.html

@alphapapa
Copy link

Ok, I think we're back to needing the full backtrace. What you gave earlier was just:

Debug on Error enabled globally
(wrong-number-of-arguments (1 . 1) 2) in org-clock-sum

It should be several lines long.

@boudiccas
Copy link
Author

I'm sorry, but I've reached the limits of my comfort zone, I don't feel happy or confident to attempt to use edebug

@alphapapa
Copy link

You should be able to produce the full backtrace by setting debug-on-error and reproducing the problem. That doesn't require edebug.

@boudiccas
Copy link
Author

When I run debug-on-error this is what I get

Debug on Error enabled globally
(wrong-number-of-arguments (1 . 1) 2) in org-clock-sum

@alphapapa
Copy link

What buffer are you copying that from? There should be a *Backtrace* buffer containing the full backtrace.

@boudiccas
Copy link
Author

After eviscerating my config file, I've finally been able to produce a backtrace, so here it is -

Debugger entered--Lisp error: (wrong-number-of-arguments (1 . 1) 2)
  org-time-string-to-seconds("2017-01-01" t)
  org-clock-sum("2017-01-01" "2017-12-31 23:59:59")
  org-clock-budget--get-entry-clocked("2017-01-01" "2017-12-31 23:59:59")
  org-clock-budget--get-entries-with-budget("2017-01-01" "2017-12-31 23:59:59" "BUDGET_YEAR")
  #[257 "\211\211�A\262�\242�@\211 \211�A\262�\242�\300����#\266\203\207" [org-clock-budget--get-entries-with-budget] 11 "\n\n(fn INPUT0)"](("BUDGET_YEAR" org-clock-budget-interval-this-year))
  #[257 "\300�!\207" [#[257 "\211\211�A\262�\242�@\211 \211�A\262�\242�\300����#\266\203\207" [org-clock-budget--get-entries-with-budget] 11 "\n\n(fn INPUT0)"]] 3 "\n\n(fn IT)"](("BUDGET_YEAR" org-clock-budget-interval-this-year))
  mapcar(#[257 "\300�!\207" [#[257 "\211\211�A\262�\242�@\211 \211�A\262�\242�\300����#\266\203\207" [org-clock-budget--get-entries-with-budget] 11 "\n\n(fn INPUT0)"]] 3 "\n\n(fn IT)"] (("BUDGET_YEAR" org-clock-budget-interval-this-year) ("BUDGET_MONTH" org-clock-budget-interval-this-month) ("BUDGET_WEEK" org-clock-budget-interval-this-week)))
  -mapcat(#[257 "\211\211�A\262�\242�@\211 \211�A\262�\242�\300����#\266\203\207" [org-clock-budget--get-entries-with-budget] 11 "\n\n(fn INPUT0)"] (("BUDGET_YEAR" org-clock-budget-interval-this-year) ("BUDGET_MONTH" org-clock-budget-interval-this-month) ("BUDGET_WEEK" org-clock-budget-interval-this-week)))
  org-clock-budget()
  #[257 "r\300�!q\210\301 )\207" [org-get-agenda-file-buffer org-clock-budget] 3 "\n\n(fn IT)"]("/home/boudiccas/.emacs.d/org/organiser.org")
  mapcar(#[257 "r\300�!q\210\301 )\207" [org-get-agenda-file-buffer org-clock-budget] 3 "\n\n(fn IT)"] ("~/.emacs.d/org/works.org" "~/.emacs.d/org/today.org" "/home/boudiccas/.emacs.d/org/organiser.org"))
  org-clock-budget-report()
  funcall-interactively(org-clock-budget-report)
  call-interactively(org-clock-budget-report record nil)
  command-execute(org-clock-budget-report record)
  execute-extended-command(nil "org-clock-budget-report" nil)
  funcall-interactively(execute-extended-command nil "org-clock-budget-report" nil)
  call-interactively(execute-extended-command nil nil)
  command-execute(execute-extended-command)

Does this help?

@Fuco1
Copy link
Owner

Fuco1 commented Aug 23, 2017

Yes, very much. We can see that the function

org-time-string-to-seconds is a Lisp closure in `org.el'.

(org-time-string-to-seconds S)

Convert a timestamp string to a number of seconds.

now only takes one argument instead of two. So that is the problem right there. I think that you are loading an old version of the org-clock.el file (possibly an .elc there somewhere) because the code was updated at the same time so a fresh org install should make things work.

@boudiccas
Copy link
Author

boudiccas commented Aug 23, 2017

But org-plus-contrib was only upgraded on the 20170821, so surely when I restart emacs it should be loading that version? And M-x org-version shows that I am.

Org mode version 9.0.9 (9.0.9-88-g251f88-elpaplus @ /home/boudiccas/.emacs.d/elpa/org-plus-contrib-20170821/)

So what's happening then? Is there a regression in their org-clock file then?

@alphapapa
Copy link

alphapapa commented Aug 23, 2017

As I said, sometimes stale .elc files inexplicably get left behind, and Emacs loads them, and inexplicable problems follow. There's nothing to do but delete all versions of the affected packages and reinstall them.

@boudiccas
Copy link
Author

@alphapapa I've deleted and reinstalled org-plus-contribs like you showed earlier, and its still showing up the original error when I try to use org-clock-budget.

@Fuco1 I'm getting this backtrace now -

Debugger entered--Lisp error: (wrong-number-of-arguments (1 . 1) 2)
  org-time-string-to-seconds("2017-01-01" t)
  org-clock-sum("2017-01-01" "2017-12-31 23:59:59")
  org-clock-budget--get-entry-clocked("2017-01-01" "2017-12-31 23:59:59")
  org-clock-budget--get-entries-with-budget("2017-01-01" "2017-12-31 23:59:59" "BUDGET_YEAR")
  #[257 "\211\211�A\262�\242�@\211 \211�A\262�\242�\300����#\266\203\207" [org-clock-budget--get-entries-with-budget] 11 "\n\n(fn INPUT0)"](("BUDGET_YEAR" org-clock-budget-interval-this-year))
  #[257 "\300�!\207" [#[257 "\211\211�A\262�\242�@\211 \211�A\262�\242�\300����#\266\203\207" [org-clock-budget--get-entries-with-budget] 11 "\n\n(fn INPUT0)"]] 3 "\n\n(fn IT)"](("BUDGET_YEAR" org-clock-budget-interval-this-year))
  mapcar(#[257 "\300�!\207" [#[257 "\211\211�A\262�\242�@\211 \211�A\262�\242�\300����#\266\203\207" [org-clock-budget--get-entries-with-budget] 11 "\n\n(fn INPUT0)"]] 3 "\n\n(fn IT)"] (("BUDGET_YEAR" org-clock-budget-interval-this-year) ("BUDGET_MONTH" org-clock-budget-interval-this-month) ("BUDGET_WEEK" org-clock-budget-interval-this-week)))
  -mapcat(#[257 "\211\211�A\262�\242�@\211 \211�A\262�\242�\300����#\266\203\207" [org-clock-budget--get-entries-with-budget] 11 "\n\n(fn INPUT0)"] (("BUDGET_YEAR" org-clock-budget-interval-this-year) ("BUDGET_MONTH" org-clock-budget-interval-this-month) ("BUDGET_WEEK" org-clock-budget-interval-this-week)))
  org-clock-budget()
  #[257 "r\300�!q\210\301 )\207" [org-get-agenda-file-buffer org-clock-budget] 3 "\n\n(fn IT)"]("/home/boudiccas/.emacs.d/org/organiser.org")
  mapcar(#[257 "r\300�!q\210\301 )\207" [org-get-agenda-file-buffer org-clock-budget] 3 "\n\n(fn IT)"] ("~/.emacs.d/org/works.org" "~/.emacs.d/org/today.org" "/home/boudiccas/.emacs.d/org/organiser.org"))
  org-clock-budget-report()
  funcall-interactively(org-clock-budget-report)
  call-interactively(org-clock-budget-report record nil)
  command-execute(org-clock-budget-report record)
  execute-extended-command(nil "org-clock-budget-report" nil)
  funcall-interactively(execute-extended-command nil "org-clock-budget-report" nil)
  call-interactively(execute-extended-command nil nil)
  command-execute(execute-extended-command)

@alphapapa
Copy link

Did you restart Emacs after reinstalling it?

@boudiccas
Copy link
Author

Yes.

@alphapapa
Copy link

alphapapa commented Aug 23, 2017

Ok, run C-h f org-time-string-to-seconds and see what it says. Then click on the link at the top and look at the function definition. It should look like this:

(defun org-time-string-to-time (s &optional zone)
  "Convert timestamp string S into internal time.
The optional ZONE is omitted or nil for Emacs local time, t for
Universal Time, ‘wall’ for system wall clock time, or a string as
in the TZ environment variable."
  (apply #'encode-time (org-parse-time-string s nil zone)))

Well, when I say "should," I mean, if everything were working correctly. That function was changed to the two-argument version on July 7th in this commit, so your function is from before it:

97a1a498956da2e1961df5a0506df4cbb98fff52
Author:     Nicolas Goaziou <mail@nicolasgoaziou.fr>
AuthorDate: Fri Jul 7 18:23:10 2017 +0200
Commit:     Nicolas Goaziou <mail@nicolasgoaziou.fr>
CommitDate: Fri Jul 7 18:23:10 2017 +0200

Parent:     fd6a6b5 Merge branch 'maint'
Merged:     maint
Containing: agenda-overriding-header-improvements agenda-overriding-header-macro agenda-overriding-header-none (2 more)
Follows:    release_9.0.9 (627)

Fix failing tests in non-daylight saving time zones

* lisp/org.el (org-time-string-to-time): Remove optional POS and
  BUFFER arguments.  Accept new optional ZONE argument.
(org-time-string-to-seconds): Accept optional ZONE argument.
(org-check-before-date):
(org-check-after-date):
(org-check-dates-range):
(org-goto-calendar):
* lisp/ob-gnuplot.el (org-time-string-to-time):
* lisp/org-agenda.el (org-agenda-get-blocks):
* lisp/org-clock.el (org-clock-timestamps-change):
* lisp/org-list.el (org-time-string-to-seconds): Use UTC for time
  difference and time comparison.

* testing/lisp/test-org-clock.el (org-test-clock-create-clock): Use
  UTC for time differences.

@alphapapa
Copy link

alphapapa commented Aug 23, 2017

By the way, since you have org-plus-contrib installed, another possibility is that you have an older version of org that you need to delete from elpa. This is actually fairly likely, I think.

@boudiccas
Copy link
Author

org.el shows this -

(defun org-time-string-to-seconds (s)
  "Convert a timestamp string to a number of seconds."
  (float-time (org-time-string-to-time s)))

Because I found that org-plus-contrib was continually asking for org I use a dummy package of org with the date of org-29991231 since 2014-12-21, and its never shown any problems. It shows as a dependency in paradox with this message Dummy package to satisfy dependencies on org

@alphapapa
Copy link

You said that your org-plus-contrib was upgraded on 20170821, which is after the function was changed to the two-argument version, so it shouldn't be possible for org.el to still contain the one-argument version. Something is wrong with your packages.

You didn't give the full path to org.el, so we don't know where it is coming from.

@boudiccas
Copy link
Author

boudiccas commented Aug 23, 2017

/home/boudiccas/.emacs.d/elpa/org-plus-contrib-20170821/org.el which I installed through paradox at 1307, which shows at line #17695 -

(defun org-time-string-to-seconds (s)
  "Convert a timestamp string to a number of seconds."
  (float-time (org-time-string-to-time s)))

@alphapapa
Copy link

Okay, this is strange: I downloaded org-20180821.tar from the Org ELPA and opened org.el, and it does have the single-argument version. Then I looked in org-clock.el from that package, and it makes calls to that function with two arguments. Something is wrong in the package itself. I wonder if you are the first to notice...

@boudiccas
Copy link
Author

So I'm not going mad then by my org-clock-budget refusing to work? That is a very great relief, thanks. :)

@alphapapa
Copy link

No, you're not going mad at all. My apologies for doubting you; I have had so many similar problems that were caused by old .elc files that I thought surely that was causing this. I'm trying to figure out why the old version of org-clock.el is being included in the package, because this bug was fixed on August 5th.

@alphapapa
Copy link

alphapapa commented Aug 23, 2017

Well, I'm stumped: I check org.el from the current git master branch, and it has the updated function that takes 1 or 2 arguments, and that change was made here:

97a1a498956da2e1961df5a0506df4cbb98fff52
Author:     Nicolas Goaziou <mail@nicolasgoaziou.fr>
AuthorDate: Fri Jul 7 18:23:10 2017 +0200
Commit:     Nicolas Goaziou <mail@nicolasgoaziou.fr>
CommitDate: Fri Jul 7 18:23:10 2017 +0200

Parent:     fd6a6b5 Merge branch 'maint'
Merged:     maint
Containing: agenda-overriding-header-improvements agenda-overriding-header-macro agenda-overriding-header-none (2 more)
Follows:    release_9.0.9 (627)

Fix failing tests in non-daylight saving time zones

* lisp/org.el (org-time-string-to-time): Remove optional POS and
  BUFFER arguments.  Accept new optional ZONE argument.
(org-time-string-to-seconds): Accept optional ZONE argument.
(org-check-before-date):
(org-check-after-date):
(org-check-dates-range):
(org-goto-calendar):
* lisp/ob-gnuplot.el (org-time-string-to-time):
* lisp/org-agenda.el (org-agenda-get-blocks):
* lisp/org-clock.el (org-clock-timestamps-change):
* lisp/org-list.el (org-time-string-to-seconds): Use UTC for time
  difference and time comparison.

* testing/lisp/test-org-clock.el (org-test-clock-create-clock): Use
  UTC for time differences.

7 files changed, 52 insertions(+), 31 deletions(-)
etc/ORG-NEWS                   |  5 ++++-
lisp/ob-gnuplot.el             |  2 +-
lisp/org-agenda.el             | 22 +++++++++++++++++++--
lisp/org-clock.el              |  4 ++--
lisp/org-list.el               |  2 +-
lisp/org.el                    | 43 +++++++++++++++++++++---------------------
testing/lisp/test-org-clock.el |  5 +++--

modified   etc/ORG-NEWS
@@ -23,7 +23,7 @@ Consider setting ~org-duration-units~ instead.
 
 *** ~org-at-timestamp-p~ optional argument accepts different values
 
-See docustrings for the allowed values.  For backward compatibility,
+See docstrings for the allowed values.  For backward compatibility,
 ~(org-at-timestamp-p t)~ is still supported, but should be updated
 accordingly.
 
@@ -85,6 +85,8 @@ list as their first argument.
 The optional argument is now a string to extract the repeater from.
 See docstring for details.
 
+*** Change signature for ~org-time-string-to-time~
+See docstring for changes.
 ** New features
 *** New Org duration library
 This new library implements tools to read and print time durations in
@@ -392,6 +394,7 @@ suitable as a default value.
 *** New entities : ~\dollar~ and ~\USD~
 *** ~org-parse-time-string~ accepts a new optional argument
 =ZONE= specifies the current time zone.
+*** ~org-time-string-to-seconds~ now accepts an optional =ZONE= argument
 *** Support for date style URLs in =org-protocol://open-source=
     URLs like =https://cool-blog.com/2017/05/20/cool-post/= are
     covered by rewrite rules.
modified   lisp/ob-gnuplot.el
@@ -40,7 +40,7 @@
 ;;; Code:
 (require 'ob)
 
-(declare-function org-time-string-to-time "org" (s &optional buffer pos))
+(declare-function org-time-string-to-time "org" (s &optional zone))
 (declare-function org-combine-plists "org" (&rest plists))
 (declare-function orgtbl-to-generic "org-table" (table params))
 (declare-function gnuplot-mode "ext:gnuplot-mode" ())
modified   lisp/org-agenda.el
@@ -6264,8 +6264,26 @@ scheduled items with an hour specification like [h]h:mm."
 	      (end-time (match-string 2)))
 	  (setq s1 (match-string 1)
 		s2 (match-string 2)
-		d1 (time-to-days (org-time-string-to-time s1 (current-buffer) pos))
-		d2 (time-to-days (org-time-string-to-time s2 (current-buffer) pos)))
+		d1 (time-to-days
+		    (condition-case err
+			(org-time-string-to-time s1)
+		      (error
+		       (error
+			"Bad timestamp %S at %d in buffer %S\nError was: %s"
+			s1
+			pos
+			(current-buffer)
+			(error-message-string err)))))
+		d2 (time-to-days
+		    (condition-case err
+			(org-time-string-to-time s2)
+		      (error
+		       (error
+			"Bad timestamp %S at %d in buffer %S\nError was: %s"
+			s2
+			pos
+			(current-buffer)
+			(error-message-string err))))))
 	  (if (and (> (- d0 d1) -1) (> (- d2 d0) -1))
 	      ;; Only allow days between the limits, because the normal
 	      ;; date stamps will catch the limits.
modified   lisp/org-clock.el
@@ -1701,8 +1701,8 @@ Optional argument N tells to change by that many units."
 	      (begts (if updatets1 begts1 begts2)))
 	  (setq tdiff
 		(time-subtract
-		 (org-time-string-to-time org-last-changed-timestamp)
-		 (org-time-string-to-time ts)))
+		 (org-time-string-to-time org-last-changed-timestamp t)
+		 (org-time-string-to-time ts t)))
 	  (save-excursion
 	    (goto-char begts)
 	    (org-timestamp-change
modified   lisp/org-list.el
@@ -149,7 +149,7 @@
 (declare-function org-remove-indentation "org" (code &optional n))
 (declare-function org-show-subtree "org" ())
 (declare-function org-sort-remove-invisible "org" (S))
-(declare-function org-time-string-to-seconds "org" (s))
+(declare-function org-time-string-to-seconds "org" (s &optional zone))
 (declare-function org-timer-hms-to-secs "org-timer" (hms))
 (declare-function org-timer-item "org-timer" (&optional arg))
 (declare-function org-trim "org" (s &optional keep-lead))
modified   lisp/org.el
@@ -17439,8 +17439,8 @@ both scheduled and deadline timestamps."
 			   'timestamp)
 		     (org-at-planning-p))
 		   (time-less-p
-		    (org-time-string-to-time match)
-		    (org-time-string-to-time d)))))))
+		    (org-time-string-to-time match t)
+		    (org-time-string-to-time d t)))))))
     (message "%d entries before %s"
 	     (org-occur regexp nil callback)
 	     d)))
@@ -17461,8 +17461,8 @@ both scheduled and deadline timestamps."
 			   'timestamp)
 		     (org-at-planning-p))
 		   (not (time-less-p
-			 (org-time-string-to-time match)
-			 (org-time-string-to-time d))))))))
+			 (org-time-string-to-time match t)
+			 (org-time-string-to-time d t))))))))
     (message "%d entries after %s"
 	     (org-occur regexp nil callback)
 	     d)))
@@ -17485,11 +17485,11 @@ both scheduled and deadline timestamps."
 			'timestamp)
 		  (org-at-planning-p))
 		(not (time-less-p
-		      (org-time-string-to-time match)
-		      (org-time-string-to-time start-date)))
+		      (org-time-string-to-time match t)
+		      (org-time-string-to-time start-date t)))
 		(time-less-p
-		 (org-time-string-to-time match)
-		 (org-time-string-to-time end-date))))))))
+		 (org-time-string-to-time match t)
+		 (org-time-string-to-time end-date t))))))))
     (message "%d entries between %s and %s"
 	     (org-occur regexp nil callback) start-date end-date)))
 
@@ -17574,19 +17574,19 @@ days in order to avoid rounding problems."
       (push m l))
     (apply 'format fmt (nreverse l))))
 
-(defun org-time-string-to-time (s &optional buffer pos)
-  "Convert a timestamp string into internal time."
-  (condition-case errdata
-      (apply 'encode-time (org-parse-time-string s))
-    (error (error "Bad timestamp `%s'%s\nError was: %s"
-		  s (if (not (and buffer pos))
-			""
-		      (format-message " at %d in buffer `%s'" pos buffer))
-		  (cdr errdata)))))
+(defun org-time-string-to-time (s &optional zone)
+  "Convert timestamp string S into internal time.
+The optional ZONE is omitted or nil for Emacs local time, t for
+Universal Time, ‘wall’ for system wall clock time, or a string as
+in the TZ environment variable."
+  (apply #'encode-time (org-parse-time-string s nil zone)))
 
-(defun org-time-string-to-seconds (s)
-  "Convert a timestamp string to a number of seconds."
-  (float-time (org-time-string-to-time s)))
+(defun org-time-string-to-seconds (s &optional zone)
+  "Convert a timestamp string S into a number of seconds.
+The optional ZONE is omitted or nil for Emacs local time, t for
+Universal Time, ‘wall’ for system wall clock time, or a string as
+in the TZ environment variable."
+  (float-time (org-time-string-to-time s zone)))
 
 (org-define-error 'org-diary-sexp-no-match "Unable to match diary sexp")
 
@@ -18159,8 +18159,7 @@ A prefix ARG can be used to force the current date."
     (when (or (org-at-timestamp-p 'lax)
 	      (org-match-line (concat ".*" org-ts-regexp)))
       (let ((d1 (time-to-days (current-time)))
-	    (d2 (time-to-days
-		 (org-time-string-to-time (match-string 1)))))
+	    (d2 (time-to-days (org-time-string-to-time (match-string 1)))))
 	(setq diff (- d2 d1))))
     (calendar)
     (calendar-goto-today)
modified   testing/lisp/test-org-clock.el
@@ -48,8 +48,9 @@ range.  INPUT2 can be omitted if clock hasn't finished yet.
 Return the clock line as a string."
   (let* ((beg (org-test-clock-create-timestamp input1 t t))
          (end (and input2 (org-test-clock-create-timestamp input2 t t)))
-         (sec-diff (and input2 (floor (- (org-time-string-to-seconds end)
-                                         (org-time-string-to-seconds beg))))))
+         (sec-diff (and input2
+			(floor (- (org-time-string-to-seconds end t)
+				  (org-time-string-to-seconds beg t))))))
     (concat org-clock-string " " beg
             (when end
               (concat "--" end " => "

And that introduced a bug that was fixed in org-clock.el here:

7e241af591df15d2b7587648ed2342ae3a5d0e5b
Author:     Nicolas Goaziou <mail@nicolasgoaziou.fr>
AuthorDate: Sat Aug 5 15:28:06 2017 +0200
Commit:     Nicolas Goaziou <mail@nicolasgoaziou.fr>
CommitDate: Sat Aug 5 15:35:37 2017 +0200

Parent:     e67f0f2 ox-icalendar: Prevent duplicates when writing agenda view
Merged:     maint
Containing: agenda-overriding-header-improvements agenda-overriding-header-macro agenda-overriding-header-none (2 more)
Follows:    release_9.0.9 (61)

org-clock: Fix regression in `org-clock-sum'

* lisp/org-clock.el (org-clock-sum): Fix regression introduced in
  112c5ba479d52c3c36de5c7aafd14ab6bc075005.  Small refactoring.

Reported-by: Josh Moller-Mara <jmm@cns.nyu.edu>
http://lists.gnu.org/archive/html/emacs-orgmode/2017-08/msg00117.html

1 file changed, 24 insertions(+), 22 deletions(-)
lisp/org-clock.el | 46 ++++++++++++++++++++++++----------------------

modified   lisp/org-clock.el
@@ -1803,14 +1803,15 @@ PROPNAME lets you set a custom text property instead of :org-clock-minutes."
 		      "[ \t]*\\(?:\\(\\[.*?\\]\\)-+\\(\\[.*?\\]\\)\\|=>[ \t]+\\([0-9]+\\):\\([0-9]+\\)\\)"))
 	  (lmax 30)
 	  (ltimes (make-vector lmax 0))
-	  (t1 0)
 	  (level 0)
-	  ts te dt
+	  (tstart (cond ((stringp tstart) (org-time-string-to-seconds tstart t))
+			((consp tstart) (float-time tstart))
+			(t tstart)))
+	  (tend (cond ((stringp tend) (org-time-string-to-seconds tend t))
+		      ((consp tend) (float-time tend))
+		      (t tend)))
+	  (t1 0)
 	  time)
-     (if (stringp tstart) (setq tstart (org-time-string-to-seconds tstart)))
-     (if (stringp tend) (setq tend (org-time-string-to-seconds tend)))
-     (if (consp tstart) (setq tstart (float-time tstart)))
-     (if (consp tend) (setq tend (float-time tend)))
      (remove-text-properties (point-min) (point-max)
 			     `(,(or propname :org-clock-minutes) t
 			       :org-clock-force-headline-inclusion t))
@@ -1819,26 +1820,27 @@ PROPNAME lets you set a custom text property instead of :org-clock-minutes."
        (while (re-search-backward re nil t)
 	 (cond
 	  ((match-end 2)
-	   ;; Two time stamps
-	   (setq ts (match-string 2)
-		 te (match-string 3)
-		 ts (float-time
-		     (apply #'encode-time (org-parse-time-string ts nil t)))
-		 te (float-time
-		     (apply #'encode-time (org-parse-time-string te nil t)))
-		 ts (if tstart (max ts tstart) ts)
-		 te (if tend (min te tend) te)
-		 dt (- te ts)
-		 t1 (if (> dt 0) (+ t1 (floor (/ dt 60))) t1)))
+	   ;; Two time stamps.
+	   (let* ((ts (float-time
+		       (apply #'encode-time
+			      (save-match-data
+				(org-parse-time-string
+				 (match-string 2) nil t)))))
+		  (te (float-time
+		       (apply #'encode-time
+			      (org-parse-time-string (match-string 3) nil t))))
+		  (dt (- (if tend (min te tend) te)
+			 (if tstart (max ts tstart) ts))))
+	     (when (> dt 0) (cl-incf t1 (floor (/ dt 60))))))
 	  ((match-end 4)
-	   ;; A naked time
+	   ;; A naked time.
 	   (setq t1 (+ t1 (string-to-number (match-string 5))
 		       (* 60 (string-to-number (match-string 4))))))
-	  (t ;; A headline
-	   ;; Add the currently clocking item time to the total
+	  (t	 ;A headline
+	   ;; Add the currently clocking item time to the total.
 	   (when (and org-clock-report-include-clocking-task
-		      (equal (org-clocking-buffer) (current-buffer))
-		      (equal (marker-position org-clock-hd-marker) (point))
+		      (eq (org-clocking-buffer) (current-buffer))
+		      (eq (marker-position org-clock-hd-marker) (point))
 		      tstart
 		      tend
 		      (>= (float-time org-clock-start-time) tstart)

And that was merged to master here:

569b7d105c0e9572eed7c8d652052433e0a10f1e
Author:     Nicolas Goaziou <mail@nicolasgoaziou.fr>
AuthorDate: Sat Aug 5 15:38:13 2017 +0200
Commit:     Nicolas Goaziou <mail@nicolasgoaziou.fr>
CommitDate: Sat Aug 5 15:38:13 2017 +0200

Parent:     d5690b6 Merge branch 'maint'
Parent:     7e241af org-clock: Fix regression in `org-clock-sum'
Merged:     maint
Containing: agenda-overriding-header-improvements agenda-overriding-header-macro agenda-overriding-header-none (2 more)
Follows:    release_9.0.9 (702)

Merge branch 'maint'

1 file changed, 24 insertions(+), 22 deletions(-)
lisp/org-clock.el | 46 ++++++++++++++++++++++++----------------------

Then I check org.el from the org-20170821.tar and it has the old function that only takes 1 argument. How is the old org.el file ending up in the new tar?

I guess you should post this on the mailing list so one of the maintainers can look into it. Unless I'm also going mad, something's not right here.

@alphapapa
Copy link

I'm curious, so I will go ahead and post it to the mailing list.

@Fuco1
Copy link
Owner

Fuco1 commented Aug 23, 2017

@alphapapa thanks for investigating! I'm so flustered right now I wouldn't be able to do the detective work.

@alphapapa
Copy link

Achim Gratz responded on the mailing list:

It seems that org.el in org-20170821.tar is out of date. Sharon Kimble
noticed that something was wrong, and after much digging, we found that
org-clock.el has been updated to have calls to
org-time-string-to-seconds with 2 arguments, but the function definition
in org.el only takes 1 argument.

This is very strange, because the addition of the extra arg to
org-time-string-to-seconds was made back on July 7, and that
introduced

That change is only on master, so whatever trouble you are seeing in the
ELPA tarball is unrelated to that change.

a bug which was fixed in org-clock.el on August 5, yet the tarball from
August 21 has the pre-July 7 org-time-string-to-seconds function.

That fix was introduced on maint and merged to master, which seems to be
in error since the bug was in master only.

I don't know how the build process works, but IIUC, the tarballs are built from the maint branch, and the regression was on master, and the regression fix was applied to maint, which broke maint. So hopefully that can be fixed soon.

@boudiccas
Copy link
Author

boudiccas commented Aug 29, 2017

I have just updated my emacs packages which have included 'org-plus-contrib-20170828' but my original problem still remains. I have closed emacs and then restarted it but its made no difference. Arrrgghhh!

@Fuco1
Copy link
Owner

Fuco1 commented Aug 29, 2017

I think you will need to get an older version instead. I run 20170515 and it does not have the problem.

@alphapapa
Copy link

I was hoping one of the Org maintainers would respond to that thread on the mailing list, but I see that none have. :(

@boudiccas
Copy link
Author

And I've now got org-clock-budget working again. I updated my org-mode cloning in my git directory, and then set my emacs config to be read from there, and its all working nicely. So thanks folks, I'm a happy bunny again.

@alphapapa
Copy link

Are you running maint or master then?

@boudiccas
Copy link
Author

master

@alphapapa
Copy link

alphapapa commented Aug 30, 2017

Yes, that explains it, as the fix was erroneously applied to maint instead of master. That still needs to be fixed, AFAIK, although since Org 9.1 is about to be released, I guess it won't matter then.

@alphapapa
Copy link

alphapapa commented Sep 2, 2017

By the way, I just noticed this in a message from Nicolas Goaziou; it might be part of the problem:

As I wrote, it is still a problem of mixed installation. Quoting the
manual

Recent Emacs distributions include a packaging system which lets you
install Elisp libraries. You can install Org with ‘M-x package-install
RET org’.

Important: you need to do this in a session where no ‘.org’ file has
been visited, i.e., where no Org built-in function have been loaded.
Otherwise autoload Org functions will mess up the installation.

Then, to make sure your Org configuration is taken into account,
initialize the package system with ‘(package-initialize)’ in your
‘.emacs’ before setting any Org option. If you want to use Org’s
package repository, check out the Org ELPA page
(http://orgmode.org/elpa.html).

Some users install Org launching a new Emacs session without any
configuration file.

@boudiccas
Copy link
Author

I've got org-clock-budget working in org version 9.1!

Using the stock install doesn't allow org-clock-budget to work, however, if you include this -

(setq org-agenda-show-future-repeats nil)

it works! However, there is one caveat - it doesn't allow you to just use hours (which I think is org-clock-budget's default), instead it uses like this '1d 10:34', or '20d 20:00'. I don't know if org-clock-budget could be tweaked to get back to the original hours, which I much prefer, or is there some other way in which we can get org-clock-budget displaying back in hours please?

I have no idea what jiggery-pokery is going on under the bonnet, but hey-ho, its works!

@Fuco1
Copy link
Owner

Fuco1 commented Sep 10, 2017

I've changed my workflow in the last year or so and haven't used this much but I'm thinking getting back to my old way of doing things. I will have a look but can't promise as to when.

@Fuco1 Fuco1 closed this as completed Mar 21, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: Done
Development

No branches or pull requests

3 participants