aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorKoni Marti <koni.marti@gmail.com>2024-08-23 11:16:41 +0200
committerRobin Jarry <robin@jarry.cc>2024-08-24 15:49:17 +0200
commitf07038bd98de5282703cd80c32959e58a47da86b (patch)
treef2cc85e41d9adf163aebfbddd391bd532e790b14 /lib
parent7346d20343b9fa8b192c9a5294b26efac9186c4f (diff)
downloadaerc-f07038bd98de5282703cd80c32959e58a47da86b.tar.gz
patch: add auto-switch option
Add an auto-switch option that changes the project of the patch manager based on the subject line of a message if it contains a '[PATCH <project>]' segment. A subject line with '[PATCH aerc v2]' would switch to the 'aerc' project if that project is available in the patch manager. The auto switching can be activated per account by adding 'pama-auto-switch = true' to your account config. Implements: https://todo.sr.ht/~rjarry/aerc/226 Changelog-added: Auto-switch projects based on the message subject for the :patch command. Signed-off-by: Koni Marti <koni.marti@gmail.com> Acked-by: Robin Jarry <robin@jarry.cc>
Diffstat (limited to 'lib')
-rw-r--r--lib/pama/switch.go36
-rw-r--r--lib/pama/switch_test.go67
2 files changed, 103 insertions, 0 deletions
diff --git a/lib/pama/switch.go b/lib/pama/switch.go
index 4d6b25f7..8190f3c8 100644
--- a/lib/pama/switch.go
+++ b/lib/pama/switch.go
@@ -2,6 +2,10 @@ package pama
import (
"fmt"
+ "regexp"
+ "time"
+
+ "git.sr.ht/~rjarry/aerc/lib/log"
)
func (m PatchManager) SwitchProject(name string) error {
@@ -27,3 +31,35 @@ func (m PatchManager) SwitchProject(name string) error {
}
return storeErr(m.store().SetCurrent(name))
}
+
+var switchDebouncer *time.Timer
+
+func DebouncedSwitchProject(name string) {
+ if switchDebouncer != nil {
+ if switchDebouncer.Stop() {
+ log.Debugf("pama: switch debounced")
+ }
+ }
+ if name == "" {
+ return
+ }
+ switchDebouncer = time.AfterFunc(500*time.Millisecond, func() {
+ if err := New().SwitchProject(name); err != nil {
+ log.Debugf("could not switch to project %s: %v",
+ name, err)
+ } else {
+ log.Debugf("project switch to project %s", name)
+ }
+ })
+}
+
+var fromSubject = regexp.MustCompile(
+ `\[\s*(RFC|DRAFT|[Dd]raft)*\s*(PATCH|[Pp]atch)\s+([^\s\]]+)\s*[vV]*[0-9/]*\s*\] `)
+
+func FromSubject(s string) string {
+ matches := fromSubject.FindStringSubmatch(s)
+ if len(matches) >= 3 {
+ return matches[3]
+ }
+ return ""
+}
diff --git a/lib/pama/switch_test.go b/lib/pama/switch_test.go
new file mode 100644
index 00000000..04c72dfa
--- /dev/null
+++ b/lib/pama/switch_test.go
@@ -0,0 +1,67 @@
+package pama_test
+
+import (
+ "testing"
+
+ "git.sr.ht/~rjarry/aerc/lib/pama"
+)
+
+func TestFromSubject(t *testing.T) {
+ tests := []struct {
+ s string
+ want string
+ }{
+ {
+ s: "[PATCH aerc] pama: new patch",
+ want: "aerc",
+ },
+ {
+ s: "[PATCH aerc v2] pama: new patch",
+ want: "aerc",
+ },
+ {
+ s: "[PATCH aerc 1/2] pama: new patch",
+ want: "aerc",
+ },
+ {
+ s: "[Patch aerc] pama: new patch",
+ want: "aerc",
+ },
+ {
+ s: "[patch aerc] pama: new patch",
+ want: "aerc",
+ },
+ {
+ s: "[RFC PATCH aerc] pama: new patch",
+ want: "aerc",
+ },
+ {
+ s: "[DRAFT PATCH aerc] pama: new patch",
+ want: "aerc",
+ },
+ {
+ s: "RE: [PATCH aerc v1] pama: new patch",
+ want: "aerc",
+ },
+ {
+ s: "[PATCH] pama: new patch",
+ want: "",
+ },
+ {
+ s: "just a subject line",
+ want: "",
+ },
+ {
+ s: "just a subject line with unrelated [asdf aerc v1]",
+ want: "",
+ },
+ }
+
+ for _, test := range tests {
+ got := pama.FromSubject(test.s)
+ if got != test.want {
+ t.Errorf("failed to get name from '%s': "+
+ "got '%s', want '%s'", test.s, got, test.want)
+ }
+ }
+}