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/hooks/executable_on-modify.timewarrior | |
| parent | ff8f50638e4b17a9d7cc88d2f0d9560b7effce39 (diff) | |
Migrate from stow
Diffstat (limited to 'dot_config/task/hooks/executable_on-modify.timewarrior')
| -rw-r--r-- | dot_config/task/hooks/executable_on-modify.timewarrior | 110 |
1 files changed, 110 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) |