refactor(taskwarrior): nixify
This commit is contained in:
@@ -1,2 +0,0 @@
|
|||||||
taskrc.d/sync
|
|
||||||
taskrc.d/private
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
include ./taskrc.d/aliases
|
|
||||||
include ./taskrc.d/urgency
|
|
||||||
include ./taskrc.d/reports
|
|
||||||
include ./taskrc.d/contexts
|
|
||||||
include ./taskrc.d/colors
|
|
||||||
include ./taskrc.d/udas
|
|
||||||
|
|
||||||
search.case.sensitive=no
|
|
||||||
|
|
||||||
rc.json.array=on
|
|
||||||
rc.verbose=nothing
|
|
||||||
news.version=3.4.2
|
|
||||||
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
alias.burndown=burndown.daily
|
|
||||||
alias.a=add
|
|
||||||
alias.rm=delete
|
|
||||||
alias.e=modify
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
color.active=bold white on black
|
|
||||||
color.alternate=
|
|
||||||
color.scheduled=
|
|
||||||
color.until=
|
|
||||||
color.blocking=bold
|
|
||||||
color.blocked=gray15
|
|
||||||
color.uda.priority.H=bold
|
|
||||||
color.uda.priority.M=
|
|
||||||
color.uda.priority.L=
|
|
||||||
color.due=
|
|
||||||
color.due.today=
|
|
||||||
color.overdue=
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
context.home.read=project:home
|
|
||||||
context.work.read=tags:work
|
|
||||||
context.home.write=project:home
|
|
||||||
context.studies.read=project:studies
|
|
||||||
context.studies.write=project:studies
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
include /usr/share/doc/task/rc/light-256.theme
|
|
||||||
|
|
||||||
include ./locations
|
|
||||||
include ./sync
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
data.location=$XDG_DATA_HOME/task/
|
|
||||||
hooks.location=$XDG_DATA_HOME/task/hooks
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
# The default report is `next`, to obtain details on a report
|
|
||||||
# (e.g. the columns used), the following command can be used:
|
|
||||||
#
|
|
||||||
# `task _get rc.report.<report_name>.columns`
|
|
||||||
|
|
||||||
report.next.columns=id,start.age,entry.age,depends,project,tags,scheduled.countdown,due.relative,until.remaining,description
|
|
||||||
report.next.labels=ID,Active,Age,Deps,Project,Tag,S,Due,Until,Description
|
|
||||||
report.next.filter=status:pending -WAITING -BLOCKED limit:page
|
|
||||||
|
|
||||||
report.in.columns=id,description
|
|
||||||
report.in.labels=ID,Description
|
|
||||||
report.in.description=Inbox (untagged)
|
|
||||||
report.in.filter=status:pending tags.none:
|
|
||||||
report.in.sort=entry+
|
|
||||||
|
|
||||||
report.recent.columns=id,description,entry
|
|
||||||
report.recent.labels=ID,Description,Age
|
|
||||||
report.recent.description=Recently added
|
|
||||||
report.recent.sort=entry+
|
|
||||||
|
|
||||||
report.minimal.columns=id,description
|
|
||||||
report.minimal.labels=,
|
|
||||||
|
|
||||||
# verbose=blank,header,footnote,label,new-id,affected,edit,special,project,unwait
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
sync.server.url=
|
|
||||||
sync.server.client_id=
|
|
||||||
sync.encryption_secret=
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
uda.url.type=string
|
|
||||||
uda.url.label=URL
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
urgency.uda.priority.L.coefficient=-1.0
|
|
||||||
|
|
||||||
urgency.user.project.studies.coefficient=1.0
|
|
||||||
urgency.user.project.admin.coefficient=1.0
|
|
||||||
urgency.user.project.personal.coefficient=0.5
|
|
||||||
urgency.user.project.groceries.coefficient=0.5
|
|
||||||
urgency.user.project.home.coefficient=0.2
|
|
||||||
urgency.user.project.creative.coefficient=0.0
|
|
||||||
urgency.user.project.side.coefficient=0.0
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
# Source: <https://gist.github.com/danmou/83079feac22307813178d7f8c456c544>
|
|
||||||
|
|
||||||
# This hooks script syncs task warrior to the configured task server without blocking.
|
|
||||||
# The on-exit event is triggered once, after all processing is complete.
|
|
||||||
|
|
||||||
# Make sure hooks are enabled and this hook script is executable.
|
|
||||||
# Run `task diag` for diagnostics on the hook.
|
|
||||||
|
|
||||||
import json
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
|
|
||||||
try:
|
|
||||||
tasks = json.loads(sys.stdin.readline())
|
|
||||||
except:
|
|
||||||
# No input
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Call the `sync` command
|
|
||||||
# hooks=0 ensures that the sync command doesn't call the on-exit hook
|
|
||||||
# verbose=nothing sets the verbosity to print nothing at all
|
|
||||||
|
|
||||||
ps_1 = subprocess.Popen(
|
|
||||||
["task", "rc.hooks=0", "sync"],
|
|
||||||
stdin=subprocess.PIPE,
|
|
||||||
stdout=subprocess.DEVNULL,
|
|
||||||
stderr=subprocess.DEVNULL,
|
|
||||||
)
|
|
||||||
|
|
||||||
sys.exit(0)
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Redirect both stdout and stderr to notify-send as is, but set
|
|
||||||
# urgency to critical if the command fails
|
|
||||||
output="$(task rc.hooks=0 sync 2>&1)"
|
|
||||||
ret=$?
|
|
||||||
if [ $ret -ne 0 ]; then
|
|
||||||
urgency=critical
|
|
||||||
else
|
|
||||||
urgency=normal
|
|
||||||
fi
|
|
||||||
notify-send -u $urgency "Taskwarrior sync" "$output"
|
|
||||||
@@ -2,7 +2,6 @@
|
|||||||
config,
|
config,
|
||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
dotsPath,
|
|
||||||
myUtils,
|
myUtils,
|
||||||
osConfig ? null,
|
osConfig ? null,
|
||||||
inputs ? null,
|
inputs ? null,
|
||||||
@@ -13,6 +12,52 @@ let
|
|||||||
cfg = config.taskwarrior;
|
cfg = config.taskwarrior;
|
||||||
sops = myUtils.sopsAvailability config osConfig;
|
sops = myUtils.sopsAvailability config osConfig;
|
||||||
standalone = osConfig == null;
|
standalone = osConfig == null;
|
||||||
|
|
||||||
|
syncHook = pkgs.writers.writePython3 "on-exit.sync.py" { flakeIgnore = [ "E501" ]; } ''
|
||||||
|
# Source: <https://gist.github.com/danmou/83079feac22307813178d7f8c456c544>
|
||||||
|
|
||||||
|
# This hook syncs Taskwarrior to the configured task server without blocking.
|
||||||
|
# The on-exit event is triggered once, after all processing is complete.
|
||||||
|
|
||||||
|
import json
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
try:
|
||||||
|
json.loads(sys.stdin.readline())
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
# No input
|
||||||
|
pass
|
||||||
|
|
||||||
|
# hooks=0 ensures that the sync command doesn't call the on-exit hook.
|
||||||
|
# verbose=nothing sets the verbosity to print nothing at all.
|
||||||
|
subprocess.Popen(
|
||||||
|
["${lib.getExe pkgs.taskwarrior3}", "rc.hooks=0", "sync"],
|
||||||
|
stdin=subprocess.PIPE,
|
||||||
|
stdout=subprocess.DEVNULL,
|
||||||
|
stderr=subprocess.DEVNULL,
|
||||||
|
)
|
||||||
|
|
||||||
|
sys.exit(0)
|
||||||
|
'';
|
||||||
|
|
||||||
|
syncAndNotify = pkgs.writeShellApplication {
|
||||||
|
name = "sync-and-notify";
|
||||||
|
runtimeInputs = [
|
||||||
|
pkgs.libnotify
|
||||||
|
pkgs.taskwarrior3
|
||||||
|
];
|
||||||
|
text = ''
|
||||||
|
# Redirect both stdout and stderr to notify-send as is, but set
|
||||||
|
# urgency to critical if the command fails.
|
||||||
|
if output="$(task rc.hooks=0 sync 2>&1)"; then
|
||||||
|
urgency=normal
|
||||||
|
else
|
||||||
|
urgency=critical
|
||||||
|
fi
|
||||||
|
notify-send -u "$urgency" "Taskwarrior sync" "$output"
|
||||||
|
'';
|
||||||
|
};
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
options.taskwarrior.enable = lib.mkEnableOption "taskwarrior";
|
options.taskwarrior.enable = lib.mkEnableOption "taskwarrior";
|
||||||
@@ -42,39 +87,85 @@ in
|
|||||||
lib.optional (!sops.available)
|
lib.optional (!sops.available)
|
||||||
"taskwarrior is enabled, but sops templates are not available. taskwarrior sync will not be configured.";
|
"taskwarrior is enabled, but sops templates are not available. taskwarrior sync will not be configured.";
|
||||||
|
|
||||||
home.packages = with pkgs; [
|
home.packages = [ pkgs.taskopen ];
|
||||||
libnotify
|
|
||||||
taskopen
|
|
||||||
python3
|
|
||||||
];
|
|
||||||
|
|
||||||
home.file = {
|
home.file = {
|
||||||
".config/task/taskrc" = {
|
".config/task/taskrc".text = ''
|
||||||
force = true;
|
include ${config.xdg.configHome}/task/home-manager-taskrc
|
||||||
source = dotsPath + "/.config/task/taskrc";
|
'';
|
||||||
};
|
".local/share/task/hooks/on-exit.sync.py".source = syncHook;
|
||||||
".config/task/taskrc.d/aliases".source = dotsPath + "/.config/task/taskrc.d/aliases";
|
".local/share/task/scripts/sync-and-notify.sh".source = lib.getExe syncAndNotify;
|
||||||
".config/task/taskrc.d/colors".source = dotsPath + "/.config/task/taskrc.d/colors";
|
|
||||||
".config/task/taskrc.d/contexts".source = dotsPath + "/.config/task/taskrc.d/contexts";
|
|
||||||
".config/task/taskrc.d/reports".source = dotsPath + "/.config/task/taskrc.d/reports";
|
|
||||||
".config/task/taskrc.d/udas".source = dotsPath + "/.config/task/taskrc.d/udas";
|
|
||||||
".config/task/taskrc.d/urgency".source = dotsPath + "/.config/task/taskrc.d/urgency";
|
|
||||||
".local/share/task/hooks/on-exit.sync.py" = {
|
|
||||||
source = dotsPath + "/.local/share/task/hooks/on-exit.sync.py";
|
|
||||||
};
|
|
||||||
".local/share/task/scripts/sync-and-notify.sh" = {
|
|
||||||
source = dotsPath + "/.local/share/task/scripts/sync-and-notify.sh";
|
|
||||||
executable = true;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
programs.taskwarrior = with pkgs; {
|
programs.taskwarrior = {
|
||||||
enable = true;
|
enable = true;
|
||||||
package = taskwarrior3;
|
package = pkgs.taskwarrior3;
|
||||||
colorTheme = "dark-256";
|
colorTheme = "dark-256";
|
||||||
config = {
|
config = {
|
||||||
recurrence = "off";
|
# taskrc.d/aliases
|
||||||
reserved.lines = 3;
|
"alias.a" = "add";
|
||||||
|
"alias.burndown" = "burndown.daily";
|
||||||
|
"alias.e" = "modify";
|
||||||
|
"alias.rm" = "delete";
|
||||||
|
|
||||||
|
# taskrc.d/colors
|
||||||
|
"color.active" = "bold white on black";
|
||||||
|
"color.alternate" = "";
|
||||||
|
"color.blocked" = "gray15";
|
||||||
|
"color.blocking" = "bold";
|
||||||
|
"color.due" = "";
|
||||||
|
"color.due.today" = "";
|
||||||
|
"color.overdue" = "";
|
||||||
|
"color.scheduled" = "";
|
||||||
|
"color.uda.priority.H" = "bold";
|
||||||
|
"color.uda.priority.L" = "";
|
||||||
|
"color.uda.priority.M" = "";
|
||||||
|
"color.until" = "";
|
||||||
|
|
||||||
|
# taskrc.d/contexts
|
||||||
|
"context.home.read" = "project:home";
|
||||||
|
"context.home.write" = "project:home";
|
||||||
|
"context.studies.read" = "project:studies";
|
||||||
|
"context.studies.write" = "project:studies";
|
||||||
|
"context.work.read" = "tags:work";
|
||||||
|
|
||||||
|
# taskrc.d/reports
|
||||||
|
"report.in.columns" = "id,description";
|
||||||
|
"report.in.description" = "Inbox (untagged)";
|
||||||
|
"report.in.filter" = "status:pending tags.none:";
|
||||||
|
"report.in.labels" = "ID,Description";
|
||||||
|
"report.in.sort" = "entry+";
|
||||||
|
"report.minimal.columns" = "id,description";
|
||||||
|
"report.minimal.labels" = ",";
|
||||||
|
"report.next.columns" =
|
||||||
|
"id,start.age,entry.age,depends,project,tags,scheduled.countdown,due.relative,until.remaining,description";
|
||||||
|
"report.next.filter" = "status:pending -WAITING -BLOCKED limit:page";
|
||||||
|
"report.next.labels" = "ID,Active,Age,Deps,Project,Tag,S,Due,Until,Description";
|
||||||
|
"report.recent.columns" = "id,description,entry";
|
||||||
|
"report.recent.description" = "Recently added";
|
||||||
|
"report.recent.labels" = "ID,Description,Age";
|
||||||
|
"report.recent.sort" = "entry+";
|
||||||
|
|
||||||
|
# taskrc.d/udas
|
||||||
|
"uda.url.label" = "URL";
|
||||||
|
"uda.url.type" = "string";
|
||||||
|
|
||||||
|
# taskrc.d/urgency
|
||||||
|
"urgency.uda.priority.L.coefficient" = "-1.0";
|
||||||
|
"urgency.user.project.admin.coefficient" = "1.0";
|
||||||
|
"urgency.user.project.creative.coefficient" = "0.0";
|
||||||
|
"urgency.user.project.groceries.coefficient" = "0.5";
|
||||||
|
"urgency.user.project.home.coefficient" = "0.2";
|
||||||
|
"urgency.user.project.personal.coefficient" = "0.5";
|
||||||
|
"urgency.user.project.side.coefficient" = "0.0";
|
||||||
|
"urgency.user.project.studies.coefficient" = "1.0";
|
||||||
|
|
||||||
|
# misc
|
||||||
|
"news.version" = "3.4.2";
|
||||||
|
"rc.json.array" = "on";
|
||||||
|
"rc.verbose" = "nothing";
|
||||||
|
"search.case.sensitive" = "no";
|
||||||
|
"recurrence" = "off";
|
||||||
|
"reserved.lines" = "3";
|
||||||
};
|
};
|
||||||
extraConfig = lib.optionalString sops.available ''
|
extraConfig = lib.optionalString sops.available ''
|
||||||
include ${sops.templates."taskrc.d/sync".path}
|
include ${sops.templates."taskrc.d/sync".path}
|
||||||
|
|||||||
Reference in New Issue
Block a user