0
0
Fork 1
mirror of https://git.savannah.gnu.org/git/emacs/org-mode.git synced 2024-07-16 14:16:26 +00:00

Add support for explicit dependencies

This commit is contained in:
Christian Egli 2010-03-18 22:22:30 +01:00
parent 8d42317b4c
commit 5841a1f469

View file

@ -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)))
(depends (cdr (assoc "depends" task)))
(parent-ordered (cdr (assoc "parent-ordered" task)))
previous-sibling)
(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