summary refs log tree commit diff
path: root/gnu
diff options
context:
space:
mode:
authorZac Berkowitz <zac.berkowitz@gmail.com>2023-01-28 10:47:43 +0100
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2023-01-28 11:01:00 +0100
commit2083bd052e9db8cfb32a6c3cf634c7817f49e009 (patch)
tree098a78b01bb98484f4cce5c30745d0efbb71547e /gnu
parent09ffaaa43649b110722357ded8bc619b9a5448a8 (diff)
downloadguix-2083bd052e9db8cfb32a6c3cf634c7817f49e009.tar.gz
gnu: Add timewarrior.
* gnu/packages/task-management.scm (timewarrior): New variable.
* gnu/packages/patches/timewarrior-time-sensitive-tests.patch: New file.
* gnu/local.mk (dist_patch_DATA): Register new file.

Signed-off-by: Nicolas Goaziou <mail@nicolasgoaziou.fr>
Diffstat (limited to 'gnu')
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/packages/patches/timewarrior-time-sensitive-tests.patch163
-rw-r--r--gnu/packages/task-management.scm53
3 files changed, 217 insertions, 0 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index 376ee715b9..7433654f0b 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1898,6 +1898,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/texlive-hyph-utf8-no-byebug.patch	\
   %D%/packages/patches/thefuck-test-environ.patch		\
   %D%/packages/patches/tidy-CVE-2015-5522+5523.patch		\
+  %D%/packages/patches/timewarrior-time-sensitive-tests.patch	\
   %D%/packages/patches/tinyxml-use-stl.patch			\
   %D%/packages/patches/tipp10-disable-downloader.patch		\
   %D%/packages/patches/tipp10-fix-compiling.patch		\
