diff options
| author | twells46 <173561638+twells46@users.noreply.github.com> | 2025-12-31 13:28:05 -0600 |
|---|---|---|
| committer | twells46 <173561638+twells46@users.noreply.github.com> | 2025-12-31 13:28:05 -0600 |
| commit | 2140ab51deed88e90eafebf9520fa5f9995dc7c9 (patch) | |
| tree | 03cf1dcd2900495c1efb79aaa85f3254ecd5fb87 /dot_config/task | |
| parent | ff8f50638e4b17a9d7cc88d2f0d9560b7effce39 (diff) | |
Migrate from stow
Diffstat (limited to 'dot_config/task')
| -rw-r--r-- | dot_config/task/hooks/executable_on-modify.timewarrior | 110 | ||||
| -rw-r--r-- | dot_config/task/taskrc | 38 |
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= |