Allow including or excluding properties by name only.

This commit is contained in:
2025-12-01 14:04:19 -06:00
parent 1d18be9d1b
commit 3d1dc7512a
3 changed files with 22 additions and 8 deletions

View File

@@ -19,18 +19,16 @@ proc parsePropertiesOption(propsOpt: string): TableRef[string, string] =
result = newTable[string, string]()
for propText in propsOpt.split(";"):
let pair = propText.split(":", 1)
if pair.len == 1: result[pair[0]] = "true"
if pair.len == 1: result[pair[0]] = MATCH_ANY
else: result[pair[0]] = pair[1]
proc parseExclPropertiesOption(propsOpt: string): TableRef[string, seq[string]] =
result = newTable[string, seq[string]]()
for propText in propsOpt.split(";"):
let pair = propText.split(":", 1)
let val =
if pair.len == 1: "true"
else: pair[1]
if result.hasKey(pair[0]): result[pair[0]].add(val)
else: result[pair[0]] = @[val]
if not result.hasKey(pair[0]): result[pair[0]] = @[]
if pair.len == 2: result[pair[0]].add(pair[1])
proc reorder(ctx: CliContext, state: IssueState) =
@@ -39,6 +37,7 @@ proc reorder(ctx: CliContext, state: IssueState) =
ctx.loadIssues(state)
discard os.execShellCmd(EDITOR & " '" & (ctx.cfg.tasksDir / $state / "order.txt") & "' </dev/tty >/dev/tty")
proc addIssue(
ctx: CliContext,
args: Table[string, Value],

View File

@@ -33,12 +33,20 @@ Options:
a filter to the issues listed, only allowing those
which have all of the given properties.
If a propert name is provided without a value, this
will allow all issues which have any value defined
for the named property.
-P, --excl-properties <props>
When used with the list command, exclude issues
that contain properties with the given value. This
parameter is formatted the same as the --properties
parameter: "key:val;key:val"
If no value is provided for a property, this will
filter out all issues with *any* value for that
property.
-c, --context <ctx> Shorthand for '-p context:<ctx>'
-C, --excl-context <ctx> Don't show issues from the given context(s).

View File

@@ -57,6 +57,7 @@ type
isFromCompletion*: bool
const MATCH_ANY* = "<match-any>"
const DONE_FOLDER_FORMAT* = "yyyy-MM"
const ISO8601_MS = "yyyy-MM-dd'T'HH:mm:ss'.'fffzzz"
@@ -429,10 +430,16 @@ proc filter*(issues: seq[Issue], filter: IssueFilter): seq[Issue] =
it.getDateTime("hide-until") <= now)
for k,v in filter.properties:
f = f --> filter(it.hasProp(k) and it[k] == v)
if v == MATCH_ANY:
f = f --> filter(it.hasProp(k))
else:
f = f --> filter(it.hasProp(k) and it[k] == v)
for k,v in filter.exclProperties:
f = f --> filter(not (it.hasProp(k) and v.contains(it[k])))
if v.len == 0:
f = f --> filter(not (it.hasProp(k)))
else:
f = f --> filter(not (it.hasProp(k) and v.contains(it[k])))
if filter.completedRange.isSome:
let range = filter.completedRange.get