~sircmpwn/aerc

Add a 'folders-exclude' option v4 PROPOSED

ARaspiK: 1
 Add a 'folders-exclude' option

 4 files changed, 41 insertions(+), 21 deletions(-)
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~sircmpwn/aerc/patches/11386/mbox | git am -3
Learn more about email & git
View this thread in the archives

[PATCH v4] Add a 'folders-exclude' option Export this patch

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.
---
Turns out there was a major bug that prevented any exclusions from
working when more than one exclusion was given. It's fixed now.

 commands/compose/send.go |  8 +-------
 config/config.go         |  5 +++++
 doc/aerc-config.5.scd    |  7 +++++++
 widgets/dirlist.go       | 42 ++++++++++++++++++++++++++--------------
 4 files changed, 41 insertions(+), 21 deletions(-)

diff --git a/commands/compose/send.go b/commands/compose/send.go
index 59ae5d0..5b9098f 100644
--- a/commands/compose/send.go
+++ b/commands/compose/send.go
@@ -124,13 +124,7 @@ func (Send) Execute(aerc *widgets.Aerc, args []string) error {
				return 0, errors.Wrap(err, "smtp.Dial")
			}
			defer conn.Close()
			if sup, _ := conn.Extension("STARTTLS"); sup {
				if !starttls {
					err := errors.New("STARTTLS is supported by this server, " +
						"but not set in accounts.conf. " +
						"Add smtp-starttls=yes")
					return 0, err
				}
			if sup, _ := conn.Extension("STARTTLS"); sup && starttls {
				if err = conn.StartTLS(&tls.Config{
					ServerName: serverName,
				}); err != nil {
diff --git a/config/config.go b/config/config.go
index 8ebd69d..ce59944 100644
--- a/config/config.go
+++ b/config/config.go
@@ -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" {
diff --git a/doc/aerc-config.5.scd b/doc/aerc-config.5.scd
index 2bd3076..af64ad6 100644
--- a/doc/aerc-config.5.scd
+++ b/doc/aerc-config.5.scd
@@ -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.
diff --git a/widgets/dirlist.go b/widgets/dirlist.go
index f12631b..cb2f756 100644
--- a/widgets/dirlist.go
+++ b/widgets/dirlist.go
@@ -390,24 +390,38 @@ 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 {
			for _, f := range filters {
				matches := folderMatches(folder, f)
				if exclude {
					matches = !matches
				}
				if matches {
					dest = append(dest, folder)
					break
				}
			}
		}
		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) {
-- 
2.27.0