From 5841a1f4690a02c3271105507c82ea18c4d85fb7 Mon Sep 17 00:00:00 2001 From: Christian Egli Date: Thu, 18 Mar 2010 22:22:30 +0100 Subject: [PATCH] Add support for explicit dependencies --- lisp/org-taskjuggler.el | 51 +++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/lisp/org-taskjuggler.el b/lisp/org-taskjuggler.el index 36eda0ef8..afff2df55 100644 --- a/lisp/org-taskjuggler.el +++ b/lisp/org-taskjuggler.el @@ -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