From 97565b77cdb4c7c2db82f0baa462eeabb17294dc Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Wed, 9 May 2012 13:15:16 +0200 Subject: go: reorganize the go bindings go 1 introduced the "go" program that simplifies building of libraries and programs. This patch reorganizes the go code so it can be compiled using the new utility, it does not change any files. Signed-off-by: Justus Winter <4winter@informatik.uni-hamburg.de> --- bindings/go/src/notmuch-addrlookup/addrlookup.go | 263 +++++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 bindings/go/src/notmuch-addrlookup/addrlookup.go (limited to 'bindings/go/src/notmuch-addrlookup/addrlookup.go') diff --git a/bindings/go/src/notmuch-addrlookup/addrlookup.go b/bindings/go/src/notmuch-addrlookup/addrlookup.go new file mode 100644 index 0000000..03699fb --- /dev/null +++ b/bindings/go/src/notmuch-addrlookup/addrlookup.go @@ -0,0 +1,263 @@ +package main + +// stdlib imports +import "os" +import "path" +import "log" +import "fmt" +import "regexp" +import "strings" +import "sort" + +// 3rd-party imports +import "notmuch" +import "github.com/kless/goconfig/config" + +type mail_addr_freq struct { + addr string + count [3]uint +} + +type frequencies map[string]uint + +/* Used to sort the email addresses from most to least used */ +func sort_by_freq(m1, m2 *mail_addr_freq) int { + if (m1.count[0] == m2.count[0] && + m1.count[1] == m2.count[1] && + m1.count[2] == m2.count[2]) { + return 0 + } + + if (m1.count[0] > m2.count[0] || + m1.count[0] == m2.count[0] && + m1.count[1] > m2.count[1] || + m1.count[0] == m2.count[0] && + m1.count[1] == m2.count[1] && + m1.count[2] > m2.count[2]) { + return -1 + } + + return 1 +} + +type maddresses []*mail_addr_freq + +func (self *maddresses) Len() int { + return len(*self) +} + +func (self *maddresses) Less(i,j int) bool { + m1 := (*self)[i] + m2 := (*self)[j] + v := sort_by_freq(m1, m2) + if v<=0 { + return true + } + return false +} + +func (self *maddresses) Swap(i,j int) { + (*self)[i], (*self)[j] = (*self)[j], (*self)[i] +} + +// find most frequent real name for each mail address +func frequent_fullname(freqs frequencies) string { + var maxfreq uint = 0 + fullname := "" + freqs_sz := len(freqs) + + for mail,freq := range freqs { + if (freq > maxfreq && mail != "") || freqs_sz == 1 { + // only use the entry if it has a real name + // or if this is the only entry + maxfreq = freq + fullname = mail + } + } + return fullname +} + +func addresses_by_frequency(msgs *notmuch.Messages, name string, pass uint, addr_to_realname *map[string]*frequencies) *frequencies { + + freqs := make(frequencies) + + pattern := `\s*(("(\.|[^"])*"|[^,])*?)` + // pattern := "\\s*((\\\"(\\\\.|[^\\\\\"])*\\\"|[^,])*" + + // "\\b\\w+([-+.]\\w+)*\\@\\w+[-\\.\\w]*\\.([-\\.\\w]+)*\\w\\b)>?)" + pattern = `.*` + strings.ToLower(name) + `.*` + var re *regexp.Regexp = nil + var err os.Error = nil + if re,err = regexp.Compile(pattern); err != nil { + log.Printf("error: %v\n", err) + return &freqs + } + + headers := []string{"from"} + if pass == 1 { + headers = append(headers, "to", "cc", "bcc") + } + + for ;msgs.Valid();msgs.MoveToNext() { + msg := msgs.Get() + //println("==> msg [", msg.GetMessageId(), "]") + for _,header := range headers { + froms := strings.ToLower(msg.GetHeader(header)) + //println(" froms: ["+froms+"]") + for _,from := range strings.Split(froms, ",", -1) { + from = strings.Trim(from, " ") + match := re.FindString(from) + //println(" -> match: ["+match+"]") + occ,ok := freqs[match] + if !ok { + freqs[match] = 0 + occ = 0 + } + freqs[match] = occ+1 + } + } + } + return &freqs +} + +func search_address_passes(queries [3]*notmuch.Query, name string) []string { + var val []string + addr_freq := make(map[string]*mail_addr_freq) + addr_to_realname := make(map[string]*frequencies) + + var pass uint = 0 // 0-based + for _,query := range queries { + if query == nil { + //println("**warning: idx [",idx,"] contains a nil query") + continue + } + msgs := query.SearchMessages() + ht := addresses_by_frequency(msgs, name, pass, &addr_to_realname) + for addr, count := range *ht { + freq,ok := addr_freq[addr] + if !ok { + freq = &mail_addr_freq{addr:addr, count:[3]uint{0,0,0}} + } + freq.count[pass] = count + addr_freq[addr] = freq + } + msgs.Destroy() + pass += 1 + } + + addrs := make(maddresses, len(addr_freq)) + { + iaddr := 0 + for _, freq := range addr_freq { + addrs[iaddr] = freq + iaddr += 1 + } + } + sort.Sort(&addrs) + + for _,addr := range addrs { + freqs,ok := addr_to_realname[addr.addr] + if ok { + val = append(val, frequent_fullname(*freqs)) + } else { + val = append(val, addr.addr) + } + } + //println("val:",val) + return val +} + +type address_matcher struct { + // the notmuch database + db *notmuch.Database + // full path of the notmuch database + user_db_path string + // user primary email + user_primary_email string + // user tag to mark from addresses as in the address book + user_addrbook_tag string +} + +func new_address_matcher() *address_matcher { + var cfg *config.Config + var err os.Error + + // honor NOTMUCH_CONFIG + home := os.Getenv("NOTMUCH_CONFIG") + if home == "" { + home = os.Getenv("HOME") + } + + if cfg,err = config.ReadDefault(path.Join(home, ".notmuch-config")); err != nil { + log.Fatalf("error loading config file:",err) + } + + db_path,_ := cfg.String("database", "path") + primary_email,_ := cfg.String("user", "primary_email") + addrbook_tag,err := cfg.String("user", "addrbook_tag") + if err != nil { + addrbook_tag = "addressbook" + } + + self := &address_matcher{db:nil, + user_db_path:db_path, + user_primary_email:primary_email, + user_addrbook_tag:addrbook_tag} + return self +} + +func (self *address_matcher) run(name string) { + queries := [3]*notmuch.Query{} + + // open the database + if db, status := notmuch.OpenDatabase(self.user_db_path, + notmuch.DATABASE_MODE_READ_ONLY); status == notmuch.STATUS_SUCCESS { + self.db = db + } else { + log.Fatalf("Failed to open the database: %v\n", status) + } + + // pass 1: look at all from: addresses with the address book tag + query := "tag:" + self.user_addrbook_tag + if name != "" { + query = query + " and from:" + name + "*" + } + queries[0] = self.db.CreateQuery(query) + + // pass 2: look at all to: addresses sent from our primary mail + query = "" + if name != "" { + query = "to:"+name+"*" + } + if self.user_primary_email != "" { + query = query + " from:" + self.user_primary_email + } + queries[1] = self.db.CreateQuery(query) + + // if that leads only to a few hits, we check every from too + if queries[0].CountMessages() + queries[1].CountMessages() < 10 { + query = "" + if name != "" { + query = "from:"+name+"*" + } + queries[2] = self.db.CreateQuery(query) + } + + // actually retrieve and sort addresses + results := search_address_passes(queries, name) + for _,v := range results { + if v != "" && v != "\n" { + fmt.Println(v) + } + } + return +} + +func main() { + //fmt.Println("args:",os.Args) + app := new_address_matcher() + name := "" + if len(os.Args) > 1 { + name = os.Args[1] + } + app.run(name) +} \ No newline at end of file -- cgit v1.2.3 From 9bf6eec1a51c49f025454fdfc709b4d29142f84c Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Wed, 9 May 2012 13:15:18 +0200 Subject: go: update the addrlookup utility to go 1 Use the new built in error type that replaces os.Error, adapt the code to the fact that strings.Split has just two arguments now. Signed-off-by: Justus Winter <4winter@informatik.uni-hamburg.de> --- bindings/go/src/notmuch-addrlookup/addrlookup.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'bindings/go/src/notmuch-addrlookup/addrlookup.go') diff --git a/bindings/go/src/notmuch-addrlookup/addrlookup.go b/bindings/go/src/notmuch-addrlookup/addrlookup.go index 03699fb..d172666 100644 --- a/bindings/go/src/notmuch-addrlookup/addrlookup.go +++ b/bindings/go/src/notmuch-addrlookup/addrlookup.go @@ -86,7 +86,7 @@ func addresses_by_frequency(msgs *notmuch.Messages, name string, pass uint, addr // "\\b\\w+([-+.]\\w+)*\\@\\w+[-\\.\\w]*\\.([-\\.\\w]+)*\\w\\b)>?)" pattern = `.*` + strings.ToLower(name) + `.*` var re *regexp.Regexp = nil - var err os.Error = nil + var err error = nil if re,err = regexp.Compile(pattern); err != nil { log.Printf("error: %v\n", err) return &freqs @@ -103,7 +103,7 @@ func addresses_by_frequency(msgs *notmuch.Messages, name string, pass uint, addr for _,header := range headers { froms := strings.ToLower(msg.GetHeader(header)) //println(" froms: ["+froms+"]") - for _,from := range strings.Split(froms, ",", -1) { + for _,from := range strings.Split(froms, ",") { from = strings.Trim(from, " ") match := re.FindString(from) //println(" -> match: ["+match+"]") @@ -179,7 +179,7 @@ type address_matcher struct { func new_address_matcher() *address_matcher { var cfg *config.Config - var err os.Error + var err error // honor NOTMUCH_CONFIG home := os.Getenv("NOTMUCH_CONFIG") -- cgit v1.2.3 From 1952889353becc7b3bd254ea2695eca04bb9491f Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Wed, 9 May 2012 13:15:20 +0200 Subject: go: format the souce code using gofmt Signed-off-by: Justus Winter <4winter@informatik.uni-hamburg.de> --- bindings/go/src/notmuch-addrlookup/addrlookup.go | 80 ++++++++++----------- bindings/go/src/notmuch/notmuch.go | 89 ++++++++++++------------ 2 files changed, 86 insertions(+), 83 deletions(-) (limited to 'bindings/go/src/notmuch-addrlookup/addrlookup.go') diff --git a/bindings/go/src/notmuch-addrlookup/addrlookup.go b/bindings/go/src/notmuch-addrlookup/addrlookup.go index d172666..59283f8 100644 --- a/bindings/go/src/notmuch-addrlookup/addrlookup.go +++ b/bindings/go/src/notmuch-addrlookup/addrlookup.go @@ -22,18 +22,18 @@ type frequencies map[string]uint /* Used to sort the email addresses from most to least used */ func sort_by_freq(m1, m2 *mail_addr_freq) int { - if (m1.count[0] == m2.count[0] && + if m1.count[0] == m2.count[0] && m1.count[1] == m2.count[1] && - m1.count[2] == m2.count[2]) { + m1.count[2] == m2.count[2] { return 0 } - if (m1.count[0] > m2.count[0] || + if m1.count[0] > m2.count[0] || m1.count[0] == m2.count[0] && - m1.count[1] > m2.count[1] || + m1.count[1] > m2.count[1] || m1.count[0] == m2.count[0] && - m1.count[1] == m2.count[1] && - m1.count[2] > m2.count[2]) { + m1.count[1] == m2.count[1] && + m1.count[2] > m2.count[2] { return -1 } @@ -46,17 +46,17 @@ func (self *maddresses) Len() int { return len(*self) } -func (self *maddresses) Less(i,j int) bool { +func (self *maddresses) Less(i, j int) bool { m1 := (*self)[i] m2 := (*self)[j] - v := sort_by_freq(m1, m2) - if v<=0 { + v := sort_by_freq(m1, m2) + if v <= 0 { return true } return false } -func (self *maddresses) Swap(i,j int) { +func (self *maddresses) Swap(i, j int) { (*self)[i], (*self)[j] = (*self)[j], (*self)[i] } @@ -66,7 +66,7 @@ func frequent_fullname(freqs frequencies) string { fullname := "" freqs_sz := len(freqs) - for mail,freq := range freqs { + for mail, freq := range freqs { if (freq > maxfreq && mail != "") || freqs_sz == 1 { // only use the entry if it has a real name // or if this is the only entry @@ -87,32 +87,32 @@ func addresses_by_frequency(msgs *notmuch.Messages, name string, pass uint, addr pattern = `.*` + strings.ToLower(name) + `.*` var re *regexp.Regexp = nil var err error = nil - if re,err = regexp.Compile(pattern); err != nil { + if re, err = regexp.Compile(pattern); err != nil { log.Printf("error: %v\n", err) return &freqs } - + headers := []string{"from"} if pass == 1 { headers = append(headers, "to", "cc", "bcc") } - for ;msgs.Valid();msgs.MoveToNext() { + for ; msgs.Valid(); msgs.MoveToNext() { msg := msgs.Get() //println("==> msg [", msg.GetMessageId(), "]") - for _,header := range headers { + for _, header := range headers { froms := strings.ToLower(msg.GetHeader(header)) //println(" froms: ["+froms+"]") - for _,from := range strings.Split(froms, ",") { + for _, from := range strings.Split(froms, ",") { from = strings.Trim(from, " ") match := re.FindString(from) //println(" -> match: ["+match+"]") - occ,ok := freqs[match] + occ, ok := freqs[match] if !ok { freqs[match] = 0 occ = 0 } - freqs[match] = occ+1 + freqs[match] = occ + 1 } } } @@ -125,7 +125,7 @@ func search_address_passes(queries [3]*notmuch.Query, name string) []string { addr_to_realname := make(map[string]*frequencies) var pass uint = 0 // 0-based - for _,query := range queries { + for _, query := range queries { if query == nil { //println("**warning: idx [",idx,"] contains a nil query") continue @@ -133,9 +133,9 @@ func search_address_passes(queries [3]*notmuch.Query, name string) []string { msgs := query.SearchMessages() ht := addresses_by_frequency(msgs, name, pass, &addr_to_realname) for addr, count := range *ht { - freq,ok := addr_freq[addr] + freq, ok := addr_freq[addr] if !ok { - freq = &mail_addr_freq{addr:addr, count:[3]uint{0,0,0}} + freq = &mail_addr_freq{addr: addr, count: [3]uint{0, 0, 0}} } freq.count[pass] = count addr_freq[addr] = freq @@ -154,8 +154,8 @@ func search_address_passes(queries [3]*notmuch.Query, name string) []string { } sort.Sort(&addrs) - for _,addr := range addrs { - freqs,ok := addr_to_realname[addr.addr] + for _, addr := range addrs { + freqs, ok := addr_to_realname[addr.addr] if ok { val = append(val, frequent_fullname(*freqs)) } else { @@ -187,31 +187,31 @@ func new_address_matcher() *address_matcher { home = os.Getenv("HOME") } - if cfg,err = config.ReadDefault(path.Join(home, ".notmuch-config")); err != nil { - log.Fatalf("error loading config file:",err) + if cfg, err = config.ReadDefault(path.Join(home, ".notmuch-config")); err != nil { + log.Fatalf("error loading config file:", err) } - db_path,_ := cfg.String("database", "path") - primary_email,_ := cfg.String("user", "primary_email") - addrbook_tag,err := cfg.String("user", "addrbook_tag") + db_path, _ := cfg.String("database", "path") + primary_email, _ := cfg.String("user", "primary_email") + addrbook_tag, err := cfg.String("user", "addrbook_tag") if err != nil { addrbook_tag = "addressbook" } - self := &address_matcher{db:nil, - user_db_path:db_path, - user_primary_email:primary_email, - user_addrbook_tag:addrbook_tag} + self := &address_matcher{db: nil, + user_db_path: db_path, + user_primary_email: primary_email, + user_addrbook_tag: addrbook_tag} return self } func (self *address_matcher) run(name string) { queries := [3]*notmuch.Query{} - + // open the database if db, status := notmuch.OpenDatabase(self.user_db_path, notmuch.DATABASE_MODE_READ_ONLY); status == notmuch.STATUS_SUCCESS { - self.db = db + self.db = db } else { log.Fatalf("Failed to open the database: %v\n", status) } @@ -226,7 +226,7 @@ func (self *address_matcher) run(name string) { // pass 2: look at all to: addresses sent from our primary mail query = "" if name != "" { - query = "to:"+name+"*" + query = "to:" + name + "*" } if self.user_primary_email != "" { query = query + " from:" + self.user_primary_email @@ -234,17 +234,17 @@ func (self *address_matcher) run(name string) { queries[1] = self.db.CreateQuery(query) // if that leads only to a few hits, we check every from too - if queries[0].CountMessages() + queries[1].CountMessages() < 10 { + if queries[0].CountMessages()+queries[1].CountMessages() < 10 { query = "" if name != "" { - query = "from:"+name+"*" + query = "from:" + name + "*" } queries[2] = self.db.CreateQuery(query) } - + // actually retrieve and sort addresses results := search_address_passes(queries, name) - for _,v := range results { + for _, v := range results { if v != "" && v != "\n" { fmt.Println(v) } @@ -260,4 +260,4 @@ func main() { name = os.Args[1] } app.run(name) -} \ No newline at end of file +} diff --git a/bindings/go/src/notmuch/notmuch.go b/bindings/go/src/notmuch/notmuch.go index 86e577c..12de4c8 100644 --- a/bindings/go/src/notmuch/notmuch.go +++ b/bindings/go/src/notmuch/notmuch.go @@ -15,25 +15,26 @@ import "unsafe" // Status codes used for the return values of most functions type Status C.notmuch_status_t + const ( STATUS_SUCCESS Status = iota STATUS_OUT_OF_MEMORY - STATUS_READ_ONLY_DATABASE - STATUS_XAPIAN_EXCEPTION - STATUS_FILE_ERROR - STATUS_FILE_NOT_EMAIL - STATUS_DUPLICATE_MESSAGE_ID - STATUS_NULL_POINTER - STATUS_TAG_TOO_LONG - STATUS_UNBALANCED_FREEZE_THAW - STATUS_UNBALANCED_ATOMIC - - STATUS_LAST_STATUS + STATUS_READ_ONLY_DATABASE + STATUS_XAPIAN_EXCEPTION + STATUS_FILE_ERROR + STATUS_FILE_NOT_EMAIL + STATUS_DUPLICATE_MESSAGE_ID + STATUS_NULL_POINTER + STATUS_TAG_TOO_LONG + STATUS_UNBALANCED_FREEZE_THAW + STATUS_UNBALANCED_ATOMIC + + STATUS_LAST_STATUS ) func (self Status) String() string { var p *C.char - + // p is read-only p = C.notmuch_status_to_string(C.notmuch_status_t(self)) if p != nil { @@ -83,9 +84,10 @@ type Filenames struct { } type DatabaseMode C.notmuch_database_mode_t + const ( - DATABASE_MODE_READ_ONLY DatabaseMode = 0 - DATABASE_MODE_READ_WRITE + DATABASE_MODE_READ_ONLY DatabaseMode = 0 + DATABASE_MODE_READ_WRITE ) // Create a new, empty notmuch database located at 'path' @@ -98,7 +100,7 @@ func NewDatabase(path string) (*Database, Status) { return nil, STATUS_OUT_OF_MEMORY } - self := &Database{db:nil} + self := &Database{db: nil} st := Status(C.notmuch_database_create(c_path, &self.db)) if st != STATUS_SUCCESS { return nil, st @@ -132,7 +134,7 @@ func OpenDatabase(path string, mode DatabaseMode) (*Database, Status) { return nil, STATUS_OUT_OF_MEMORY } - self := &Database{db:nil} + self := &Database{db: nil} st := Status(C.notmuch_database_open(c_path, C.notmuch_database_mode_t(mode), &self.db)) if st != STATUS_SUCCESS { return nil, st @@ -149,9 +151,9 @@ func (self *Database) Close() { /* Return the database path of the given database. */ func (self *Database) GetPath() string { - - /* The return value is a string owned by notmuch so should not be - * modified nor freed by the caller. */ + + /* The return value is a string owned by notmuch so should not be + * modified nor freed by the caller. */ var p *C.char = C.notmuch_database_get_path(self.db) if p != nil { s := C.GoString(p) @@ -181,7 +183,6 @@ func (self *Database) NeedsUpgrade() bool { // TODO: notmuch_database_upgrade - /* Retrieve a directory object from the database for 'path'. * * Here, 'path' should be a path relative to the path of 'database' @@ -202,7 +203,7 @@ func (self *Database) GetDirectory(path string) *Directory { if c_dir == nil { return nil } - return &Directory{dir:c_dir} + return &Directory{dir: c_dir} } /* Add a new message to the given notmuch database. @@ -245,8 +246,7 @@ func (self *Database) GetDirectory(path string) *Directory { * NOTMUCH_STATUS_READ_ONLY_DATABASE: Database was opened in read-only * mode so no message can be added. */ -func -(self *Database) AddMessage(fname string) (*Message, Status) { +func (self *Database) AddMessage(fname string) (*Message, Status) { var c_fname *C.char = C.CString(fname) defer C.free(unsafe.Pointer(c_fname)) @@ -257,7 +257,7 @@ func var c_msg *C.notmuch_message_t = new(C.notmuch_message_t) st := Status(C.notmuch_database_add_message(self.db, c_fname, &c_msg)) - return &Message{message:c_msg}, st + return &Message{message: c_msg}, st } /* Remove a message from the given notmuch database. @@ -285,7 +285,7 @@ func * mode so no message can be removed. */ func (self *Database) RemoveMessage(fname string) Status { - + var c_fname *C.char = C.CString(fname) defer C.free(unsafe.Pointer(c_fname)) @@ -310,7 +310,7 @@ func (self *Database) RemoveMessage(fname string) Status { * * A Xapian exception occurs */ func (self *Database) FindMessage(message_id string) (*Message, Status) { - + var c_msg_id *C.char = C.CString(message_id) defer C.free(unsafe.Pointer(c_msg_id)) @@ -318,7 +318,7 @@ func (self *Database) FindMessage(message_id string) (*Message, Status) { return nil, STATUS_OUT_OF_MEMORY } - msg := &Message{message:nil} + msg := &Message{message: nil} st := Status(C.notmuch_database_find_message(self.db, c_msg_id, &msg.message)) if st != STATUS_SUCCESS { return nil, st @@ -338,7 +338,7 @@ func (self *Database) GetAllTags() *Tags { if tags == nil { return nil } - return &Tags{tags:tags} + return &Tags{tags: tags} } /* Create a new query for 'database'. @@ -366,7 +366,7 @@ func (self *Database) GetAllTags() *Tags { * Will return NULL if insufficient memory is available. */ func (self *Database) CreateQuery(query string) *Query { - + var c_query *C.char = C.CString(query) defer C.free(unsafe.Pointer(c_query)) @@ -378,11 +378,12 @@ func (self *Database) CreateQuery(query string) *Query { if q == nil { return nil } - return &Query{query:q} + return &Query{query: q} } /* Sort values for notmuch_query_set_sort */ type Sort C.notmuch_sort_t + const ( SORT_OLDEST_FIRST Sort = 0 SORT_NEWEST_FIRST @@ -395,7 +396,7 @@ func (self *Query) String() string { // FIXME: do we own 'q' or not ? q := C.notmuch_query_get_query_string(self.query) //defer C.free(unsafe.Pointer(q)) - + if q != nil { s := C.GoString(q) return s @@ -457,7 +458,7 @@ func (self *Query) SearchThreads() *Threads { if threads == nil { return nil } - return &Threads{threads:threads} + return &Threads{threads: threads} } /* Execute a query for messages, returning a notmuch_messages_t object @@ -503,7 +504,7 @@ func (self *Query) SearchMessages() *Messages { if msgs == nil { return nil } - return &Messages{messages:msgs} + return &Messages{messages: msgs} } /* Destroy a notmuch_query_t along with any associated resources. @@ -605,7 +606,7 @@ func (self *Messages) Get() *Message { if msg == nil { return nil } - return &Message{message:msg} + return &Message{message: msg} } /* Move the 'messages' iterator to the next message. @@ -657,7 +658,7 @@ func (self *Messages) CollectTags() *Tags { if tags == nil { return nil } - return &Tags{tags:tags} + return &Tags{tags: tags} } /* Get the message ID of 'message'. @@ -697,14 +698,14 @@ func (self *Message) GetMessageId() string { * message belongs to a single thread. */ func (self *Message) GetThreadId() string { - + if self.message == nil { return "" } id := C.notmuch_message_get_thread_id(self.message) // we dont own id // defer C.free(unsafe.Pointer(id)) - + if id == nil { return "" } @@ -737,7 +738,7 @@ func (self *Message) GetReplies() *Messages { if msgs == nil { return nil } - return &Messages{messages:msgs} + return &Messages{messages: msgs} } /* Get a filename for the email corresponding to 'message'. @@ -761,7 +762,7 @@ func (self *Message) GetFileName() string { fname := C.notmuch_message_get_filename(self.message) // we dont own fname // defer C.free(unsafe.Pointer(fname)) - + if fname == nil { return "" } @@ -770,6 +771,7 @@ func (self *Message) GetFileName() string { } type Flag C.notmuch_message_flag_t + const ( MESSAGE_FLAG_MATCH Flag = 0 ) @@ -816,16 +818,16 @@ func (self *Message) GetHeader(header string) string { if self.message == nil { return "" } - + var c_header *C.char = C.CString(header) defer C.free(unsafe.Pointer(c_header)) - + /* we dont own value */ value := C.notmuch_message_get_header(self.message, c_header) if value == nil { return "" } - + return C.GoString(value) } @@ -867,7 +869,7 @@ func (self *Message) GetTags() *Tags { if tags == nil { return nil } - return &Tags{tags:tags} + return &Tags{tags: tags} } /* The longest possible tag value. */ @@ -1124,4 +1126,5 @@ func (self *Filenames) Destroy() { } C.notmuch_filenames_destroy(self.fnames) } + /* EOF */ -- cgit v1.2.3