]> Cypherpunks repositories - gostls13.git/commitdiff
misc/dashboard/codereview: record Message-ID of code review thread mails.
authorDavid Symonds <dsymonds@golang.org>
Mon, 30 Apr 2012 12:47:51 +0000 (22:47 +1000)
committerDavid Symonds <dsymonds@golang.org>
Mon, 30 Apr 2012 12:47:51 +0000 (22:47 +1000)
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

misc/dashboard/codereview/dashboard/cl.go
misc/dashboard/codereview/dashboard/mail.go

index fe20eb8e6d6d96d4c8c90c40579d6ca55503ba08..a77028994c98d805b419d55e11cb002789b8095f 100644 (file)
@@ -45,8 +45,9 @@ type CL struct {
        LGTMs       []string
 
        // Mail information.
-       Subject    string   `datastore:",noindex"`
-       Recipients []string `datastore:",noindex"`
+       Subject       string   `datastore:",noindex"`
+       Recipients    []string `datastore:",noindex"`
+       LastMessageID string   `datastore:",noindex"`
 
        // These are person IDs (e.g. "rsc"); they may be empty
        Author   string
@@ -193,6 +194,8 @@ func handleAssign(w http.ResponseWriter, r *http.Request) {
                                        Subject: cl.Subject + " (issue " + n + ")",
                                        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)
                        }
                }
@@ -339,7 +342,8 @@ func updateCL(c appengine.Context, n string) error {
                if err != nil && err != datastore.ErrNoSuchEntity {
                        return err
                } 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
                }
                _, err = datastore.Put(c, key, cl)
index bd9ca19d48e19c8e145f7ccd13495134d3bd9745..a4bf1ac3e27691ab252f3a113008269a9227d7bc 100644 (file)
@@ -9,6 +9,7 @@ import (
        "time"
 
        "appengine"
+       "appengine/datastore"
 )
 
 func init() {
@@ -35,6 +36,23 @@ func handleMail(w http.ResponseWriter, r *http.Request) {
        }
 
        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.
        UpdateCLLater(c, m[1], 10*time.Second)
 }