blob: e8cd7bc1e4671fa96446123767218344b956f268 [file] [log] [blame]
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Command issuelock locks Github issues.
package main
import (
"flag"
"fmt"
"io/ioutil"
"log"
"os"
"path/filepath"
"strconv"
"strings"
"time"
"github.com/google/go-github/github"
"golang.org/x/oauth2"
)
func usage() {
fmt.Fprintf(os.Stderr, "Usage: issuelock [<issue>]\n")
flag.PrintDefaults()
os.Exit(1)
}
func main() {
flag.Usage = usage
flag.Parse()
tokenFile := filepath.Join(os.Getenv("HOME"), "keys", "github-gobot")
slurp, err := ioutil.ReadFile(tokenFile)
if err != nil {
log.Fatal(err)
}
f := strings.SplitN(strings.TrimSpace(string(slurp)), ":", 2)
if len(f) != 2 || f[0] == "" || f[1] == "" {
log.Fatalf("Expected token file %s to be of form <username>:<token>", tokenFile)
}
ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: f[1]})
tc := oauth2.NewClient(oauth2.NoContext, ts)
client := github.NewClient(tc)
if flag.NArg() == 1 {
issueNum, err := strconv.Atoi(flag.Arg(0))
if err != nil {
usage()
}
if err := freeze(client, issueNum); err != nil {
log.Fatal(err)
}
return
}
if flag.NArg() > 1 {
usage()
}
tooOld := time.Now().Add(-365 * 24 * time.Hour).Format("2006-01-02")
log.Printf("Freezing closed issues before %v", tooOld)
for {
result, response, err := client.Search.Issues("repo:golang/go is:closed -label:FrozenDueToAge updated:<="+tooOld, &github.SearchOptions{
Sort: "created",
Order: "asc",
ListOptions: github.ListOptions{
PerPage: 500,
},
})
if err != nil {
log.Fatal(err)
}
if *result.Total == 0 {
return
}
log.Printf("Matches: %d, Res: %#v", *result.Total, response)
for _, is := range result.Issues {
num := *is.Number
log.Printf("Freezing issue: %d", *is.Number)
if err := freeze(client, num); err != nil {
log.Fatal(err)
}
time.Sleep(500 * time.Millisecond) // be nice to github
}
}
}
func freeze(client *github.Client, issueNum int) error {
_, err := client.Issues.Lock("golang", "go", issueNum)
if err != nil {
return err
}
_, _, err = client.Issues.AddLabelsToIssue("golang", "go", issueNum, []string{"FrozenDueToAge"})
return err
}