Configuration

The config file: optional TOML, in $XDG_CONFIG_HOME/patchtrack/config.toml.

--config FILE names another. With authors and trees in it, the daily round needs no arguments: patchtrack sync && patchtrack check --fetch && patchtrack list. patchtrack config shows the file in use and what it sets. Command-line options override the file, and the file overrides the built-in defaults. An unknown section or key, or a value of the wrong type, is an error, so a typo cannot silently do nothing.

Every table, with its defaults:

[sync]
authors = ["you@example.org"]        # whose patches (-a on the command line replaces this)
lists = ["all"]                      # inboxes to search, e.g. ["linux-usb", "u-boot"]
since = "3.months.ago"               # the window of a first sync
lore = "https://lore.kernel.org"     # the archive
window_days = 30                     # search this many days at a time
refresh_days = 7                     # refetch open series not fetched for this long

[[trees]]                            # one table per tree `check` looks in
name = "mainline"
repo = "~/linux"
url = "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git"
branch = "master"                    # or: ref = "origin/master", without url
role = "mainline"                    # maintainer (default), next or mainline

[sources]                            # your own mail, read by `sync` and `import`
maildirs = ["~/Mail/INBOX", "~/Mail/Sent"]   # Maildirs, or directories of .eml files
mboxes = ["~/mail/sent.mbox"]

[b4]                                 # where `branches` finds your b4 prep branches
repos = ["~/linux"]
prefix = "b4/"

[nudge]                              # when `nudge` suggests a ping or a RESEND
ping_days = 7
resend_days = 14
merge_window = true                  # with a mainline tree: hold pings until -rc1

[[profiles]]                         # how a project says "approved" and "landed"
name = "myproject"                   # "sourceware" is built in; the same name replaces it
recipients = ["*@lists.example.org"] # globs on the posting's To:/Cc:
approvals = ['^(ok|lgtm)([.!]|$)']   # regexes on lines that start a paragraph
landed = ['^(pushed|committed)']     # "it is in", counted from the author too

[bots]
builtin = true                       # keep the built-in rule (*bot*, lkp@intel.com, ...)
addresses = ["ci@example.org"]       # these senders are bots
patterns = ["*@ci.example.org"]      # fnmatch globs on the address
humans = ["abbott@example.org"]      # never bots, whatever matched
bodies = ["^My bot found errors"]    # regexes on the unquoted body, for
                                     # people who also send bot mail

Trees in the config are written to the store on every run, so the config is their source of truth: tree rm refuses them. Trees added with tree add sit beside them.