mirror of
https://git.savannah.gnu.org/git/emacs/org-mode.git
synced 2024-08-24 18:32:52 +00:00
Add support for explicit dependencies
This commit is contained in:
parent
8d42317b4c
commit
5841a1f469
|
@ -242,7 +242,8 @@ a path to the current task."
|
|||
(push unique-id path)))
|
||||
((= previous-level level)
|
||||
(setq unique-id (org-taskjuggler-get-unique-id task (car unique-ids)))
|
||||
(push unique-id (car unique-ids)))
|
||||
(push unique-id (car unique-ids))
|
||||
(setcar path unique-id))
|
||||
((> previous-level level)
|
||||
(dotimes (tmp (- previous-level level))
|
||||
(pop unique-ids)
|
||||
|
@ -271,10 +272,18 @@ unique id to each resource."
|
|||
siblings
|
||||
task resolved-tasks)
|
||||
(dolist (task tasks resolved-tasks)
|
||||
(let ((level (cdr (assoc "level" task)))
|
||||
(let* ((level (cdr (assoc "level" task)))
|
||||
(depends (cdr (assoc "depends" task)))
|
||||
(parent-ordered (cdr (assoc "parent-ordered" task)))
|
||||
(blocker (cdr (assoc "BLOCKER" task)))
|
||||
(blocked-on-previous (and blocker (string-match "previous-sibling" blocker)))
|
||||
(dependencies
|
||||
(org-taskjuggler-resolve-explicit-dependencies
|
||||
(append
|
||||
(and depends (split-string depends "[, \f\t\n\r\v]+" t))
|
||||
(and blocker (split-string blocker "[, \f\t\n\r\v]+" t))) tasks))
|
||||
previous-sibling)
|
||||
; update previous sibling info
|
||||
(cond
|
||||
((< previous-level level)
|
||||
(dotimes (tmp (- level previous-level))
|
||||
|
@ -287,13 +296,37 @@ unique id to each resource."
|
|||
(pop siblings))
|
||||
(setq previous-sibling (car siblings))
|
||||
(setcar siblings task)))
|
||||
(when (and previous-sibling parent-ordered)
|
||||
(push
|
||||
(cons "depends"
|
||||
(format "!%s" (cdr (assoc "unique-id" previous-sibling)))) task))
|
||||
; insert a dependency on previous sibling if the parent is
|
||||
; ordered or if the tasks has a BLOCKER attribute with value "previous-sibling"
|
||||
(when (or (and previous-sibling parent-ordered) blocked-on-previous)
|
||||
(push (format "!%s" (cdr (assoc "unique-id" previous-sibling))) dependencies))
|
||||
; store dependency information
|
||||
(when dependencies
|
||||
(push (cons "depends" (mapconcat 'identity dependencies ", ")) task))
|
||||
(setq previous-level level)
|
||||
(setq resolved-tasks (append resolved-tasks (list task)))))))
|
||||
|
||||
(defun org-taskjuggler-resolve-explicit-dependencies (dependencies tasks)
|
||||
(let (path)
|
||||
(cond
|
||||
((null dependencies) nil)
|
||||
; ignore previous sibling dependencies
|
||||
((equal (car dependencies) "previous-sibling")
|
||||
(org-taskjuggler-resolve-explicit-dependencies (cdr dependencies) tasks))
|
||||
; if the id is found in another task use its path
|
||||
((setq path (org-taskjuggler-find-task-with-id (car dependencies) tasks))
|
||||
(cons path (org-taskjuggler-resolve-explicit-dependencies (cdr dependencies) tasks)))
|
||||
; silently ignore all other dependencies
|
||||
(t (org-taskjuggler-resolve-explicit-dependencies (cdr dependencies) tasks)))))
|
||||
|
||||
(defun org-taskjuggler-find-task-with-id (id tasks)
|
||||
"Find ID in tasks. If found return the path of task. Otherwise return nil."
|
||||
(cond
|
||||
((null tasks) nil)
|
||||
((equal (cdr (assoc "ID" (car tasks))) id)
|
||||
(cdr (assoc "path" (car tasks))))
|
||||
(t (org-taskjuggler-find-task-with-id id (cdr tasks)))))
|
||||
|
||||
(defun org-taskjuggler-get-unique-id (item unique-ids)
|
||||
"Return a unique id for an ITEM which can be a task or a resource.
|
||||
The id is derived from the headline and made unique against
|
||||
|
|
Loading…
Reference in a new issue