Add a 'folders-exclude' option

Added a 'folders-exclude' option that allows removing selected folders
from the directory list sidebar. My motivating example was that removing
a single folder from the list using Golang regexes seemed pretty hard,
so this is a better way to do it. The excluded folders list is included
in the man page.
This commit is contained in:
ARaspiK 2020-07-01 07:52:14 +00:00 committed by Reto Brunner
parent bf16ccde48
commit e1c2b596dc
3 changed files with 43 additions and 14 deletions

View file

@ -76,6 +76,7 @@ type AccountConfig struct {
Source string
SourceCredCmd string
Folders []string
FoldersExclude []string
Params map[string]string
Outgoing string
OutgoingCredCmd string
@ -186,6 +187,10 @@ func loadAccountConfig(path string) ([]AccountConfig, error) {
folders := strings.Split(val, ",")
sort.Strings(folders)
account.Folders = folders
} else if key == "folders-exclude" {
folders := strings.Split(val, ",")
sort.Strings(folders)
account.FoldersExclude = folders
} else if key == "source-cred-cmd" {
account.SourceCredCmd = val
} else if key == "outgoing" {

View file

@ -376,6 +376,13 @@ Note that many of these configuration options are written for you, such as
Default: all folders
*folders-exclude*
Specifies the comma separated list of folders to exclude from the sidebar.
Names prefixed with ~ are interpreted as regular expressions.
Note that this overrides anything from *folders*.
Default: no folders
*folders-sort*
Specifies a comma separated list of folders to be shown at the top of the
list in the provided order. Remaining folders will be sorted alphabetically.

View file

@ -390,24 +390,41 @@ func (dirlist *DirectoryList) sortDirsByFoldersSortConfig() {
}
// filterDirsByFoldersConfig sets dirlist.dirs to the filtered subset of the
// dirstore, based on the AccountConfig.Folders option
// dirstore, based on AccountConfig.Folders (inclusion) and
// AccountConfig.FoldersExclude (exclusion), in that order.
func (dirlist *DirectoryList) filterDirsByFoldersConfig() {
dirlist.dirs = dirlist.store.List()
// config option defaults to show all if unset
configFolders := dirlist.acctConf.Folders
if len(configFolders) == 0 {
return
}
var filtered []string
for _, folder := range dirlist.dirs {
for _, cfgfolder := range configFolders {
if folderMatches(folder, cfgfolder) {
filtered = append(filtered, folder)
break
filterDirs := func(orig, filters []string, exclude bool) []string {
if len(filters) == 0 {
return orig
}
var dest []string
for _, folder := range orig {
// When excluding, include things by default, and vice-versa
include := exclude
for _, f := range filters {
if folderMatches(folder, f) {
// If matched an exclusion, don't include
// If matched an inclusion, do include
include = !exclude
break
}
}
if include {
dest = append(dest, folder)
}
}
return dest
}
dirlist.dirs = filtered
dirlist.dirs = dirlist.store.List()
// 'folders' (if available) is used to make the initial list and
// 'folders-exclude' removes from that list.
configFolders := dirlist.acctConf.Folders
dirlist.dirs = filterDirs(dirlist.dirs, configFolders, false)
configFoldersExclude := dirlist.acctConf.FoldersExclude
dirlist.dirs = filterDirs(dirlist.dirs, configFoldersExclude, true)
}
func (dirlist *DirectoryList) SelectedMsgStore() (*lib.MessageStore, bool) {