@@ 214,6 214,7 @@ func main() {
}
}
if len(picked) > 0 {
+ // main must not know how a filename is created TODO
os.Stdout.WriteString(path.Join(folder, strings.Join(picked, ",")) + "\n")
}
case "new":
@@ 360,10 361,10 @@ func main() {
break
}
folder := os.Args[2]
- var msgId string
- msgId, err = mbox.Append(folder, os.Stdin)
- if len(msgId) > 0 {
- os.Stdout.WriteString(path.Join(folder, msgId) + "\n")
+ var msg string
+ msg, err = mbox.Append(folder, os.Stdin)
+ if len(msg) > 0 {
+ os.Stdout.WriteString(msg + "\n")
}
case "pack": // rename to sort, as we gonna sort by date
if len(os.Args) < 3 {
@@ 19,7 19,7 @@ import (
)
// its not an error if no match is found.
-func walk(mbox *mh.Mailbox, folder string, seq *Sequence, proc func(string) error) error {
+func walk(mbox *mh.Mailbox, folder string, seq *Sequence, proc func(int64) error) error {
// todo: let only sorted msgs out here
msgs, err := mbox.ReadFolder(folder)
if err != nil {
@@ 29,8 29,8 @@ func walk(mbox *mh.Mailbox, folder strin
// in the correct time order
// todo: see above, need sorted list
for j := range msgs {
- if seq.Matches(msgs[j].Id) {
- if err = proc(strconv.FormatInt(msgs[j].Id, 10)); err != nil {
+ if seq.IsMatch(msgs[j].Id) {
+ if err = proc(msgs[j].Id); err != nil {
return err
}
}
@@ 39,14 39,14 @@ func walk(mbox *mh.Mailbox, folder strin
}
func Move(mbox *mh.Mailbox, srcFolder string, msgs *Sequence, dst string) error {
- proc := func(id string) error {
+ proc := func(id int64) error {
return mbox.Move(srcFolder, dst, id)
}
return walk(mbox, srcFolder, msgs, proc)
}
func Remove(mbox *mh.Mailbox, folder string, msgs *Sequence) error {
- proc := func(id string) error {
+ proc := func(id int64) error {
return mbox.Remove(folder, id)
}
return walk(mbox, folder, msgs, proc)
@@ 58,16 58,20 @@ func (mh *Mailbox) osPath(elem ...string
return path.Join(mh.mailDir, strings.Join(elem, "/"))
}
+func (mh *Mailbox) msgFile(folder string, msgid int64) string {
+ return path.Join(mh.mailDir, folder, strconv.FormatInt(msgid, 10))
+}
+
// todo: we sort mails in ReadFolder, could use this here
-func (mh *Mailbox) nextId(folder string) (string, error) {
+func (mh *Mailbox) nextId(folder string) (int64, error) {
if err := mh.lock(); err != nil {
- return "", err
+ return 0, err
}
defer mh.unlock()
list, err := mh.readDir(folder)
if err != nil {
- return "", err
+ return 0, err
}
var max int64
for i := range list {
@@ 82,7 86,7 @@ func (mh *Mailbox) nextId(folder string)
max = id
}
}
- return strconv.FormatInt(max+1, 10), nil
+ return max, nil
}
func (mbox Mailbox) FolderType(folder string) (int, bool) {
@@ 129,7 133,7 @@ func (mbox Mailbox) ReadFolder(folder st
return mails, err
}
-func (mh *Mailbox) Append(folder string, msg io.Reader) (string, error) {
+func (mh *Mailbox) Append(folder string, msg io.Reader) (newMsg string, err error) {
if err := mh.lock(); err != nil {
return "", err
}
@@ 138,19 142,20 @@ func (mh *Mailbox) Append(folder string,
if err != nil {
return "", err
}
- file, err := os.OpenFile(mh.osPath(folder, id),
- os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600)
+ newMsg = mh.msgFile(folder, id)
+ var file *os.File
+ file, err = os.OpenFile(mh.msgFile(folder, id), os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600)
if err != nil {
- return id, err
+ return
}
if _, err = io.Copy(file, msg); err != nil {
file.Close()
- return "", err
+ return
}
- if err := file.Close(); err != nil {
- return "", err
+ if err = file.Close(); err != nil {
+ return
}
- return id, mh.unlock()
+ return mh.msgFile(folder, id), mh.unlock()
}
func errMail(id int64, err error) Message {
@@ 211,8 216,8 @@ func (mh *Mailbox) readDir(folder string
return msgs, f.Close()
}
-func (mh *Mailbox) rename(fOld, old, fNew, new string) error {
- return os.Rename(mh.osPath(fOld, old), mh.osPath(fNew, new))
+func (mh *Mailbox) rename(fOld string, old int64, fNew string, new int64) error {
+ return os.Rename(mh.msgFile(fOld, old), mh.msgFile(fNew, new))
}
// todo: sort by date, use case: very old msg is moved into a folder
@@ 235,14 240,13 @@ func (mh *Mailbox) Pack(folder string) e
}
// then rename the rest
for ; i < len(msgs); i++ {
- if err = mh.rename(folder, strconv.FormatInt(msgs[i].Id, 10),
- folder, strconv.Itoa(i+1)); err != nil {
+ if err = mh.rename(folder, msgs[i].Id, folder, int64(i+1)); err != nil {
return err
}
}
return mh.unlock()
}
-func (mh *Mailbox) Move(src, dst, msgid string) error {
+func (mh *Mailbox) Move(src, dst string, msgid int64) error {
if err := mh.lock(); err != nil {
return err
}
@@ 257,13 261,13 @@ func (mh *Mailbox) Move(src, dst, msgid
return mh.unlock()
}
-func (mh *Mailbox) Remove(folder, msg string) error {
+func (mh *Mailbox) Remove(folder string, msg int64) error {
if err := mh.lock(); err != nil {
return err
}
defer mh.unlock()
- if err := os.Remove(mh.osPath(folder, msg)); err != nil {
+ if err := os.Remove(mh.msgFile(folder, msg)); err != nil {
return err
}
return mh.unlock()