From 11069877439aaf38208ecd80e3a24f7c5a298d6a Mon Sep 17 00:00:00 2001 From: k1nho Date: Thu, 2 Nov 2023 12:33:14 -0400 Subject: [PATCH] add sort capabilities to user contributions --- cmd/insights/user-contributions.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/cmd/insights/user-contributions.go b/cmd/insights/user-contributions.go index 4fb2171..4ea03b6 100644 --- a/cmd/insights/user-contributions.go +++ b/cmd/insights/user-contributions.go @@ -6,6 +6,7 @@ import ( "encoding/csv" "errors" "fmt" + "sort" "strconv" "sync" @@ -38,6 +39,9 @@ type userContributionsOptions struct { // Output is the formatting style for command output Output string + + // Sort is the column to be used to sort user contributions (total, commits, pr, none) + Sort string } // NewUserContributionsCommand returns a new user-contributions command @@ -68,6 +72,7 @@ func NewUserContributionsCommand() *cobra.Command { cmd.Flags().StringVarP(&opts.FilePath, constants.FlagNameFile, "f", "", "Path to yaml file containing an array of git repository urls") cmd.Flags().Int32VarP(&opts.Period, constants.FlagNamePeriod, "p", 30, "Number of days, used for query filtering") cmd.Flags().StringSliceVarP(&opts.Users, "users", "u", []string{}, "Inclusive comma separated list of GitHub usernames to filter for") + cmd.Flags().StringVarP(&opts.Sort, "sort", "s", "none", "Sort user contributions by (total, commits, prs)") return cmd } @@ -130,6 +135,10 @@ func (opts *userContributionsOptions) run(ctx context.Context) error { return allErrors } + if opts.Sort != "none" { + sortUserContributions(insights, opts.Sort) + } + for _, insight := range insights { output, err := insight.BuildOutput(opts.Output) if err != nil { @@ -283,3 +292,21 @@ func findAllUserContributionsInsights(ctx context.Context, opts *userContributio return repoUserContributionsInsightGroup, nil } + +func sortUserContributions(ucig []*userContributionsInsightGroup, sortBy string) { + for _, group := range ucig { + if group != nil { + sort.SliceStable(group.Insights, func(i, j int) bool { + switch sortBy { + case "total": + return group.Insights[i].TotalContributions > group.Insights[j].TotalContributions + case "prs": + return group.Insights[i].PrsCreated > group.Insights[j].PrsCreated + case "commits": + return group.Insights[i].Commits > group.Insights[j].Commits + } + return group.Insights[i].Login < group.Insights[j].Login + }) + } + } +}