aboutsummaryrefslogtreecommitdiff
path: root/dot_config/task
diff options
context:
space:
mode:
Diffstat (limited to 'dot_config/task')
-rw-r--r--dot_config/task/hooks/executable_on-modify.timewarrior110
-rw-r--r--dot_config/task/taskrc38
2 files changed, 148 insertions, 0 deletions
diff --git a/dot_config/task/hooks/executable_on-modify.timewarrior b/dot_config/task/hooks/executable_on-modify.timewarrior
new file mode 100644
index 0000000..b8663fd
--- /dev/null
+++ b/dot_config/task/hooks/executable_on-modify.timewarrior
@@ -0,0 +1,110 @@
+#!/usr/bin/env python3
+
+###############################################################################
+#
+# Copyright 2016 - 2021, 2023, Gothenburg Bit Factory
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+#
+# https://www.opensource.org/licenses/mit-license.php
+#
+###############################################################################
+
+import json
+import subprocess
+import sys
+
+# Hook should extract all the following for use as Timewarrior tags:
+# UUID
+# Project
+# Tags
+# Description
+# UDAs
+
+try:
+ input_stream = sys.stdin.buffer
+except AttributeError:
+ input_stream = sys.stdin
+
+
+def extract_tags_from(json_obj):
+ # Extract attributes for use as tags.
+ tags = [json_obj['description']]
+
+ if 'project' in json_obj:
+ tags.append(json_obj['project'])
+
+ if 'tags' in json_obj:
+ if type(json_obj['tags']) is str:
+ # Usage of tasklib (e.g. in taskpirate) converts the tag list into a string
+ # If this is the case, convert it back into a list first
+ # See https://github.com/tbabej/taskpirate/issues/11
+ tags.extend(json_obj['tags'].split(','))
+ else:
+ tags.extend(json_obj['tags'])
+
+ return tags
+
+
+def extract_annotation_from(json_obj):
+
+ if 'annotations' not in json_obj:
+ return '\'\''
+
+ return json_obj['annotations'][0]['description']
+
+
+def main(old, new):
+
+ start_or_stop = ''
+
+ # Started task.
+ if 'start' in new and 'start' not in old:
+ start_or_stop = 'start'
+
+ # Stopped task.
+ elif ('start' not in new or 'end' in new) and 'start' in old:
+ start_or_stop = 'stop'
+
+ if start_or_stop:
+ tags = extract_tags_from(new)
+
+ subprocess.call(['timew', start_or_stop] + tags + [':yes'])
+
+ # Modifications to task other than start/stop
+ elif 'start' in new and 'start' in old:
+ old_tags = extract_tags_from(old)
+ new_tags = extract_tags_from(new)
+
+ if old_tags != new_tags:
+ subprocess.call(['timew', 'untag', '@1'] + old_tags + [':yes'])
+ subprocess.call(['timew', 'tag', '@1'] + new_tags + [':yes'])
+
+ old_annotation = extract_annotation_from(old)
+ new_annotation = extract_annotation_from(new)
+
+ if old_annotation != new_annotation:
+ subprocess.call(['timew', 'annotate', '@1', new_annotation])
+
+
+if __name__ == "__main__":
+ old = json.loads(input_stream.readline().decode("utf-8", errors="replace"))
+ new = json.loads(input_stream.readline().decode("utf-8", errors="replace"))
+ print(json.dumps(new))
+ main(old, new)
diff --git a/dot_config/task/taskrc b/dot_config/task/taskrc
new file mode 100644
index 0000000..4ccfa53
--- /dev/null
+++ b/dot_config/task/taskrc
@@ -0,0 +1,38 @@
+# [Created by task 3.4.1 8/21/2025 09:11:38]
+news.version=3.4.1
+
+# To use the default location of the XDG directories,
+# move this configuration file from ~/.taskrc to ~/.config/task/taskrc and update location config as follows:
+
+data.location=~/.local/share/task
+hooks.location=~/.config/task/hooks
+
+# Color theme (uncomment one to use)
+#include light-16.theme
+include light-256.theme
+#include bubblegum-256.theme
+#include dark-16.theme
+#include dark-256.theme
+#include dark-red-256.theme
+#include dark-green-256.theme
+#include dark-blue-256.theme
+#include dark-violets-256.theme
+#include dark-yellow-green.theme
+#include dark-gray-256.theme
+#include dark-gray-blue-256.theme
+#include solarized-dark-256.theme
+#include solarized-light-256.theme
+#include no-color.theme
+
+default.command=tw
+
+#uda.gtd.type=string
+#uda.gtd.label=Status
+#uda.gtd.values=later,now,done
+
+report.tw.description=List of open tasks doing now
+report.tw.columns=id,depends,priority,project,tags,scheduled.countdown,due,until.remaining,description.count,urgency
+report.tw.labels=ID,Deps,Priority,Project,Tags,Scheduled,Due,Until,Description,Urg
+report.tw.sort=tags+/,urgency-,entry+,start-,due+,project+
+report.tw.filter=status:pending
+nag=