func RefreshFlags(nmdb *notmuch.Database) { query := nmdb.CreateQuery("tag:inbox and tag:delete") msgs := query.SearchMessages() for ; msgs.Valid(); msgs.MoveToNext() { msg := msgs.Get() msg.RemoveTag("inbox") } query = nmdb.CreateQuery("tag:inbox and tag:archive") msgs = query.SearchMessages() for ; msgs.Valid(); msgs.MoveToNext() { msg := msgs.Get() msg.RemoveTag("inbox") } query = nmdb.CreateQuery("tag:inbox and tag:seen and not tag:list") msgs = query.SearchMessages() for ; msgs.Valid(); msgs.MoveToNext() { msg := msgs.Get() msg.AddTag("archive") msg.RemoveTag("inbox") } query = nmdb.CreateQuery("tag:inbox and tag:seen and tag:list") msgs = query.SearchMessages() for ; msgs.Valid(); msgs.MoveToNext() { msg := msgs.Get() msg.RemoveTag("inbox") } query = nmdb.CreateQuery("tag:inbox and tag:seen and tag:bug") msgs = query.SearchMessages() for ; msgs.Valid(); msgs.MoveToNext() { msg := msgs.Get() msg.RemoveTag("inbox") } query = nmdb.CreateQuery("tag:inbox") msgs = query.SearchMessages() for ; msgs.Valid(); msgs.MoveToNext() { msg := msgs.Get() threadId := msg.GetThreadId() filter := fmt.Sprintf("thread:%s", threadId) query := nmdb.CreateQuery(filter) msgs := query.SearchMessages() for ; msgs.Valid(); msgs.MoveToNext() { msg := msgs.Get() msg.AddTag("inbox") } } query = nmdb.CreateQuery("tag:inbox and tag:killed") msgs = query.SearchMessages() for ; msgs.Valid(); msgs.MoveToNext() { msg := msgs.Get() threadId := msg.GetThreadId() filter := fmt.Sprintf("thread:%s", threadId) query := nmdb.CreateQuery(filter) msgs := query.SearchMessages() for ; msgs.Valid(); msgs.MoveToNext() { msg := msgs.Get() msg.RemoveTag("inbox") } } nmdb.Close() fmt.Print("Ok\n") }
func main() { var query *notmuch.Query var nmdb *notmuch.Database if db, status := notmuch.OpenDatabase(getMaildirLoc(), notmuch.DATABASE_MODE_READ_ONLY); status == notmuch.STATUS_SUCCESS { nmdb = db } else { log.Fatalf("Failed to open the database: %v\n", status) } quit := make(chan bool) resultOut := make(chan Result) query = nmdb.CreateQuery("tag:new") println(">", query.CountMessages(), "<") msgs := query.SearchMessages() var filenames []string if query.CountMessages() > 0 { for ; msgs.Valid(); msgs.MoveToNext() { msg := msgs.Get() filenames = append(filenames, msg.GetFileName()) } } go studyMsgs(resultOut, quit, filenames) // var query *notmuch.Query var msgIDRegexp = regexp.MustCompile("^<(.*?)>") var tagRegexp = regexp.MustCompile("([\\+-])(\\S+)") nmdb.Close() // Reopen the database if db, status := notmuch.OpenDatabase(getMaildirLoc(), 1); status == notmuch.STATUS_SUCCESS { nmdb = db } else { log.Fatalf("Failed to open the database: %v\n", status) } var running int = NCPU + 1 for { result := <-resultOut if result.Die { running-- if running > 0 { continue } else { break } } // Message-ID without the <> fmt.Printf("MessageID: %s\n", result.MessageID) reResult := msgIDRegexp.FindStringSubmatch(result.MessageID) if reResult == nil { fmt.Printf("Can't parse MessageID for mail %s\n", result.Filename) continue } msgID := reResult[1] filter := "id:" filter += msgID query := nmdb.CreateQuery(filter) msgs := query.SearchMessages() msg := msgs.Get() if msg == nil { fmt.Printf("Can't find MessageID %s for mail %s\n", msgID, result.Filename) continue } fmt.Printf("%s, tags: %s\n", msgID, result.Tags) for _, v := range tagRegexp.FindAllStringSubmatch(result.Tags, -1) { if v[1] == "+" { msg.AddTag(v[2]) } else if v[1] == "-" { msg.RemoveTag(v[2]) } } } fmt.Printf("exit\n") nmdb.Close() os.Exit(0) }