[Org] Functions to copy clock lines from one task to another
This commit is contained in:
parent
74a26b4d5a
commit
b790d98977
|
@ -1156,6 +1156,49 @@ the clock line is to be added to."
|
||||||
(org-with-point-at target-marker
|
(org-with-point-at target-marker
|
||||||
(db/org-add-clocking-time new-start new-end))))
|
(db/org-add-clocking-time new-start new-end))))
|
||||||
|
|
||||||
|
(defun db/org-clock-lines-of-task (marker)
|
||||||
|
"Return list of all clock lines of task under MARKER.
|
||||||
|
Each clock line is represented as a cons cell (START . END),
|
||||||
|
where both START and END are the starting and ending times of the
|
||||||
|
corresponding clock lines, encoded as a float denoting the
|
||||||
|
seconds since the epoch. Includes clock lines of all subtrees as
|
||||||
|
well. The order of the entries in the resulting list will be
|
||||||
|
reversed of what it is in the subtree of MARKER."
|
||||||
|
(when (not (markerp marker))
|
||||||
|
(user-error "Marker not valid."))
|
||||||
|
(let ((clock-lines nil))
|
||||||
|
(save-mark-and-excursion
|
||||||
|
(org-with-point-at marker
|
||||||
|
(org-narrow-to-subtree)
|
||||||
|
(db/org-map-clock-lines-and-entries
|
||||||
|
(lambda (start end)
|
||||||
|
(push (cons (org-time-string-to-seconds start)
|
||||||
|
(org-time-string-to-seconds end))
|
||||||
|
clock-lines))
|
||||||
|
(lambda ()))))
|
||||||
|
clock-lines))
|
||||||
|
|
||||||
|
(defun db/org-copy-clock-lines (source-id target-id)
|
||||||
|
"Copy clock lines from one task to another, adapting clock
|
||||||
|
lines in the file of TARGET-ID accordingly.
|
||||||
|
|
||||||
|
Both SOURCE-ID and TARGET-ID must designate known org-mode
|
||||||
|
tasks. Copies all clock lines attached to SOURCE-ID or to one of
|
||||||
|
its subtree."
|
||||||
|
(let ((source-marker (org-id-find source-id :get-marker))
|
||||||
|
(target-marker (org-id-find target-id :get-marker)))
|
||||||
|
(cl-assert (markerp source-marker)
|
||||||
|
"Source task %s not found" source-id)
|
||||||
|
(cl-assert (markerp target-marker)
|
||||||
|
"Target task %s not found" target-id)
|
||||||
|
|
||||||
|
;; We first fetch the relevant clock-lines into memory, and then add them to
|
||||||
|
;; the target task one by one, adjusting the other clock lines in between;
|
||||||
|
;; this is rather inefficient, but we will fix this only when we need it.
|
||||||
|
(dolist (clock-line (db/org-clock-lines-of-task source-marker))
|
||||||
|
(db/org-add-clock-line-to-marker target-marker
|
||||||
|
(car clock-line) (cdr clock-line)))))
|
||||||
|
|
||||||
|
|
||||||
;;; End
|
;;; End
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue