1// Copyright 2021 The Tint Authors. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15// snippets gathers information about changes merged for weekly reports (snippets). 16package main 17 18import ( 19 "flag" 20 "fmt" 21 "os" 22 "strings" 23 "time" 24 25 "dawn.googlesource.com/tint/tools/src/gerrit" 26) 27 28const yyyymmdd = "2006-01-02" 29 30var ( 31 // See https://dawn-review.googlesource.com/new-password for obtaining 32 // username and password for gerrit. 33 gerritUser = flag.String("gerrit-user", "", "gerrit authentication username") 34 gerritPass = flag.String("gerrit-pass", "", "gerrit authentication password") 35 userFlag = flag.String("user", "", "user name / email") 36 afterFlag = flag.String("after", "", "start date") 37 beforeFlag = flag.String("before", "", "end date") 38 daysFlag = flag.Int("days", 7, "interval in days (used if --after is not specified)") 39) 40 41func main() { 42 flag.Parse() 43 if err := run(); err != nil { 44 fmt.Fprintln(os.Stderr, err) 45 os.Exit(1) 46 } 47} 48 49func run() error { 50 var after, before time.Time 51 var err error 52 user := *userFlag 53 if user == "" { 54 return fmt.Errorf("Missing required 'user' flag") 55 } 56 if *beforeFlag != "" { 57 before, err = time.Parse(yyyymmdd, *beforeFlag) 58 if err != nil { 59 return fmt.Errorf("Couldn't parse before date: %w", err) 60 } 61 } else { 62 before = time.Now() 63 } 64 if *afterFlag != "" { 65 after, err = time.Parse(yyyymmdd, *afterFlag) 66 if err != nil { 67 return fmt.Errorf("Couldn't parse after date: %w", err) 68 } 69 } else { 70 after = before.Add(-time.Hour * time.Duration(24**daysFlag)) 71 } 72 73 g, err := gerrit.New(gerrit.Config{Username: *gerritUser, Password: *gerritPass}) 74 if err != nil { 75 return err 76 } 77 78 submitted, _, err := g.QueryChanges( 79 "status:merged", 80 "owner:"+user, 81 "after:"+date(after), 82 "before:"+date(before)) 83 if err != nil { 84 return fmt.Errorf("Query failed: %w", err) 85 } 86 87 changesByProject := map[string][]string{} 88 for _, change := range submitted { 89 str := fmt.Sprintf(`* [%s](%sc/%s/+/%d)`, change.Subject, gerrit.URL, change.Project, change.Number) 90 changesByProject[change.Project] = append(changesByProject[change.Project], str) 91 } 92 93 for _, project := range []string{"tint", "dawn"} { 94 if changes := changesByProject[project]; len(changes) > 0 { 95 fmt.Println("##", strings.Title(project)) 96 for _, change := range changes { 97 fmt.Println(change) 98 } 99 fmt.Println() 100 } 101 } 102 103 return nil 104} 105 106func today() time.Time { 107 return time.Now() 108} 109 110func date(t time.Time) string { 111 return t.Format(yyyymmdd) 112} 113