Added support for optional depends attributes
This commit is contained in:
parent
020731ec2c
commit
d6de24e44b
|
@ -374,12 +374,14 @@ unique id to each resource."
|
|||
(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)))
|
||||
(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))
|
||||
(and depends (org-taskjuggler-tokenize-dependencies depends))
|
||||
(and blocker (org-taskjuggler-tokenize-dependencies blocker)))
|
||||
tasks))
|
||||
previous-sibling)
|
||||
; update previous sibling info
|
||||
(cond
|
||||
|
@ -404,21 +406,44 @@ unique id to each resource."
|
|||
(setq previous-level level)
|
||||
(setq resolved-tasks (append resolved-tasks (list task)))))))
|
||||
|
||||
(defun org-taskjuggler-tokenize-dependencies (dependencies)
|
||||
"Split a dependency property value DEPENDENCIES into the
|
||||
individual dependencies and return them as a list while keeping
|
||||
the optional arguments (such as gapduration) for the
|
||||
dependencies. A dependency will have to match `[-a-zA-Z0-9_]+'."
|
||||
(cond
|
||||
((string-match "^ *$" dependencies) nil)
|
||||
((string-match "^[ \t]*\\([-a-zA-Z0-9_]+\\([ \t]*{[^}]+}\\)?\\)[ \t,]*" dependencies)
|
||||
(cons
|
||||
(substring dependencies (match-beginning 1) (match-end 1))
|
||||
(org-taskjuggler-tokenize-dependencies (substring dependencies (match-end 0)))))
|
||||
(t (error (format "invalid dependency id %s" dependencies)))))
|
||||
|
||||
(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)))))
|
||||
(unless (null dependencies)
|
||||
(let*
|
||||
;; the dependency might have optional attributes such as "{
|
||||
;; gapduration 5d }", so only use the first string as id for the
|
||||
;; dependency
|
||||
((id (car (split-string (car dependencies))))
|
||||
(optional-attributes
|
||||
(mapconcat 'identity (cdr (split-string (car dependencies))) " "))
|
||||
(path (org-taskjuggler-find-task-with-id id tasks)))
|
||||
(cond
|
||||
;; 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
|
||||
((not (null path))
|
||||
(cons (mapconcat 'identity (list path optional-attributes) " ")
|
||||
(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."
|
||||
"Find ID in tasks. If found return the path of task. Otherwise
|
||||
return nil."
|
||||
(let ((task-id (cdr (assoc "ID" (car tasks))))
|
||||
(path (cdr (assoc "path" (car tasks)))))
|
||||
(cond
|
||||
|
|
Loading…
Reference in New Issue