github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/tools/dashboard/app/build/update.go (about)

     1  // Copyright 2011 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // +build appengine
     6  
     7  package build
     8  
     9  import (
    10  	"encoding/json"
    11  	"fmt"
    12  	"net/http"
    13  
    14  	"appengine"
    15  	"appengine/datastore"
    16  )
    17  
    18  func init() {
    19  	handleFunc("/updatebenchmark", updateBenchmark)
    20  }
    21  
    22  func updateBenchmark(w http.ResponseWriter, r *http.Request) {
    23  	if !appengine.IsDevAppServer() {
    24  		fmt.Fprint(w, "Update must not run on real server.")
    25  		return
    26  	}
    27  
    28  	if r.Method != "POST" {
    29  		fmt.Fprintf(w, "bad request method")
    30  		return
    31  	}
    32  
    33  	c := contextForRequest(r)
    34  	if !validKey(c, r.FormValue("key"), r.FormValue("builder")) {
    35  		fmt.Fprintf(w, "bad builder/key")
    36  		return
    37  	}
    38  
    39  	defer r.Body.Close()
    40  	var hashes []string
    41  	if err := json.NewDecoder(r.Body).Decode(&hashes); err != nil {
    42  		fmt.Fprintf(w, "failed to decode request: %v", err)
    43  		return
    44  	}
    45  
    46  	ncommit := 0
    47  	nrun := 0
    48  	tx := func(c appengine.Context) error {
    49  		var cr *CommitRun
    50  		for _, hash := range hashes {
    51  			// Update Commit.
    52  			com := &Commit{Hash: hash}
    53  			err := datastore.Get(c, com.Key(c), com)
    54  			if err != nil && err != datastore.ErrNoSuchEntity {
    55  				return fmt.Errorf("fetching Commit: %v", err)
    56  			}
    57  			if err == datastore.ErrNoSuchEntity {
    58  				continue
    59  			}
    60  			com.NeedsBenchmarking = true
    61  			com.PerfResults = nil
    62  			if err := putCommit(c, com); err != nil {
    63  				return err
    64  			}
    65  			ncommit++
    66  
    67  			// create PerfResult
    68  			res := &PerfResult{CommitHash: com.Hash, CommitNum: com.Num}
    69  			err = datastore.Get(c, res.Key(c), res)
    70  			if err != nil && err != datastore.ErrNoSuchEntity {
    71  				return fmt.Errorf("fetching PerfResult: %v", err)
    72  			}
    73  			if err == datastore.ErrNoSuchEntity {
    74  				if _, err := datastore.Put(c, res.Key(c), res); err != nil {
    75  					return fmt.Errorf("putting PerfResult: %v", err)
    76  				}
    77  			}
    78  
    79  			// Update CommitRun.
    80  			if cr != nil && cr.StartCommitNum != com.Num/PerfRunLength*PerfRunLength {
    81  				if _, err := datastore.Put(c, cr.Key(c), cr); err != nil {
    82  					return fmt.Errorf("putting CommitRun: %v", err)
    83  				}
    84  				nrun++
    85  				cr = nil
    86  			}
    87  			if cr == nil {
    88  				var err error
    89  				cr, err = GetCommitRun(c, com.Num)
    90  				if err != nil {
    91  					return fmt.Errorf("getting CommitRun: %v", err)
    92  				}
    93  			}
    94  			if com.Num < cr.StartCommitNum || com.Num >= cr.StartCommitNum+PerfRunLength {
    95  				return fmt.Errorf("commit num %v out of range [%v, %v)", com.Num, cr.StartCommitNum, cr.StartCommitNum+PerfRunLength)
    96  			}
    97  			idx := com.Num - cr.StartCommitNum
    98  			cr.Hash[idx] = com.Hash
    99  			cr.User[idx] = shortDesc(com.User)
   100  			cr.Desc[idx] = shortDesc(com.Desc)
   101  			cr.Time[idx] = com.Time
   102  			cr.NeedsBenchmarking[idx] = com.NeedsBenchmarking
   103  		}
   104  		if cr != nil {
   105  			if _, err := datastore.Put(c, cr.Key(c), cr); err != nil {
   106  				return fmt.Errorf("putting CommitRun: %v", err)
   107  			}
   108  			nrun++
   109  		}
   110  		return nil
   111  	}
   112  	if err := datastore.RunInTransaction(c, tx, nil); err != nil {
   113  		fmt.Fprintf(w, "failed to execute tx: %v", err)
   114  		return
   115  	}
   116  	fmt.Fprintf(w, "OK (updated %v commits and %v commit runs)", ncommit, nrun)
   117  }