diff --git a/pit.nimble b/pit.nimble index 59ac2ea..c57aeae 100644 --- a/pit.nimble +++ b/pit.nimble @@ -1,6 +1,6 @@ # Package -version = "4.21.2" +version = "4.22.0" author = "Jonathan Bernard" description = "Personal issue tracker." license = "MIT" diff --git a/src/pit.nim b/src/pit.nim index 5257d40..7d95f13 100644 --- a/src/pit.nim +++ b/src/pit.nim @@ -16,7 +16,6 @@ type cfg*: PitConfig contexts*: TableRef[string, string] defaultContext*: Option[string] - tasksDir*: string issues*: TableRef[IssueState, seq[Issue]] termWidth*: int triggerPtk*, verbose*: bool @@ -43,7 +42,6 @@ proc initContext(args: Table[string, Value]): CliContext = else: some(cliJson["defaultContext"].getStr()), verbose: parseBool(cliCfg.getVal("verbose", "false")) and not args["--quiet"], issues: newTable[IssueState, seq[Issue]](), - tasksDir: pitCfg.tasksDir, termWidth: parseInt(cliCfg.getVal("termWidth", "80")), triggerPtk: cliJson.getOrDefault("triggerPtk").getBool(false)) @@ -169,15 +167,14 @@ proc formatSection(ctx: CliContext, issues: seq[Issue], state: IssueState, else: result &= ctx.formatSectionIssueList(issues, innerWidth, indent, verbose) proc loadIssues(ctx: CliContext, state: IssueState) = - ctx.issues[state] = loadIssues(ctx.tasksDir / $state) + ctx.issues[state] = loadIssues(ctx.cfg.tasksDir, state) proc loadOpenIssues(ctx: CliContext) = ctx.issues = newTable[IssueState, seq[Issue]]() for state in [Current, TodoToday, Todo, Pending, Todo]: ctx.loadIssues(state) proc loadAllIssues(ctx: CliContext) = - ctx.issues = newTable[IssueState, seq[Issue]]() - for state in IssueState: ctx.loadIssues(state) + ctx.issues = ctx.cfg.tasksDir.loadAllIssues() proc filterIssues(ctx: CliContext, filter: IssueFilter) = for state, issueList in ctx.issues: @@ -214,7 +211,7 @@ proc reorder(ctx: CliContext, state: IssueState) = # load the issues to make sure the order file contains all issues in the state. ctx.loadIssues(state) - discard os.execShellCmd(EDITOR & " '" & (ctx.tasksDir / $state / "order.txt") & "' /dev/tty") + discard os.execShellCmd(EDITOR & " '" & (ctx.cfg.tasksDir / $state / "order.txt") & "' /dev/tty") proc edit(issue: Issue) = @@ -380,7 +377,7 @@ when isMainModule: if tagsOption.isSome: tagsOption.get else: newSeq[string]()) - ctx.tasksDir.store(issue, state) + ctx.cfg.tasksDir.store(issue, state) stdout.writeLine ctx.formatIssue(issue) @@ -400,7 +397,7 @@ when isMainModule: ctx.loadIssues(state) for issue in ctx.issues[state]: edit(issue) - else: edit(ctx.tasksDir.loadIssueById(editRef)) + else: edit(ctx.cfg.tasksDir.loadIssueById(editRef)) elif args["tag"]: if tagsOption.isNone: raise newException(Exception, "no tags given") @@ -408,7 +405,7 @@ when isMainModule: let newTags = tagsOption.get for id in @(args[""]): - var issue = ctx.tasksDir.loadIssueById(id) + var issue = ctx.cfg.tasksDir.loadIssueById(id) issue.tags = deduplicate(issue.tags & newTags) issue.store() @@ -418,7 +415,7 @@ when isMainModule: else: @[] for id in @(args[""]): - var issue = ctx.tasksDir.loadIssueById(id) + var issue = ctx.cfg.tasksDir.loadIssueById(id) if tagsToRemove.len > 0: issue.tags = issue.tags.filter( proc (tag: string): bool = not tagsToRemove.anyIt(it == tag)) @@ -437,24 +434,24 @@ when isMainModule: elif args["suspend"]: targetState = Dormant for id in @(args[""]): - var issue = ctx.tasksDir.loadIssueById(id) + var issue = ctx.cfg.tasksDir.loadIssueById(id) if propertiesOption.isSome: for k,v in propertiesOption.get: issue[k] = v if targetState == Done: issue["completed"] = getTime().local.formatIso8601 if issue.hasProp("recurrence") and issue.getRecurrence.isSome: - let nextIssue = ctx.tasksDir.nextRecurrence(issue.getRecurrence.get, issue) - ctx.tasksDir.store(nextIssue, Todo) + let nextIssue = ctx.cfg.tasksDir.nextRecurrence(issue.getRecurrence.get, issue) + ctx.cfg.tasksDir.store(nextIssue, Todo) info "created the next recurrence:" stdout.writeLine ctx.formatIssue(nextIssue) - issue.changeState(ctx.tasksDir, targetState) + issue.changeState(ctx.cfg.tasksDir, targetState) if ctx.triggerPtk or args["--ptk"]: if targetState == Current: - let issue = ctx.tasksDir.loadIssueById($(args[""][0])) + let issue = ctx.cfg.tasksDir.loadIssueById($(args[""][0])) var cmd = "ptk start" if issue.tags.len > 0 or issue.hasProp("context"): let tags = concat( @@ -471,14 +468,14 @@ when isMainModule: elif args["hide-until"]: - let issue = ctx.tasksDir.loadIssueById($(args[""])) + let issue = ctx.cfg.tasksDir.loadIssueById($(args[""])) issue.setDateTime("hide-until", parseDate($args[""])) issue.store() elif args["delegate"]: - let issue = ctx.tasksDir.loadIssueById($(args[""])) + let issue = ctx.cfg.tasksDir.loadIssueById($(args[""])) issue["delegated-to"] = $args[""] issue.store() @@ -486,7 +483,7 @@ when isMainModule: elif args["delete"] or args["rm"]: for id in @(args[""]): - let issue = ctx.tasksDir.loadIssueById(id) + let issue = ctx.cfg.tasksDir.loadIssueById(id) if not args["--yes"]: stderr.write("Delete '" & issue.summary & "' (y/n)? ") @@ -569,7 +566,7 @@ when isMainModule: # List a specific issue elif issueIdsOption.isSome: for issueId in issueIdsOption.get: - let issue = ctx.tasksDir.loadIssueById(issueId) + let issue = ctx.cfg.tasksDir.loadIssueById(issueId) stdout.writeLine ctx.formatIssue(issue) # List all issues @@ -585,7 +582,7 @@ when isMainModule: verbose = ctx.verbose) elif args["add-binary-property"]: - let issue = ctx.tasksDir.loadIssueById($(args[""])) + let issue = ctx.cfg.tasksDir.loadIssueById($(args[""])) let propIn = if $(args[""]) == "-": stdin @@ -597,7 +594,7 @@ when isMainModule: issue.store() elif args["get-binary-property"]: - let issue = ctx.tasksDir.loadIssueById($(args[""])) + let issue = ctx.cfg.tasksDir.loadIssueById($(args[""])) if not issue.hasProp($(args[""])): raise newException(Exception, diff --git a/src/pitpkg/cliconstants.nim b/src/pitpkg/cliconstants.nim index 47c8906..c1e2692 100644 --- a/src/pitpkg/cliconstants.nim +++ b/src/pitpkg/cliconstants.nim @@ -1,4 +1,4 @@ -const PIT_VERSION* = "4.21.2" +const PIT_VERSION* = "4.22.0" const USAGE* = """Usage: pit ( new | add) [] [options] diff --git a/src/pitpkg/private/libpit.nim b/src/pitpkg/private/libpit.nim index 9809cce..2e65ddf 100644 --- a/src/pitpkg/private/libpit.nim +++ b/src/pitpkg/private/libpit.nim @@ -306,6 +306,13 @@ proc loadIssues*(path: string): seq[Issue] = # Finally, save current order result.storeOrder(path) +proc loadIssues*(tasksDir: string, state: IssueState): seq[Issue] = + loadIssues(tasksDir / $state) + +proc loadAllIssues*(tasksDir: string): TableRef[IssueState, seq[Issue]] = + result = newTable[IssueState, seq[Issue]]() + for state in IssueState: result[state] = tasksDir.loadIssues(state) + proc changeState*(issue: Issue, tasksDir: string, newState: IssueState) = let oldFilepath = issue.filepath if newState == Done: issue.setDateTime("completed", getTime().local)