From mboxrd@z Thu Jan 1 00:00:00 1970 From: Carsten Dominik Subject: Re: patch for local variable based todo blocking Date: Mon, 1 Feb 2010 17:36:14 +0100 Message-ID: <722DA288-B750-44C9-8ABC-44A700DD7DF6@gmail.com> References: Mime-Version: 1.0 (Apple Message framework v936) Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NbzpN-00067t-3C for emacs-orgmode@gnu.org; Mon, 01 Feb 2010 12:12:45 -0500 Received: from [199.232.76.173] (port=35850 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NbzpM-000674-H2 for emacs-orgmode@gnu.org; Mon, 01 Feb 2010 12:12:44 -0500 Received: from Debian-exim by monty-python.gnu.org with spam-scanned (Exim 4.60) (envelope-from ) id 1NbzpK-0005pj-Gl for emacs-orgmode@gnu.org; Mon, 01 Feb 2010 12:12:44 -0500 Received: from mail-ew0-f228.google.com ([209.85.219.228]:46650) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NbzpJ-0005op-PN for emacs-orgmode@gnu.org; Mon, 01 Feb 2010 12:12:42 -0500 Received: by ewy28 with SMTP id 28so2524146ewy.8 for ; Mon, 01 Feb 2010 09:12:39 -0800 (PST) In-Reply-To: List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Wes Hardaker Cc: emacs-orgmode@gnu.org Applied, thanks. - Carsten On Jan 28, 2010, at 7:27 PM, Wes Hardaker wrote: > > Attached is a patch that lets local variables define whether or not > todo > dependency blocking should be used (both for TODOs and for > checkboxes). > I have one file in particular that I'm using checkboxes to quickly > indicate multi-selections from a list but for most of my files I want > TODOs blocked by uncompleted checkboxes. > > Normally org uses hook methods for checking for TODO blocks and this > patch just inserts a check at the top to test and see if the variable > turning on the blocking type is still set. > > -- > Wes Hardaker > My Pictures: http://capturedonearth.com/ > My Thoughts: http://pontifications.hardakers.net/ > diff --git a/lisp/org.el b/lisp/org.el > index cd378b4..bdc5c5a 100644 > --- a/lisp/org.el > +++ b/lisp/org.el > @@ -10159,54 +10159,56 @@ changes. Such blocking occurs when: > 3. The parent of the task is blocked because it has siblings that > should > be done first, or is child of a block grandparent TODO entry." > > - (catch 'dont-block > - ;; If this is not a todo state change, or if this entry is > already DONE, > - ;; do not block > - (when (or (not (eq (plist-get change-plist :type) 'todo-state- > change)) > - (member (plist-get change-plist :from) > - (cons 'done org-done-keywords)) > - (member (plist-get change-plist :to) > - (cons 'todo org-not-done-keywords)) > - (not (plist-get change-plist :to))) > - (throw 'dont-block t)) > - ;; If this task has children, and any are undone, it's blocked > - (save-excursion > - (org-back-to-heading t) > - (let ((this-level (funcall outline-level))) > - (outline-next-heading) > - (let ((child-level (funcall outline-level))) > - (while (and (not (eobp)) > - (> child-level this-level)) > - ;; this todo has children, check whether they are all > - ;; completed > - (if (and (not (org-entry-is-done-p)) > - (org-entry-is-todo-p)) > - (throw 'dont-block nil)) > - (outline-next-heading) > - (setq child-level (funcall outline-level)))))) > - ;; Otherwise, if the task's parent has the :ORDERED: property, > and > - ;; any previous siblings are undone, it's blocked > - (save-excursion > - (org-back-to-heading t) > - (let* ((pos (point)) > - (parent-pos (and (org-up-heading-safe) (point)))) > - (if (not parent-pos) (throw 'dont-block t)) ; no parent > - (when (and (org-entry-get (point) "ORDERED") > - (forward-line 1) > - (re-search-forward org-not-done-heading-regexp pos t)) > - (throw 'dont-block nil)) ; block, there is an older sibling not > done. > - ;; Search further up the hierarchy, to see if an anchestor is > blocked > - (while t > - (goto-char parent-pos) > - (if (not (looking-at org-not-done-heading-regexp)) > - (throw 'dont-block t)) ; do not block, parent is not a TODO > - (setq pos (point)) > - (setq parent-pos (and (org-up-heading-safe) (point))) > + (if (not org-enforce-todo-dependencies) > + t ; if locally turned off don't block > + (catch 'dont-block > + ;; If this is not a todo state change, or if this entry is > already DONE, > + ;; do not block > + (when (or (not (eq (plist-get change-plist :type) 'todo-state- > change)) > + (member (plist-get change-plist :from) > + (cons 'done org-done-keywords)) > + (member (plist-get change-plist :to) > + (cons 'todo org-not-done-keywords)) > + (not (plist-get change-plist :to))) > + (throw 'dont-block t)) > + ;; If this task has children, and any are undone, it's blocked > + (save-excursion > + (org-back-to-heading t) > + (let ((this-level (funcall outline-level))) > + (outline-next-heading) > + (let ((child-level (funcall outline-level))) > + (while (and (not (eobp)) > + (> child-level this-level)) > + ;; this todo has children, check whether they are all > + ;; completed > + (if (and (not (org-entry-is-done-p)) > + (org-entry-is-todo-p)) > + (throw 'dont-block nil)) > + (outline-next-heading) > + (setq child-level (funcall outline-level)))))) > + ;; Otherwise, if the task's parent has the :ORDERED: > property, and > + ;; any previous siblings are undone, it's blocked > + (save-excursion > + (org-back-to-heading t) > + (let* ((pos (point)) > + (parent-pos (and (org-up-heading-safe) (point)))) > (if (not parent-pos) (throw 'dont-block t)) ; no parent > (when (and (org-entry-get (point) "ORDERED") > (forward-line 1) > (re-search-forward org-not-done-heading-regexp pos t)) > - (throw 'dont-block nil))))))) ; block, older sibling not done. > + (throw 'dont-block nil)) ; block, there is an older sibling > not done. > + ;; Search further up the hierarchy, to see if an anchestor is > blocked > + (while t > + (goto-char parent-pos) > + (if (not (looking-at org-not-done-heading-regexp)) > + (throw 'dont-block t)) ; do not block, parent is not a TODO > + (setq pos (point)) > + (setq parent-pos (and (org-up-heading-safe) (point))) > + (if (not parent-pos) (throw 'dont-block t)) ; no parent > + (when (and (org-entry-get (point) "ORDERED") > + (forward-line 1) > + (re-search-forward org-not-done-heading-regexp pos t)) > + (throw 'dont-block nil)))))))) ; block, older sibling not > done. > > (defcustom org-track-ordered-property-with-tag nil > "Should the ORDERED property also be shown as a tag? > @@ -10250,30 +10252,32 @@ See variable `org-track-ordered-property- > with-tag'." > "Block turning an entry into a TODO, using checkboxes. > This checks whether the current task should be blocked from state > changes because there are unchecked boxes in this entry." > - (catch 'dont-block > - ;; If this is not a todo state change, or if this entry is > already DONE, > - ;; do not block > - (when (or (not (eq (plist-get change-plist :type) 'todo-state- > change)) > - (member (plist-get change-plist :from) > - (cons 'done org-done-keywords)) > - (member (plist-get change-plist :to) > - (cons 'todo org-not-done-keywords)) > - (not (plist-get change-plist :to))) > - (throw 'dont-block t)) > - ;; If this task has checkboxes that are not checked, it's blocked > - (save-excursion > - (org-back-to-heading t) > - (let ((beg (point)) end) > - (outline-next-heading) > - (setq end (point)) > - (goto-char beg) > - (if (re-search-forward "^[ \t]*\\([-+*]\\|[0-9]+[.)]\\)[ \t]+\\ > [[- ]\\]" > - end t) > - (progn > - (if (boundp 'org-blocked-by-checkboxes) > - (setq org-blocked-by-checkboxes t)) > - (throw 'dont-block nil))))) > - t)) ; do not block > + (if (not org-enforce-todo-checkbox-dependencies) > + t ; if locally turned off don't block > + (catch 'dont-block > + ;; If this is not a todo state change, or if this entry is > already DONE, > + ;; do not block > + (when (or (not (eq (plist-get change-plist :type) 'todo-state- > change)) > + (member (plist-get change-plist :from) > + (cons 'done org-done-keywords)) > + (member (plist-get change-plist :to) > + (cons 'todo org-not-done-keywords)) > + (not (plist-get change-plist :to))) > + (throw 'dont-block t)) > + ;; If this task has checkboxes that are not checked, it's > blocked > + (save-excursion > + (org-back-to-heading t) > + (let ((beg (point)) end) > + (outline-next-heading) > + (setq end (point)) > + (goto-char beg) > + (if (re-search-forward "^[ \t]*\\([-+*]\\|[0-9]+[.)]\\)[ \t]+\\ > [[- ]\\]" > + end t) > + (progn > + (if (boundp 'org-blocked-by-checkboxes) > + (setq org-blocked-by-checkboxes t)) > + (throw 'dont-block nil))))) > + t))) ; do not block > > (defun org-entry-blocked-p () > "Is the current entry blocked?" > _______________________________________________ > Emacs-orgmode mailing list > Please use `Reply All' to send replies to the list. > Emacs-orgmode@gnu.org > http://lists.gnu.org/mailman/listinfo/emacs-orgmode - Carsten