1
0
mirror of https://github.com/golang/go synced 2024-11-25 22:57:58 -07:00

misc/dashboard/codereview: record Message-ID of code review thread mails.

This will allow us to properly thread "R=..." mails at a later time.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/6135053
This commit is contained in:
David Symonds 2012-04-30 22:47:51 +10:00
parent 5d331964e7
commit 1bdb788b2e
2 changed files with 25 additions and 3 deletions

View File

@ -47,6 +47,7 @@ type CL struct {
// Mail information. // Mail information.
Subject string `datastore:",noindex"` Subject string `datastore:",noindex"`
Recipients []string `datastore:",noindex"` Recipients []string `datastore:",noindex"`
LastMessageID string `datastore:",noindex"`
// These are person IDs (e.g. "rsc"); they may be empty // These are person IDs (e.g. "rsc"); they may be empty
Author string Author string
@ -193,6 +194,8 @@ func handleAssign(w http.ResponseWriter, r *http.Request) {
Subject: cl.Subject + " (issue " + n + ")", Subject: cl.Subject + " (issue " + n + ")",
Body: "R=" + rev + "\n\n(sent by gocodereview)", Body: "R=" + rev + "\n\n(sent by gocodereview)",
} }
// TODO(dsymonds): Use cl.LastMessageID as the In-Reply-To header
// when the appengine/mail package supports that.
sendMailLater.Call(c, msg) sendMailLater.Call(c, msg)
} }
} }
@ -339,7 +342,8 @@ func updateCL(c appengine.Context, n string) error {
if err != nil && err != datastore.ErrNoSuchEntity { if err != nil && err != datastore.ErrNoSuchEntity {
return err return err
} else if err == nil { } else if err == nil {
// Reviewer is the only field that needs preserving. // LastMessageID and Reviewer need preserving.
cl.LastMessageID = ocl.LastMessageID
cl.Reviewer = ocl.Reviewer cl.Reviewer = ocl.Reviewer
} }
_, err = datastore.Put(c, key, cl) _, err = datastore.Put(c, key, cl)

View File

@ -9,6 +9,7 @@ import (
"time" "time"
"appengine" "appengine"
"appengine/datastore"
) )
func init() { func init() {
@ -35,6 +36,23 @@ func handleMail(w http.ResponseWriter, r *http.Request) {
} }
c.Infof("Found issue %q", m[1]) c.Infof("Found issue %q", m[1])
// Track the MessageID.
key := datastore.NewKey(c, "CL", m[1], 0, nil)
err = datastore.RunInTransaction(c, func(c appengine.Context) error {
cl := new(CL)
err := datastore.Get(c, key, cl)
if err != nil && err != datastore.ErrNoSuchEntity {
return err
}
cl.LastMessageID = msg.Header.Get("Message-ID")
_, err = datastore.Put(c, key, cl)
return err
}, nil)
if err != nil {
c.Errorf("datastore transaction failed: %v", err)
}
// Update the CL after a delay to give Rietveld a chance to catch up. // Update the CL after a delay to give Rietveld a chance to catch up.
UpdateCLLater(c, m[1], 10*time.Second) UpdateCLLater(c, m[1], 10*time.Second)
} }