blob: 293c64d4569c4f48b2a9540e2edb9796f35b7c49 [file] [log] [blame]
package main
import (
"bufio"
"context"
"flag"
"fmt"
"os"
"time"
"go.skia.org/infra/go/auth"
"go.skia.org/infra/go/common"
"go.skia.org/infra/go/gerrit"
"go.skia.org/infra/go/httputils"
"go.skia.org/infra/go/sklog"
"golang.org/x/oauth2/google"
)
var (
gerritInstance = flag.String("gerrit_instance", "https://skia-review.googlesource.com", "Name of the gerrit instance")
abandonReason = flag.String("abandon_reason", "", "Optional. Will be used as reason for abandoning")
lastModifiedBeforeDays = flag.Int("last_modified_before_days", 0, "Optional. If '3' is specified then all CLs that were modified after 3 days ago will be returned")
)
func printIssue(i *gerrit.ChangeInfo, gUrl string, num int) {
fmt.Printf("\n#%d\n", num)
fmt.Printf("\tGerrit CL : %s/c/%s/+/%d\n", gUrl, i.Project, i.Issue)
fmt.Printf("\tSubject : %s\n", i.Subject)
fmt.Printf("\tUpdated : %s\n\n", i.Updated)
}
func printIssues(issues []*gerrit.ChangeInfo, gUrl string) {
fmt.Println()
for idx, i := range issues {
printIssue(i, gUrl, idx+1)
}
fmt.Println()
}
func abandonIssue(ctx context.Context, i *gerrit.ChangeInfo, g *gerrit.Gerrit) error {
return g.Abandon(ctx, i, *abandonReason)
}
func main() {
common.Init()
ctx := context.Background()
if *gerritInstance == "" {
sklog.Fatal("--gerrit_instance is required.")
}
ts, err := google.DefaultTokenSource(ctx, auth.ScopeGerrit)
if err != nil {
sklog.Fatal(err)
}
client := httputils.DefaultClientConfig().WithTokenSource(ts).Client()
g, err := gerrit.NewGerrit(*gerritInstance, client)
if err != nil {
sklog.Fatal(err)
}
searchTerms := []*gerrit.SearchTerm{gerrit.SearchOwner("me"), gerrit.SearchStatus(gerrit.ChangeStatusNew)}
if *lastModifiedBeforeDays != 0 {
beforeHours := *lastModifiedBeforeDays * 24
searchTerms = append(searchTerms, gerrit.SearchModifiedAfter(time.Now().Add(-time.Duration(beforeHours)*time.Hour)))
}
issues, err := g.Search(ctx, 100, false, searchTerms...)
// Reverse the slice to keep the oldest issues first
for i, j := 0, len(issues)-1; i < j; i, j = i+1, j-1 {
issues[i], issues[j] = issues[j], issues[i]
}
if err != nil {
sklog.Fatalf("Failed to retrieve issues: %s", err)
}
if len(issues) == 0 {
fmt.Println("Found 0 issues.")
return
} else {
fmt.Printf("\nFound %d issues (displaying oldest first):", len(issues))
printIssues(issues, *gerritInstance)
}
fmt.Println("[1] Abandon all.")
fmt.Println("[2] Abandon selectively. You will be prompted for each issue.")
reader := bufio.NewReader(os.Stdin)
fmt.Println("\nEnter one option [1,2] ")
char, _, err := reader.ReadRune()
if err != nil {
sklog.Fatalf("Could not read input: %s", err)
}
switch char {
case '1':
reader = bufio.NewReader(os.Stdin)
fmt.Print("Are you sure? [y,n]: ")
char, _, err := reader.ReadRune()
if err != nil {
sklog.Fatalf("Could not read input: %s", err)
}
switch char {
case 'y':
for _, i := range issues {
if err := abandonIssue(ctx, i, g); err != nil {
sklog.Fatalf("Could not abandon %d: %s", i.Issue, err)
}
fmt.Printf("Abandoned %d\n", i.Issue)
}
break
case 'n':
fmt.Println("Not abandoning any issues. Exiting.")
return
default:
fmt.Println("Could not recognize input. Exiting.")
return
}
break
case '2':
for idx, i := range issues {
printIssue(i, *gerritInstance, idx+1)
reader = bufio.NewReader(os.Stdin)
fmt.Print("Abandon? [y,n]: ")
char, _, err := reader.ReadRune()
if err != nil {
sklog.Fatalf("Could not read input: %s", err)
}
switch char {
case 'y':
if err := abandonIssue(ctx, i, g); err != nil {
sklog.Fatalf("Could not abandon %d: %s", i.Issue, err)
}
fmt.Printf("Abandoned %d\n", i.Issue)
break
case 'n':
fmt.Printf("Not abandoning %d\n", i.Issue)
break
default:
fmt.Println("Could not recognize input. Exiting.")
return
}
}
default:
fmt.Println("Could not recognize input. Exiting.")
return
}
}