Add the autoSync config property to automatically sync contexts after relevant issues change.

This commit is contained in:
Jonathan Bernard 2025-01-11 11:58:47 -06:00
parent 0361d1b869
commit 76225d1c50
3 changed files with 27 additions and 5 deletions

View File

@ -81,6 +81,7 @@ when isMainModule:
trace "context initiated" trace "context initiated"
var updatedIssues = newSeq[Issue]()
var propertiesOption = none(TableRef[string,string]) var propertiesOption = none(TableRef[string,string])
var exclPropsOption = none(TableRef[string,seq[string]]) var exclPropsOption = none(TableRef[string,seq[string]])
var tagsOption = none(seq[string]) var tagsOption = none(seq[string])
@ -136,7 +137,7 @@ when isMainModule:
else: newSeq[string]()) else: newSeq[string]())
ctx.cfg.tasksDir.store(issue, state) ctx.cfg.tasksDir.store(issue, state)
updatedIssues.add(issue)
stdout.writeLine formatIssue(issue) stdout.writeLine formatIssue(issue)
elif args["reorder"]: elif args["reorder"]:
@ -163,6 +164,7 @@ when isMainModule:
for k,v in propsOption.get: for k,v in propsOption.get:
issue[k] = v issue[k] = v
edit(issue) edit(issue)
updatedIssues.add(issue)
else: else:
let issue = ctx.cfg.tasksDir.loadIssueById(editRef) let issue = ctx.cfg.tasksDir.loadIssueById(editRef)
@ -170,6 +172,7 @@ when isMainModule:
for k,v in propertiesOption.get: for k,v in propertiesOption.get:
issue[k] = v issue[k] = v
edit(issue) edit(issue)
updatedIssues.add(issue)
elif args["tag"]: elif args["tag"]:
if tagsOption.isNone: raise newException(Exception, "no tags given") if tagsOption.isNone: raise newException(Exception, "no tags given")
@ -180,6 +183,7 @@ when isMainModule:
var issue = ctx.cfg.tasksDir.loadIssueById(id) var issue = ctx.cfg.tasksDir.loadIssueById(id)
issue.tags = deduplicate(issue.tags & newTags) issue.tags = deduplicate(issue.tags & newTags)
issue.store() issue.store()
updatedIssues.add(issue)
elif args["untag"]: elif args["untag"]:
let tagsToRemove: seq[string] = let tagsToRemove: seq[string] =
@ -193,6 +197,7 @@ when isMainModule:
proc (tag: string): bool = not tagsToRemove.anyIt(it == tag)) proc (tag: string): bool = not tagsToRemove.anyIt(it == tag))
else: issue.tags = @[] else: issue.tags = @[]
issue.store() issue.store()
updatedIssues.add(issue)
elif args["start"] or args["todo-today"] or args["done"] or elif args["start"] or args["todo-today"] or args["done"] or
args["pending"] or args["todo"] or args["suspend"]: args["pending"] or args["todo"] or args["suspend"]:
@ -216,10 +221,12 @@ when isMainModule:
let nextIssue = ctx.cfg.tasksDir.nextRecurrence(issue.getRecurrence.get, issue) let nextIssue = ctx.cfg.tasksDir.nextRecurrence(issue.getRecurrence.get, issue)
ctx.cfg.tasksDir.store(nextIssue, TodoToday) ctx.cfg.tasksDir.store(nextIssue, TodoToday)
info "created the next recurrence:" info "created the next recurrence:"
updatedIssues.add(nextIssue)
stdout.writeLine formatIssue(nextIssue) stdout.writeLine formatIssue(nextIssue)
issue.changeState(ctx.cfg.tasksDir, targetState) issue.changeState(ctx.cfg.tasksDir, targetState)
updatedIssues.add(issue)
if ctx.triggerPtk or args["--ptk"]: if ctx.triggerPtk or args["--ptk"]:
if targetState == Current: if targetState == Current:
@ -244,6 +251,7 @@ when isMainModule:
issue.setDateTime("hide-until", parseDate($args["<date>"])) issue.setDateTime("hide-until", parseDate($args["<date>"]))
issue.store() issue.store()
updatedIssues.add(issue)
elif args["delegate"]: elif args["delegate"]:
@ -251,6 +259,7 @@ when isMainModule:
issue["delegated-to"] = $args["<delegated-to>"] issue["delegated-to"] = $args["<delegated-to>"]
issue.store() issue.store()
updatedIssues.add(issue)
elif args["delete"] or args["rm"]: elif args["delete"] or args["rm"]:
for id in @(args["<id>"]): for id in @(args["<id>"]):
@ -263,6 +272,7 @@ when isMainModule:
continue continue
issue.delete issue.delete
updatedIssues.add(issue)
elif args["list"]: elif args["list"]:
@ -385,6 +395,7 @@ when isMainModule:
finally: close(propIn) finally: close(propIn)
issue.store() issue.store()
updatedIssues.add(issue)
elif args["get-binary-property"]: elif args["get-binary-property"]:
let issue = ctx.cfg.tasksDir.loadIssueById($(args["<id>"])) let issue = ctx.cfg.tasksDir.loadIssueById($(args["<id>"]))
@ -425,6 +436,15 @@ when isMainModule:
sync(syncCtx, args["--dry-run"]) sync(syncCtx, args["--dry-run"])
# after doing stuff, sync if auto-sync is requested
if ctx.cfg.autoSync:
for syncTarget in ctx.cfg.syncTargets:
let syncCtx = initSyncContext(ctx.cfg, syncTarget)
if anyIt(
updatedIssues,
it.hasProp("context") and it["context"] == syncCtx.issueContext):
sync(syncCtx, false)
except CatchableError: except CatchableError:
fatal getCurrentExceptionMsg() fatal getCurrentExceptionMsg()
debug getCurrentException().getStackTrace() debug getCurrentException().getStackTrace()

View File

@ -33,6 +33,7 @@ type
PitConfig* = ref object PitConfig* = ref object
tasksDir*: string tasksDir*: string
contexts*: TableRef[string, string] contexts*: TableRef[string, string]
autoSync*: bool
syncTargets*: seq[JsonNode] syncTargets*: seq[JsonNode]
cfg*: CombinedConfig cfg*: CombinedConfig
@ -459,6 +460,7 @@ proc loadConfig*(args: Table[string, Value] = initTable[string, Value]()): PitCo
result = PitConfig( result = PitConfig(
cfg: cfg, cfg: cfg,
autoSync: parseBool(cfg.getVal("auto-sync", "false")),
contexts: newTable[string,string](), contexts: newTable[string,string](),
tasksDir: cfg.getVal("tasks-dir", ""), tasksDir: cfg.getVal("tasks-dir", ""),
syncTargets: cfg.getJson("sync-targets", newJArray()).getElems) syncTargets: cfg.getJson("sync-targets", newJArray()).getElems)

View File

@ -4,11 +4,11 @@ import timeutils, uuids, zero_functional
import ./formatting, ./libpit import ./formatting, ./libpit
type type
PbmVsbSyncContext = object PbmVsbSyncContext* = object
apiBaseUrl*: string
apiToken*: string
issueContext*: string
pit: PitConfig pit: PitConfig
apiBaseUrl: string
apiToken: string
issueContext: string
http: HttpClient http: HttpClient
ServerTask* = object ServerTask* = object