diff options
author | Koni Marti <koni.marti@gmail.com> | 2024-08-23 11:16:41 +0200 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2024-08-24 15:49:17 +0200 |
commit | f07038bd98de5282703cd80c32959e58a47da86b (patch) | |
tree | f2cc85e41d9adf163aebfbddd391bd532e790b14 /lib/pama | |
parent | 7346d20343b9fa8b192c9a5294b26efac9186c4f (diff) | |
download | aerc-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/pama')
-rw-r--r-- | lib/pama/switch.go | 36 | ||||
-rw-r--r-- | lib/pama/switch_test.go | 67 |
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) + } + } +} |