diff --git a/gnu/packages/patches/timewarrior-time-sensitive-tests.patch b/gnu/packages/patches/timewarrior-time-sensitive-tests.patch
new file mode 100644
index 0000000000..586d1aa261
--- /dev/null
+++ b/gnu/packages/patches/timewarrior-time-sensitive-tests.patch
@@ -0,0 +1,163 @@
+From: Gordon Ball <gordon@chronitis.net>
+Date: Sat, 23 Nov 2019 18:59:39 +0000
+Subject: skip tests which are sensitive to server time
+
+---
+ test/continue.t | 2 +-
+ test/export.t   | 1 +
+ test/help.t     | 1 +
+ test/lengthen.t | 1 +
+ test/move.t     | 2 ++
+ test/run_all    | 2 +-
+ test/shorten.t  | 1 +
+ test/summary.t  | 3 +++
+ test/tag.t      | 1 +
+ test/tags.t     | 1 +
+ 10 files changed, 13 insertions(+), 2 deletions(-)
+
+diff --git a/test/continue.t b/test/continue.t
+index 917699e..428f714 100755
+--- a/test/continue.t
++++ b/test/continue.t
+@@ -37,7 +37,7 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
+ 
+ from basetest import Timew, TestCase
+ 
+-
++@unittest.skip("Time-of-day sensitive")
+ class TestContinue(TestCase):
+     def setUp(self):
+         """Executed before each test in the class"""
+diff --git a/test/export.t b/test/export.t
+index c6726e6..8b511ff 100755
+--- a/test/export.t
++++ b/test/export.t
+@@ -62,6 +62,7 @@ class TestExport(TestCase):
+                                   expectedEnd=now_utc,
+                                   expectedTags=["foo"])
+ 
++    @unittest.skip("flaky")
+     def test_changing_exclusion_does_not_change_flattened_intervals(self):
+         """Changing exclusions does not change flattened intervals"""
+         now = datetime.now()
+diff --git a/test/help.t b/test/help.t
+index 786def0..9ecf5e6 100755
+--- a/test/help.t
++++ b/test/help.t
+@@ -58,6 +58,7 @@ class TestHelp(TestCase):
+         code, out2, err2 = self.t("-h")
+         self.assertEqual(out1, out2)
+ 
++    @unittest.skip("flaky")
+     def test_help_with_command_should_show_man_page(self):
+         """timew help with command should show man page"""
+         code, out, err = self.t("help start")
+diff --git a/test/lengthen.t b/test/lengthen.t
+index a6f1d77..f9ab54d 100755
+--- a/test/lengthen.t
++++ b/test/lengthen.t
+@@ -55,6 +55,7 @@ class TestLengthen(TestCase):
+         code, out, err = self.t.runError("lengthen @1 10mins")
+         self.assertIn('Cannot lengthen open interval @1', err)
+ 
++    @unittest.skip("time sensitive")
+     def test_lengthen_synthetic_interval(self):
+         """Lengthen a synthetic interval."""
+         now = datetime.now()
+diff --git a/test/move.t b/test/move.t
+index 2d7fdd9..b2336f5 100755
+--- a/test/move.t
++++ b/test/move.t
+@@ -145,6 +145,7 @@ class TestMove(TestCase):
+                                   expectedEnd="20170301T143000Z",
+                                   expectedTags=["bar"])
+ 
++    @unittest.skip("time sensitive")
+     def test_move_synthetic_interval_into_exclusion(self):
+         """Move a synthetic interval into exclusion"""
+         now = datetime.now()
+@@ -175,6 +176,7 @@ class TestMove(TestCase):
+                                 expectedTags=[],
+                                 description="unmodified interval")
+ 
++    @unittest.skip("time sensitive")
+     def test_move_synthetic_interval_away_from_exclusion(self):
+         """Move a synthetic interval away from exclusion"""
+         now = datetime.now()
+diff --git a/test/run_all b/test/run_all
+index ea7dd8f..afc6731 100755
+--- a/test/run_all
++++ b/test/run_all
+@@ -14,7 +14,7 @@ from queue import Queue, Empty
+ from subprocess import call, Popen, PIPE
+ from threading import Thread
+ 
+-TIMEOUT = .2
++TIMEOUT = 2.
+ 
+ 
+ def run_test(testqueue, outqueue, threadname):
+diff --git a/test/shorten.t b/test/shorten.t
+index 7058cc0..94e0067 100755
+--- a/test/shorten.t
++++ b/test/shorten.t
+@@ -69,6 +69,7 @@ class TestShorten(TestCase):
+         self.t("move @1 20170308T113000")
+         self.t("shorten @1 5min")  # Does not work.
+ 
++    @unittest.skip("time sensitive")
+     def test_shorten_synthetic_interval(self):
+         """Shorten a synthetic interval."""
+         now = datetime.now()
+diff --git a/test/summary.t b/test/summary.t
+index 6fd3352..f91e992 100755
+--- a/test/summary.t
++++ b/test/summary.t
+@@ -192,6 +192,7 @@ W10 2017-03-09 Thu @4 Tag1        8:43:08  9:38:15 0:55:07
+                                                            1:09:03
+ """, out)
+ 
++    @unittest.skip("fails w1-9")
+     def test_with_all_hint(self):
+         """Summary should work with :all hint"""
+         now = datetime.now()
+@@ -236,6 +237,7 @@ W{5} {2:%Y-%m-%d} {2:%a} @1 BAZ  10:00:00 11:00:00 1:00:00 1:00:00
+         self.assertIn("@1", out)
+         self.assertRegex(out, r'\s{30}0:00:02')
+ 
++    @unittest.skip("fails w1-9")
+     def test_with_named_date_yesterday(self):
+         """Summary should work with 'yesterday'"""
+         now = datetime.now()
+@@ -260,6 +262,7 @@ W{1} {0:%Y-%m-%d} {0:%a} @3 FOO  10:00:00 11:00:00 1:00:00 1:00:00
+ {2}                                                    1:00:00
+ """.format(yesterday, week_yesterday, " " if two_digit_week is True else "", "-" if two_digit_week is True else ""), out)
+ 
++    @unittest.skip("fails w1-9")
+     def test_with_named_date_today(self):
+         """Summary should work with 'today'"""
+         now = datetime.now()
+diff --git a/test/tag.t b/test/tag.t
+index 8b2f847..21b8c16 100755
+--- a/test/tag.t
++++ b/test/tag.t
+@@ -178,6 +178,7 @@ class TestTag(TestCase):
+         self.assertClosedInterval(j[0], expectedTags=["bar", "foo", "one"])
+         self.assertClosedInterval(j[1], expectedTags=["bar", "foo", "two"])
+ 
++    @unittest.skip("time sensitive")
+     def test_tag_synthetic_interval(self):
+         """Tag a synthetic interval."""
+         now = datetime.now()
+diff --git a/test/tags.t b/test/tags.t
+index 6cfe143..4f84d06 100755
+--- a/test/tags.t
++++ b/test/tags.t
+@@ -63,6 +63,7 @@ class TestTags(TestCase):
+         self.assertIn('foo', out)
+         self.assertIn('bar', out)
+ 
++    @unittest.skip("time sensitive")
+     def test_tags_filtered(self):
+         """Test that tags command filtering excludes tags that are outside the filter range"""
+         self.t("track 20160101T0100 - 20160101T1000 foo")
diff --git a/gnu/packages/task-management.scm b/gnu/packages/task-management.scm
index c4f7f99049..29515c6eb9 100644
--- a/gnu/packages/task-management.scm
+++ b/gnu/packages/task-management.scm
@@ -29,6 +29,7 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix gexp)
   #:use-module (guix packages)
