Re: [O] [PATCH] org-clone-subtree-with-time-shift: Accept 0 clones

2015-06-22 Thread Kyle Meyer
Nicolas Goaziou m...@nicolasgoaziou.fr wrote:
 -(if (not (and (integerp n) ( n 0)))
 +(if (not (and (integerp n) (= n 0)))
  (user-error Invalid number of replications %s n))

 Nitpick: (unless (wholenump n) (user-error ...))

Thanks. Updated.

From fe596d7d9a2687f8f553997e2a75fe40f1424ef3 Mon Sep 17 00:00:00 2001
From: Kyle Meyer k...@kyleam.com
Date: Sun, 21 Jun 2015 21:46:54 -0400
Subject: [PATCH] org-clone-subtree-with-time-shift: Accept 0 clones

* lisp/org.el (org-clone-subtree-with-time-shift): Allow argument
  specifying number of clones to be 0.

* testing/lisp/test-org.el (test-org/clone-with-time-shift): Add
  tests.

This makes it possible to clone a subtree with a repeating timestamp
so that the repeater is removed from the original subtree and a single
shifted, repeating clone is created.  If the original subtree does not
have a repeating timestamp, no clones will be made.
---
 etc/ORG-NEWS |  4 
 lisp/org.el  | 11 ---
 testing/lisp/test-org.el | 38 ++
 3 files changed, 50 insertions(+), 3 deletions(-)

diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 92be86b..bcbd068 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -392,6 +392,10 @@ of tables and lists of listings can be inserted in the document with
 *** Countdown timer support hh:mm:ss format
 In addition to setting countdown timers in minutes, they can also be
 set using the hh:mm:ss format.
+*** Extend ~org-clone-subtree-with-time-shift~
+~org-clone-subtree-with-time-shift~ now accepts 0 as an argument for
+the number of clones, which removes the repeater from the original
+subtree and creates one shifted, repeating clone.
 ** Miscellaneous
 *** Strip all meta data from ITEM special property
 ITEM special property does not contain TODO, priority or tags anymore.
diff --git a/lisp/org.el b/lisp/org.el
index 8eaaa3e..02f5c22 100755
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -8739,7 +8739,12 @@ (defun org-clone-subtree-with-time-shift (n optional shift)
 - the start days in the repeater in the original entry will be shifted
   to past the last clone.
 In this way you can spell out a number of instances of a repeating task,
-and still retain the repeater to cover future instances of the task.
+and still retain the repeater to cover future instances of the task.
+
+As described above, N+1 clones are produced when the original
+subtree has a repeater.  Setting N to 0, then, can be used to
+remove the repeater from a subtree and create a shifted clone
+with the original repeater.
   (interactive nNumber of clones to produce: )
   (let ((shift
 	 (or shift
@@ -8757,8 +8762,8 @@ (defun org-clone-subtree-with-time-shift (n optional shift)
 	(org-clock-re (format ^[ \t]*%s.*$ org-clock-string))
 	beg end template task idprop
 	shift-n shift-what doshift nmin nmax)
-(if (not (and (integerp n) ( n 0)))
-	(user-error Invalid number of replications %s n))
+(unless (wholenump n)
+  (user-error Invalid number of replications %s n))
 (if (and (setq doshift (and (stringp shift) (string-match \\S- shift)))
 	 (not (string-match \\`[ \t]*\\+?\\([0-9]+\\)\\([hdwmy]\\)[ \t]*\\'
 shift)))
diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el
index 11004f0..55dbd49 100644
--- a/testing/lisp/test-org.el
+++ b/testing/lisp/test-org.el
@@ -1067,6 +1067,44 @@ (ert-deftest test-org/insert-todo-heading-respect-content ()
  (org-insert-todo-heading-respect-content)
  (and (eobp) (org-at-heading-p)
 
+(ert-deftest test-org/clone-with-time-shift ()
+  Test `org-clone-subtree-with-time-shift'.
+  ;; Clone non-repeating once.
+  (should
+   (equal \
+* H1\n2015-06-21 Sun
+* H1\n2015-06-23 Tue
+
+	  (org-test-with-temp-text * H1\n2015-06-21 Sun
+	(org-clone-subtree-with-time-shift 1 +2d)
+	(buffer-string
+  ;; Clone repeating once.
+  (should
+   (equal \
+* H1\n2015-06-21 Sun
+* H1\n2015-06-23 Tue
+* H1\n2015-06-25 Thu +1w
+
+	  (org-test-with-temp-text * H1\n2015-06-21 Sun +1w
+	(org-clone-subtree-with-time-shift 1 +2d)
+	(buffer-string
+  ;; Clone non-repeating zero times.
+  (should
+   (equal \
+* H1\n2015-06-21 Sun
+
+	  (org-test-with-temp-text * H1\n2015-06-21 Sun
+	(org-clone-subtree-with-time-shift 0 +2d)
+	(buffer-string
+  ;; Clone repeating zero times.
+  (should
+   (equal \
+* H1\n2015-06-21 Sun
+* H1\n2015-06-23 Tue +1w
+
+	  (org-test-with-temp-text * H1\n2015-06-21 Sun +1w
+	(org-clone-subtree-with-time-shift 0 +2d)
+	(buffer-string)
 
 
 ;;; Fixed-Width Areas
-- 
2.4.4


--
Kyle


Re: [O] [PATCH] org-clone-subtree-with-time-shift: Accept 0 clones

2015-06-22 Thread Nicolas Goaziou
Hello,

Kyle Meyer k...@kyleam.com writes:

 From 37a917e4f7e4d2c05355735ab08f1f555b9dc942 Mon Sep 17 00:00:00 2001
 From: Kyle Meyer k...@kyleam.com
 Date: Sun, 21 Jun 2015 21:46:54 -0400
 Subject: [PATCH] org-clone-subtree-with-time-shift: Accept 0 clones

Thank you for the patch.

 -(if (not (and (integerp n) ( n 0)))
 +(if (not (and (integerp n) (= n 0)))
   (user-error Invalid number of replications %s n))

Nitpick: (unless (wholenump n) (user-error ...))


Otherwise, looks good.


Regards,

-- 
Nicolas Goaziou



Re: [O] [PATCH] org-clone-subtree-with-time-shift: Accept 0 clones

2015-06-22 Thread Nicolas Goaziou
Kyle Meyer k...@kyleam.com writes:

 Thanks. Updated.

Applied, with a minor tweak on tests so they don't fail on non-English
systems.

Thank you.

Regards,



[O] [PATCH] org-clone-subtree-with-time-shift: Accept 0 clones

2015-06-21 Thread Kyle Meyer
Hello,

I'd like to clone a subtree with a repeating timestamp so that the
repeater is removed from the original subtree and a single shifted and
repeating clone is created.  I don't think this is currently possible
with org-clone-subtree-with-time-shift.  For example, running
org-clone-subtree-with-time-shift with 1 clone and a shift of +2d on

* sub
2015-06-21 Sun +1w

results in

* sub
2015-06-21 Sun
* sub
2015-06-23 Tue
* sub
2015-06-25 Thu +1w

This is inline with the docstring of org-clone-subtree-with-time-shift.
The one clone is the subtree in the middle, and the two flanking
subtrees are how a repeating timestamp is handled.

The attached patch allows the number of specified clones to be 0,
resulting in

* sub
2015-06-21 Sun
* sub
2015-06-23 Tue +1w

which is still consistent with the documented behavior.

From 37a917e4f7e4d2c05355735ab08f1f555b9dc942 Mon Sep 17 00:00:00 2001
From: Kyle Meyer k...@kyleam.com
Date: Sun, 21 Jun 2015 21:46:54 -0400
Subject: [PATCH] org-clone-subtree-with-time-shift: Accept 0 clones

* lisp/org.el (org-clone-subtree-with-time-shift): Allow argument
  specifying number of clones to be 0.

* testing/lisp/test-org.el (test-org/clone-with-time-shift): Add
  tests.

This makes it possible to clone a subtree with a repeating timestamp
so that the repeater is removed from the original subtree and a single
shifted, repeating clone is created.  If the original subtree does not
have a repeating timestamp, no clones will be made.
---
 etc/ORG-NEWS |  4 
 lisp/org.el  |  9 +++--
 testing/lisp/test-org.el | 38 ++
 3 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 92be86b..bcbd068 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -392,6 +392,10 @@ of tables and lists of listings can be inserted in the document with
 *** Countdown timer support hh:mm:ss format
 In addition to setting countdown timers in minutes, they can also be
 set using the hh:mm:ss format.
+*** Extend ~org-clone-subtree-with-time-shift~
+~org-clone-subtree-with-time-shift~ now accepts 0 as an argument for
+the number of clones, which removes the repeater from the original
+subtree and creates one shifted, repeating clone.
 ** Miscellaneous
 *** Strip all meta data from ITEM special property
 ITEM special property does not contain TODO, priority or tags anymore.
diff --git a/lisp/org.el b/lisp/org.el
index 7b720f8..25f8cd0 100755
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -8739,7 +8739,12 @@ (defun org-clone-subtree-with-time-shift (n optional shift)
 - the start days in the repeater in the original entry will be shifted
   to past the last clone.
 In this way you can spell out a number of instances of a repeating task,
-and still retain the repeater to cover future instances of the task.
+and still retain the repeater to cover future instances of the task.
+
+As described above, N+1 clones are produced when the original
+subtree has a repeater.  Setting N to 0, then, can be used to
+remove the repeater from a subtree and create a shifted clone
+with the original repeater.
   (interactive nNumber of clones to produce: )
   (let ((shift
 	 (or shift
@@ -8757,7 +8762,7 @@ (defun org-clone-subtree-with-time-shift (n optional shift)
 	(org-clock-re (format ^[ \t]*%s.*$ org-clock-string))
 	beg end template task idprop
 	shift-n shift-what doshift nmin nmax)
-(if (not (and (integerp n) ( n 0)))
+(if (not (and (integerp n) (= n 0)))
 	(user-error Invalid number of replications %s n))
 (if (and (setq doshift (and (stringp shift) (string-match \\S- shift)))
 	 (not (string-match \\`[ \t]*\\+?\\([0-9]+\\)\\([hdwmy]\\)[ \t]*\\'
diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el
index 04e0843..e8287a2 100644
--- a/testing/lisp/test-org.el
+++ b/testing/lisp/test-org.el
@@ -1067,6 +1067,44 @@ (ert-deftest test-org/insert-todo-heading-respect-content ()
  (org-insert-todo-heading-respect-content)
  (and (eobp) (org-at-heading-p)
 
+(ert-deftest test-org/clone-with-time-shift ()
+  Test `org-clone-subtree-with-time-shift'.
+  ;; Clone non-repeating once.
+  (should
+   (equal \
+* H1\n2015-06-21 Sun
+* H1\n2015-06-23 Tue
+
+	  (org-test-with-temp-text * H1\n2015-06-21 Sun
+	(org-clone-subtree-with-time-shift 1 +2d)
+	(buffer-string
+  ;; Clone repeating once.
+  (should
+   (equal \
+* H1\n2015-06-21 Sun
+* H1\n2015-06-23 Tue
+* H1\n2015-06-25 Thu +1w
+
+	  (org-test-with-temp-text * H1\n2015-06-21 Sun +1w
+	(org-clone-subtree-with-time-shift 1 +2d)
+	(buffer-string
+  ;; Clone non-repeating zero times.
+  (should
+   (equal \
+* H1\n2015-06-21 Sun
+
+	  (org-test-with-temp-text * H1\n2015-06-21 Sun
+	(org-clone-subtree-with-time-shift 0 +2d)
+	(buffer-string
+  ;; Clone repeating zero times.
+  (should
+   (equal \
+* H1\n2015-06-21 Sun
+* H1\n2015-06-23 Tue +1w
+
+	  (org-test-with-temp-text