summary refs log tree commit diff stats
path: root/commands
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2019-06-08 19:41:56 +0200
committerDrew DeVault <sir@cmpwn.com>2019-06-09 11:33:50 -0400
commitacfe7d7625192bc856d5d696f741e35ce38cab25 (patch)
tree64f76ab6927cbb25be95c0ff2e65e063791593a6 /commands
parent35f57321f8d53dba2c1a2480aaa5860333e1c269 (diff)
downloadaerc-acfe7d7625192bc856d5d696f741e35ce38cab25.tar.gz
Add archive command
Adds an archive command that moves the current message into the folder
specified in the account config entry.

Supports three layouts at this point:

- flat: puts all messages next to each other
- year: creates a folder per year
- month: same as above, plus folders per month

This also adds a "-p" argument to "cp" and "mv" that works like
"--parents" on mkdir(1). We use this to auto-create the directories
for the archive layout.
Diffstat (limited to 'commands')
-rw-r--r--commands/msg/archive.go62
-rw-r--r--commands/msg/copy.go23
-rw-r--r--commands/msg/move.go23
3 files changed, 102 insertions, 6 deletions
diff --git a/commands/msg/archive.go b/commands/msg/archive.go
new file mode 100644
index 0000000..11752f7
--- /dev/null
+++ b/commands/msg/archive.go
@@ -0,0 +1,62 @@
+package msg
+
+import (
+	"errors"
+	"fmt"
+	"path"
+	"time"
+
+	"github.com/gdamore/tcell"
+
+	"git.sr.ht/~sircmpwn/aerc/widgets"
+	"git.sr.ht/~sircmpwn/aerc/worker/types"
+)
+
+const (
+	ARCHIVE_FLAT  = "flat"
+	ARCHIVE_YEAR  = "year"
+	ARCHIVE_MONTH = "month"
+)
+
+func init() {
+	register("archive", Archive)
+}
+
+func Archive(aerc *widgets.Aerc, args []string) error {
+	if len(args) != 2 {
+		return errors.New("Usage: archive <flat|year|month>")
+	}
+	acct := aerc.SelectedAccount()
+	if acct == nil {
+		return errors.New("No account selected")
+	}
+	msg := acct.Messages().Selected()
+	store := acct.Messages().Store()
+	archiveDir := acct.AccountConfig().Archive
+	acct.Messages().Next()
+
+	switch args[1] {
+	case ARCHIVE_MONTH:
+		archiveDir = path.Join(archiveDir,
+			fmt.Sprintf("%d", msg.Envelope.Date.Year()),
+			fmt.Sprintf("%02d", msg.Envelope.Date.Month()))
+	case ARCHIVE_YEAR:
+		archiveDir = path.Join(archiveDir, fmt.Sprintf("%v",
+			msg.Envelope.Date.Year()))
+	case ARCHIVE_FLAT:
+		// deliberately left blank
+	}
+
+	store.Move([]uint32{msg.Uid}, archiveDir, true, func(
+		msg types.WorkerMessage) {
+
+		switch msg := msg.(type) {
+		case *types.Done:
+			aerc.PushStatus("Messages archived.", 10*time.Second)
+		case *types.Error:
+			aerc.PushStatus(" "+msg.Error.Error(), 10*time.Second).
+				Color(tcell.ColorDefault, tcell.ColorRed)
+		}
+	})
+	return nil
+}
diff --git a/commands/msg/copy.go b/commands/msg/copy.go
index 57c93a3..0d9836b 100644
--- a/commands/msg/copy.go
+++ b/commands/msg/copy.go
@@ -4,6 +4,7 @@ import (
 	"errors"
 	"time"
 
+	"git.sr.ht/~sircmpwn/getopt"
 	"github.com/gdamore/tcell"
 
 	"git.sr.ht/~sircmpwn/aerc/widgets"
@@ -16,9 +17,23 @@ func init() {
 }
 
 func Copy(aerc *widgets.Aerc, args []string) error {
-	if len(args) != 2 {
-		return errors.New("Usage: mv <folder>")
+	opts, optind, err := getopt.Getopts(args[1:], "p")
+	if err != nil {
+		return err
 	}
+	if optind != len(args)-2 {
+		return errors.New("Usage: cp [-p] <folder>")
+	}
+	var (
+		createParents bool
+	)
+	for _, opt := range opts {
+		switch opt.Option {
+		case 'p':
+			createParents = true
+		}
+	}
+
 	widget := aerc.SelectedTab().(widgets.ProvidesMessage)
 	acct := widget.SelectedAccount()
 	if acct == nil {
@@ -26,7 +41,9 @@ func Copy(aerc *widgets.Aerc, args []string) error {
 	}
 	msg := widget.SelectedMessage()
 	store := widget.Store()
-	store.Copy([]uint32{msg.Uid}, args[1], func(msg types.WorkerMessage) {
+	store.Copy([]uint32{msg.Uid}, args[optind+1], createParents, func(
+		msg types.WorkerMessage) {
+
 		switch msg := msg.(type) {
 		case *types.Done:
 			aerc.PushStatus("Messages copied.", 10*time.Second)
diff --git a/commands/msg/move.go b/commands/msg/move.go
index 1224efa..7742ffb 100644
--- a/commands/msg/move.go
+++ b/commands/msg/move.go
@@ -4,6 +4,7 @@ import (
 	"errors"
 	"time"
 
+	"git.sr.ht/~sircmpwn/getopt"
 	"github.com/gdamore/tcell"
 
 	"git.sr.ht/~sircmpwn/aerc/widgets"
@@ -16,9 +17,23 @@ func init() {
 }
 
 func Move(aerc *widgets.Aerc, args []string) error {
-	if len(args) != 2 {
-		return errors.New("Usage: mv <folder>")
+	opts, optind, err := getopt.Getopts(args[1:], "p")
+	if err != nil {
+		return err
 	}
+	if optind != len(args)-2 {
+		return errors.New("Usage: mv [-p] <folder>")
+	}
+	var (
+		createParents bool
+	)
+	for _, opt := range opts {
+		switch opt.Option {
+		case 'p':
+			createParents = true
+		}
+	}
+
 	widget := aerc.SelectedTab().(widgets.ProvidesMessage)
 	acct := widget.SelectedAccount()
 	if acct == nil {
@@ -31,7 +46,9 @@ func Move(aerc *widgets.Aerc, args []string) error {
 		aerc.RemoveTab(widget)
 	}
 	acct.Messages().Next()
-	store.Move([]uint32{msg.Uid}, args[1], func(msg types.WorkerMessage) {
+	store.Move([]uint32{msg.Uid}, args[optind+1], createParents, func(
+		msg types.WorkerMessage) {
+
 		switch msg := msg.(type) {
 		case *types.Done:
 			aerc.PushStatus("Messages moved.", 10*time.Second)
00 committer Kartik K. Agaram <vc@akkartik.com> 2015-08-23 10:19:23 -0700 2062' href='/akkartik/mu/commit/html/041jump_label.cc.html?h=main&id=90560d7194f3e451ddab9d4033c98d2e6aec977b'>90560d71 ^
65361948 ^
90560d71 ^
65361948 ^

90560d71 ^
65361948 ^

90560d71 ^
c5ffb6e1 ^
65361948 ^

90560d71 ^
d5d908dd ^
c5ffb6e1 ^
65361948 ^





90560d71 ^

9542bb11 ^


65361948 ^
90560d71 ^

9542bb11 ^
65361948 ^







c5ffb6e1 ^
9570363a ^
65361948 ^









90560d71 ^
9570363a ^
65361948 ^









9570363a ^

65361948 ^








9570363a ^


c5ffb6e1 ^
9570363a ^
65361948 ^
9570363a ^
65361948 ^






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149