+  #:use-module (gnu packages)
   #:use-module (gnu packages check)
   #:use-module (gnu packages freedesktop)
   #:use-module (gnu packages gettext)
@@ -46,6 +47,7 @@
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages qt)
   #:use-module (gnu packages readline)
+  #:use-module (gnu packages ruby)
   #:use-module (gnu packages time)
   #:use-module (gnu packages tls)
   #:use-module (guix download)
@@ -181,6 +183,57 @@ environment for list management. It has a review feature, shell command
 execution, and libreadline support.")
     (license license:expat)))
 
+(define-public timewarrior
+  (package
+    (name "timewarrior")
+    (version "1.4.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://github.com/GothenburgBitFactory/timewarrior/releases/download/v" version
+             "/timew-" version ".tar.gz"))
+       (patches (search-patches "timewarrior-time-sensitive-tests.patch"))
+       (sha256 (base32
+                "0lyaqzcg8np2fpsmih0hlkjxd3qbadc7khr24m1pq9lsdhq7xpy4"))))
+    (build-system cmake-build-system)
+    (arguments
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'patch-source-shebangs 'patch-cmake-shell
+            (lambda _
+              (substitute* "src/commands/CMakeLists.txt"
+                (("/bin/sh") "sh"))))
+          ;; Fix out of source building of manual pages
+          (add-after 'patch-source-shebangs 'patch-man-cmake
+            (lambda _
+              (substitute* "doc/man1/CMakeLists.txt"
+                (("\\$\\{CMAKE_CURRENT_BINARY_DIR\\}")
+                 "${CMAKE_CURRENT_SOURCE_DIR}"))
+              (substitute* "doc/man7/CMakeLists.txt"
+                (("\\$\\{CMAKE_CURRENT_BINARY_DIR\\}")
+                 "${CMAKE_CURRENT_SOURCE_DIR}"))))
+          (add-after 'install 'install-completions
+            (lambda _
+              (let ((bash-completion-install-dir
+                     (string-append #$output "/etc/bash_completion.d")))
+                (mkdir-p bash-completion-install-dir)
+                (copy-file
+                 "../timew-1.4.3/completion/timew-completion.bash"
+                 (string-append bash-completion-install-dir "/timew"))))))))
+    (native-inputs
+     (list ruby-asciidoctor))
+    (inputs
+     (list gnutls python `(,util-linux "lib")))
+    (home-page "https://timewarrior.net")
+    (synopsis "Command line utility to track and report time")
+    (description
+     "Timewarrior is a command line time tracking application, which allows
+you to record time spent on activities.  You may be tracking your time for
+curiosity, or because your work requires it.")
+    (license license:expat)))
+
 (define-public worklog
   (let ((commit "0f545ad6697ef4de7f68d92cd7cc5c6a4c60517b")
         (revision "1"))