diff --git a/.config/task/hooks/on-modify.timewarrior b/.config/task/hooks/on-modify.timewarrior new file mode 100755 index 0000000..4d08c46 --- /dev/null +++ b/.config/task/hooks/on-modify.timewarrior @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +'''Timewarrior on-modify hook to call timew on start,stop, done commands.''' +import json +import shlex +import subprocess +import sys + +def retrieve_args_dict(): + '''Read process arguments and store them in a dictionary.''' + process_args = sys.argv[1:] + dictionary = dict() + for process_arg in process_args: + splitted = process_arg.split(':') + if len(splitted) > 1: + key = splitted[0] + value = ''.join(splitted[1:]) + dictionary[key] = value + return dictionary + +def determine_timew_tags(task): + '''Determine which timew "tags" should be used for the task.''' + tags = list() + + # Keys associated with one value + for key in ['uuid', 'project', 'description']: + if key in task: + tags.append('{}:{}'.format(key, task[key])) + + # Keys associated with several values + if 'tags' in task: + for value in task['tags']: + tags.append('tag:{}'.format(value)) + + return tags + +def generate_timew_command(cmd, tags): + '''Generate an input for subprocess.call.''' + tags_as_string = ' '.join([shlex.quote(tag) for tag in tags]) + if cmd == 'done': + cmd = 'stop' + cmd_string = f'timew {cmd} {tags_as_string} :yes' + return shlex.split(cmd_string) + +def main(): + '''Main function of this module.''' + old_task = json.loads(sys.stdin.readline()) + new_task = json.loads(sys.stdin.readline()) + args = retrieve_args_dict() + + # Do something. + feedback = None + if 'api' in args: # Only do something for known API. + if args['api'] in ['2']: # APIs that give us a 'command' key. + cmd = args['command'] + if cmd in ['start', 'stop', 'done']: # Only do something on 'start', 'stop' or 'done' + timew_tags = determine_timew_tags(new_task) + timew_cmd = generate_timew_command(cmd, timew_tags) + subprocess.call(timew_cmd) + + # Generate output as task expects it. + print(json.dumps(new_task)) + if feedback is not None: + print(feedback) + sys.exit(0) + +if __name__ == "__main__": + main() diff --git a/.config/task/taskrc b/.config/task/taskrc new file mode 100644 index 0000000..e8e065b --- /dev/null +++ b/.config/task/taskrc @@ -0,0 +1,47 @@ +# [Created by task 2.6.2 12/23/2023 17:46:47] +# Taskwarrior program configuration file. +# For more documentation, see https://taskwarrior.org or try 'man task', 'man task-color', +# 'man task-sync' or 'man taskrc' + +# Here is an example of entries that use the default, override and blank values +# variable=foo -- By specifying a value, this overrides the default +# variable= -- By specifying no value, this means no default +# #variable=foo -- By commenting out the line, or deleting it, this uses the default + +# You can also refence environment variables: +# variable=$HOME/task +# variable=$VALUE + +# Use the command 'task show' to see all defaults and overrides + +# data.location=/home/sahin/.task + +# To use the default location of the XDG directories, +# move this configuration file from ~/.taskrc to ~/.config/task/taskrc and uncomment below + +# Files +include holidays.tr-TR.rc +data.location=~/.local/share/task +hooks.location=~/.config/task/hooks + + + +# Color theme (uncomment one to use) +include solarized-dark-256.theme +#include dark-16.theme +#include light-16.theme +#include light-256.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-light-256.theme +#include no-color.theme + +news.version=2.6.0 +# +color.calendar.holiday=black on yellow