diff options
Diffstat (limited to 'commands')
| -rw-r--r-- | commands/msg/archive.go | 62 | ||||
| -rw-r--r-- | commands/msg/copy.go | 23 | ||||
| -rw-r--r-- | commands/msg/move.go | 23 | 
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) | 
