From 310189ab35b6b8f696f01cccc5f83e5a4d1cf120 Mon Sep 17 00:00:00 2001 From: Daniel Hess Date: Sun, 23 Feb 2025 02:05:55 -0800 Subject: [PATCH 1/8] start stripping out the old reporter --- cmd/apply.go | 5 ++--- cmd/apply_members.go | 17 +++++++---------- cmd/apply_org.go | 12 ++++++------ cmd/apply_repos.go | 34 +++++++++++++--------------------- cmd/apply_teams.go | 41 ++++++++++++++--------------------------- cmd/root.go | 13 +++++++++++++ 6 files changed, 55 insertions(+), 67 deletions(-) diff --git a/cmd/apply.go b/cmd/apply.go index f85fda8..aa1acc7 100644 --- a/cmd/apply.go +++ b/cmd/apply.go @@ -8,7 +8,6 @@ import ( "github.com/gomicro/concord/client" "github.com/gomicro/concord/manifest" - "github.com/gomicro/concord/report" "github.com/spf13/cobra" ) @@ -58,8 +57,8 @@ func applyRun(cmd *cobra.Command, args []string) error { return handleError(cmd, errors.New("organization does not exist")) } - report.PrintHeader("Org") - report.Println() + scrb.BeginDescribe("Organization") + defer scrb.EndDescribe() err = orgRun(cmd, args) if err != nil { diff --git a/cmd/apply_members.go b/cmd/apply_members.go index 0704199..00233c4 100644 --- a/cmd/apply_members.go +++ b/cmd/apply_members.go @@ -9,7 +9,6 @@ import ( "github.com/gomicro/concord/client" gh_pb "github.com/gomicro/concord/github/v1" "github.com/gomicro/concord/manifest" - "github.com/gomicro/concord/report" "github.com/google/go-github/v56/github" "github.com/spf13/cobra" ) @@ -58,8 +57,8 @@ func applyMembersRun(cmd *cobra.Command, args []string) error { return handleError(cmd, errors.New("organization does not exist")) } - report.PrintHeader("Org") - report.Println() + scrb.BeginDescribe("Organization") + defer scrb.EndDescribe() err = membersRun(cmd, args) if err != nil { @@ -93,9 +92,8 @@ func membersRun(cmd *cobra.Command, args []string) error { return handleError(cmd, err) } - report.Println() - report.PrintHeader("Members") - report.Println() + scrb.BeginDescribe("Members") + scrb.EndDescribe() ms, err := clt.GetMembers(ctx, org.Name) if err != nil { @@ -106,16 +104,15 @@ func membersRun(cmd *cobra.Command, args []string) error { for _, m := range missing { clt.InviteMember(ctx, org.Name, m) + scrb.Done("Invited " + m) } for _, m := range managed { - report.PrintInfo(m + " exists in github") - report.Println() + scrb.Done(m + " exists in github") } for _, m := range unmanaged { - report.PrintWarn(m + " exists in github but not in manifest") - report.Println() + scrb.Done(m + " exists in github but not in manifest") } return nil diff --git a/cmd/apply_org.go b/cmd/apply_org.go index 65f368e..5da1fed 100644 --- a/cmd/apply_org.go +++ b/cmd/apply_org.go @@ -9,7 +9,6 @@ import ( "github.com/gomicro/concord/client" gh_pb "github.com/gomicro/concord/github/v1" "github.com/gomicro/concord/manifest" - "github.com/gomicro/concord/report" "github.com/google/go-github/v56/github" "github.com/spf13/cobra" ) @@ -58,8 +57,8 @@ func applyOrgRun(cmd *cobra.Command, args []string) error { return handleError(cmd, errors.New("organization does not exist")) } - report.PrintHeader("Org") - report.Println() + scrb.BeginDescribe("Organization") + defer scrb.EndDescribe() err = orgRun(cmd, args) if err != nil { @@ -93,10 +92,11 @@ func orgRun(cmd *cobra.Command, args []string) error { return handleError(cmd, err) } - report.Println() - report.PrintHeader("Permissions") - report.Println() + scrb.BeginDescribe("Permissions") + scrb.EndDescribe() + // TODO: this should be broken into two parts, determine if the org exists + // and then apply the permissions err = clt.SetOrgPrivileges(ctx, org.Name, buildOrgState(org)) if err != nil { return handleError(cmd, err) diff --git a/cmd/apply_repos.go b/cmd/apply_repos.go index 890b72d..7d3ecc7 100644 --- a/cmd/apply_repos.go +++ b/cmd/apply_repos.go @@ -11,7 +11,6 @@ import ( "github.com/gomicro/concord/client" gh_pb "github.com/gomicro/concord/github/v1" "github.com/gomicro/concord/manifest" - "github.com/gomicro/concord/report" "github.com/google/go-github/v56/github" "github.com/spf13/cobra" "golang.org/x/exp/slices" @@ -61,8 +60,8 @@ func applyReposRun(cmd *cobra.Command, args []string) error { return handleError(cmd, errors.New("organization does not exist")) } - report.PrintHeader("Org") - report.Println() + scrb.BeginDescribe("Organization") + defer scrb.EndDescribe() err = reposRun(cmd, args) if err != nil { @@ -96,9 +95,8 @@ func reposRun(cmd *cobra.Command, args []string) error { return handleError(cmd, err) } - report.Println() - report.PrintHeader("Repos") - report.Println() + scrb.BeginDescribe("Repositories") + defer scrb.EndDescribe() repos, err := clt.GetRepos(ctx, org.Name) if err != nil { @@ -120,31 +118,26 @@ func reposRun(cmd *cobra.Command, args []string) error { for _, r := range org.Repositories { if _, found := targetMap[r.Name]; found { - report.Println() - report.PrintHeader(r.Name) - report.Println() + scrb.BeginDescribe(r.Name) + scrb.EndDescribe() if r.Archived != nil && *r.Archived { - report.PrintInfo("repo is archived, skipping") - report.Println() + scrb.Done("repo is archived, skipping") continue } err := ensureRepo(ctx, org.Name, r) if err != nil { - report.PrintError(err.Error()) + scrb.Done(err.Error()) // TODO: error color } } } if len(args) == 0 { for _, mr := range unmanaged { - report.Println() - report.PrintHeader(mr) - report.Println() - - report.PrintWarn("repo exists in github but not in manifest") - report.Println() + scrb.BeginDescribe(mr) + scrb.EndDescribe() + scrb.Done("repo exists in github but not in manifest") // TODO: warn } } @@ -201,8 +194,7 @@ func ensureRepo(ctx context.Context, org string, repo *gh_pb.Repository) error { if !slices.Equal(ghl, l) { clt.SetRepoTopics(ctx, org, repo.Name, l) } else { - report.PrintInfo("labels are [" + strings.Join(l, ", ") + "]") - report.Println() + scrb.Done("labels are [" + strings.Join(l, ", ") + "]") } } @@ -238,7 +230,7 @@ func buildRepoEdits(repo *gh_pb.Repository, ghr *github.Repository, fresh bool) } // Nothing else can be done with archived repos if *repo.Archived { - fmt.Printf("repo %s is archived, skipping\n", repo.Name) + scrb.Done("repo " + repo.Name + " is archived, skipping") return edits } } diff --git a/cmd/apply_teams.go b/cmd/apply_teams.go index 8b7f825..124cbf4 100644 --- a/cmd/apply_teams.go +++ b/cmd/apply_teams.go @@ -9,7 +9,6 @@ import ( "github.com/gomicro/concord/client" gh_pb "github.com/gomicro/concord/github/v1" "github.com/gomicro/concord/manifest" - "github.com/gomicro/concord/report" "github.com/google/go-github/v56/github" "github.com/spf13/cobra" ) @@ -58,8 +57,8 @@ func applyTeamsRun(cmd *cobra.Command, args []string) error { return handleError(cmd, errors.New("organization does not exist")) } - report.PrintHeader("Org") - report.Println() + scrb.BeginDescribe("Organization") + defer scrb.EndDescribe() err = teamsRun(cmd, args) if err != nil { @@ -93,9 +92,8 @@ func teamsRun(cmd *cobra.Command, args []string) error { return handleError(cmd, err) } - report.Println() - report.PrintHeader("Teams") - report.Println() + scrb.BeginDescribe("Teams") + defer scrb.EndDescribe() tms, err := clt.GetTeams(ctx, org.Name) if err != nil { @@ -105,8 +103,8 @@ func teamsRun(cmd *cobra.Command, args []string) error { missing, managed, unmanaged := getTeamsBreakdown(org.Teams, tms) for _, mt := range missing { - report.PrintHeader(mt) - report.Println() + scrb.BeginDescribe(mt) + scrb.EndDescribe() clt.CreateTeam(ctx, org.Name, mt) @@ -115,16 +113,13 @@ func teamsRun(cmd *cobra.Command, args []string) error { for _, m := range missing { clt.InviteTeamMember(ctx, org.GetName(), mt, m) } - - report.Println() } for _, mt := range managed { - report.PrintHeader(mt) - report.Println() + scrb.BeginDescribe(mt) + scrb.EndDescribe() - report.PrintInfo("team exists in github") - report.Println() + scrb.Done("team exists in github") ms, err := clt.GetTeamMembers(ctx, org.Name, mt) if err != nil { @@ -137,26 +132,18 @@ func teamsRun(cmd *cobra.Command, args []string) error { } for _, m := range managed { - report.PrintInfo(m + " exists in team") - report.Println() + scrb.Done(m + " exists in team") } for _, m := range unmanaged { - report.PrintWarn(m + " exists in team but not in manifest") - report.Println() + scrb.Done(m + " exists in team but not in manifest") } - - report.Println() } for _, mt := range unmanaged { - report.PrintHeader(mt) - report.Println() - - report.PrintWarn("team exists in github but not in manifest") - report.Println() - - report.Println() + scrb.BeginDescribe(mt) + scrb.EndDescribe() + scrb.Done("team exists in github but not in manifest") // TODO: warn } return nil diff --git a/cmd/root.go b/cmd/root.go index 4e6ba39..9e2c56e 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -11,15 +11,28 @@ import ( "github.com/gomicro/concord/client" "github.com/gomicro/concord/config" "github.com/gomicro/concord/report" + "github.com/gomicro/scribe" "github.com/spf13/cobra" ) +var scrb scribe.Scriber + func init() { cobra.OnInitialize(initEnvs) rootCmd.PersistentFlags().StringP("file", "f", "concord.yml", "Path to a file containing a manifest") rootCmd.PersistentFlags().Bool("dry", false, "Print out the actions that would be taken without actually taking them") rootCmd.PersistentFlags().Bool("force", false, "Force the action to be taken without prompting for confirmation") + + t := &scribe.Theme{ + Describe: func(s string) string { + // Cyan + return fmt.Sprintf("\033[36m%s\033[0m", s) + }, + Done: scribe.NoopDecorator, + } + + scrb = scribe.NewScribe(os.Stdout, t) } func initEnvs() { From fe21841d574214f0f25d5f080489135f98667470 Mon Sep 17 00:00:00 2001 From: Daniel Hess Date: Sun, 23 Feb 2025 02:06:11 -0800 Subject: [PATCH 2/8] deps changes --- go.mod | 3 +- go.sum | 16 +++++++ vendor/github.com/gomicro/scribe/LICENSE.md | 21 +++++++++ vendor/github.com/gomicro/scribe/README.md | 12 +++++ vendor/github.com/gomicro/scribe/scribe.go | 52 +++++++++++++++++++++ vendor/github.com/gomicro/scribe/scriber.go | 7 +++ vendor/github.com/gomicro/scribe/theme.go | 15 ++++++ vendor/modules.txt | 3 ++ 8 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 vendor/github.com/gomicro/scribe/LICENSE.md create mode 100644 vendor/github.com/gomicro/scribe/README.md create mode 100644 vendor/github.com/gomicro/scribe/scribe.go create mode 100644 vendor/github.com/gomicro/scribe/scriber.go create mode 100644 vendor/github.com/gomicro/scribe/theme.go diff --git a/go.mod b/go.mod index 385ab21..d5ba14c 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,11 @@ module github.com/gomicro/concord -go 1.21 +go 1.23.3 require ( buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20231030212536-12f9cba37c9d.2 github.com/bufbuild/protovalidate-go v0.4.0 + github.com/gomicro/scribe v0.0.0-20250223093115-683c0d552f02 github.com/gomicro/trust v0.0.1 github.com/google/go-github/v56 v56.0.0 github.com/spf13/cobra v1.7.0 diff --git a/go.sum b/go.sum index 47c846a..7709082 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,11 @@ buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20231030212536-12f9cba37c9d.2 h1:m8rKyv88R8ZIR1549RMXckZ4FZJGxrq/7aRYl6U3WHc= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20231030212536-12f9cba37c9d.2/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew= +github.com/alecthomas/assert v1.0.0 h1:3XmGh/PSuLzDbK3W2gUbRXwgW5lqPkuqvRgeQ30FI5o= +github.com/alecthomas/assert v1.0.0/go.mod h1:va/d2JC+M7F6s+80kl/R3G7FUiW6JzUO+hPhLyJ36ZY= +github.com/alecthomas/colour v0.1.0 h1:nOE9rJm6dsZ66RGWYSFrXw461ZIt9A6+nHgL7FRrDUk= +github.com/alecthomas/colour v0.1.0/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= +github.com/alecthomas/repr v0.0.0-20210801044451-80ca428c5142 h1:8Uy0oSf5co/NZXje7U1z8Mpep++QJOldL2hs/sBQf48= +github.com/alecthomas/repr v0.0.0-20210801044451-80ca428c5142/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 h1:goHVqTbFX3AIo0tzGr14pgfAW2ZfPChKO21Z9MGf/gk= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= github.com/bufbuild/protovalidate-go v0.4.0 h1:ModSkCLEW07fiyGtdtMXKY+Gz3oPFKSfiaSCgL+FtpU= @@ -19,6 +25,10 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/gomicro/penname v0.1.1 h1:a2qxU00YqcnJK4Ll2OYDVQtaAxBZP9rWj8s/C1i8kZg= +github.com/gomicro/penname v0.1.1/go.mod h1:cDMwvmx4wzDLYzPNR9Z9sEw/ekYfpyiQMEtGMusHfgI= +github.com/gomicro/scribe v0.0.0-20250223093115-683c0d552f02 h1:99UYcYxv/CVIw5EMVn3euak6xjpfYdbS8N5kmh4Leu8= +github.com/gomicro/scribe v0.0.0-20250223093115-683c0d552f02/go.mod h1:Xe4GOodbsqCXIlsCq1LvIYSGpzqHTNAuF8C8omS/334= github.com/gomicro/trust v0.0.1 h1:eU4pS5ke8ycKeIjddUaSwGiB5tEaWb4yfC0UzGsaKrM= github.com/gomicro/trust v0.0.1/go.mod h1:crE5Bq44opTM2nYZ0q+rh9Xcoi3FTR37oBHybrk2Wlc= github.com/google/cel-go v0.18.1 h1:V/lAXKq4C3BYLDy/ARzMtpkEEYfHQpZzVyzy69nEUjs= @@ -38,6 +48,8 @@ github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.10.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E= @@ -45,6 +57,8 @@ github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -71,6 +85,8 @@ golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= diff --git a/vendor/github.com/gomicro/scribe/LICENSE.md b/vendor/github.com/gomicro/scribe/LICENSE.md new file mode 100644 index 0000000..99e9832 --- /dev/null +++ b/vendor/github.com/gomicro/scribe/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2025 Gomicro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/gomicro/scribe/README.md b/vendor/github.com/gomicro/scribe/README.md new file mode 100644 index 0000000..6309a15 --- /dev/null +++ b/vendor/github.com/gomicro/scribe/README.md @@ -0,0 +1,12 @@ +# Scribe +Scribe is prompt report printing tool for gomicro tools. + +# Versioning +The tool will be versioned in accordance with [Semver 2.0.0](http://semver.org). +See the [releases](https://github.com/gomicro/align/releases) section for the +latest version. Until version 1.0.0 the tool is considered to be unstable. + +It is always highly recommended to vendor the version you are using. + +# License +See [LICENSE.md](./LICENSE.md) for more information. diff --git a/vendor/github.com/gomicro/scribe/scribe.go b/vendor/github.com/gomicro/scribe/scribe.go new file mode 100644 index 0000000..0bb1af2 --- /dev/null +++ b/vendor/github.com/gomicro/scribe/scribe.go @@ -0,0 +1,52 @@ +package scribe + +import ( + "fmt" + "io" + "strings" +) + +type Scribe struct { + writer io.Writer + level int + theme *Theme +} + +func NewScribe(writer io.Writer, theme *Theme) Scriber { + return &Scribe{ + writer: writer, + theme: theme, + } +} + +func (s *Scribe) BeginDescribe(desc string) { + s.println() + s.printt(s.theme.Describe(desc)) + s.level++ +} + +func (s *Scribe) EndDescribe() { + s.level-- +} + +func (s *Scribe) Done(done string) { + s.level++ + s.printt(s.theme.Done(done)) + s.level-- +} + +func (s *Scribe) print(str string) { + fmt.Fprintf(s.writer, "%v\n", str) +} + +func (s *Scribe) printt(str string) { + s.print(fmt.Sprintf("%v%v", s.space(), str)) +} + +func (s *Scribe) println() { + s.print("") +} + +func (s *Scribe) space() string { + return strings.Repeat(" ", s.level*2) +} diff --git a/vendor/github.com/gomicro/scribe/scriber.go b/vendor/github.com/gomicro/scribe/scriber.go new file mode 100644 index 0000000..7d4afd9 --- /dev/null +++ b/vendor/github.com/gomicro/scribe/scriber.go @@ -0,0 +1,7 @@ +package scribe + +type Scriber interface { + BeginDescribe(desc string) + EndDescribe() + Done(done string) +} diff --git a/vendor/github.com/gomicro/scribe/theme.go b/vendor/github.com/gomicro/scribe/theme.go new file mode 100644 index 0000000..b54cc04 --- /dev/null +++ b/vendor/github.com/gomicro/scribe/theme.go @@ -0,0 +1,15 @@ +package scribe + +type Theme struct { + Describe func(string) string + Done func(string) string +} + +var DefaultTheme = &Theme{ + Describe: NoopDecorator, + Done: NoopDecorator, +} + +func NoopDecorator(s string) string { + return s +} diff --git a/vendor/modules.txt b/vendor/modules.txt index ff131b8..d7c1489 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -19,6 +19,9 @@ github.com/bufbuild/protovalidate-go/resolver # github.com/golang/protobuf v1.5.3 ## explicit; go 1.9 github.com/golang/protobuf/proto +# github.com/gomicro/scribe v0.0.0-20250223093115-683c0d552f02 +## explicit; go 1.23.3 +github.com/gomicro/scribe # github.com/gomicro/trust v0.0.1 ## explicit; go 1.13 github.com/gomicro/trust From 665278fbd1bd98eae5b1b7c288800143ee398e7d Mon Sep 17 00:00:00 2001 From: Daniel Hess Date: Sun, 23 Feb 2025 16:00:36 -0800 Subject: [PATCH 3/8] another round of deps updates --- go.mod | 2 +- go.sum | 4 +- .../github.com/gomicro/scribe/color/color.go | 101 ++++++++++++++++++ vendor/github.com/gomicro/scribe/scribe.go | 4 +- vendor/github.com/gomicro/scribe/scriber.go | 2 +- vendor/github.com/gomicro/scribe/theme.go | 4 +- vendor/modules.txt | 3 +- 7 files changed, 111 insertions(+), 9 deletions(-) create mode 100644 vendor/github.com/gomicro/scribe/color/color.go diff --git a/go.mod b/go.mod index d5ba14c..3718d50 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.3 require ( buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20231030212536-12f9cba37c9d.2 github.com/bufbuild/protovalidate-go v0.4.0 - github.com/gomicro/scribe v0.0.0-20250223093115-683c0d552f02 + github.com/gomicro/scribe v0.0.0-20250223233355-e4d63fcf11e3 github.com/gomicro/trust v0.0.1 github.com/google/go-github/v56 v56.0.0 github.com/spf13/cobra v1.7.0 diff --git a/go.sum b/go.sum index 7709082..a3d78ff 100644 --- a/go.sum +++ b/go.sum @@ -27,8 +27,8 @@ github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/gomicro/penname v0.1.1 h1:a2qxU00YqcnJK4Ll2OYDVQtaAxBZP9rWj8s/C1i8kZg= github.com/gomicro/penname v0.1.1/go.mod h1:cDMwvmx4wzDLYzPNR9Z9sEw/ekYfpyiQMEtGMusHfgI= -github.com/gomicro/scribe v0.0.0-20250223093115-683c0d552f02 h1:99UYcYxv/CVIw5EMVn3euak6xjpfYdbS8N5kmh4Leu8= -github.com/gomicro/scribe v0.0.0-20250223093115-683c0d552f02/go.mod h1:Xe4GOodbsqCXIlsCq1LvIYSGpzqHTNAuF8C8omS/334= +github.com/gomicro/scribe v0.0.0-20250223233355-e4d63fcf11e3 h1:DDv8+ajvIhzO3OMwIiOic0T9tGMkLRuJI6WHvlMm26E= +github.com/gomicro/scribe v0.0.0-20250223233355-e4d63fcf11e3/go.mod h1:Xe4GOodbsqCXIlsCq1LvIYSGpzqHTNAuF8C8omS/334= github.com/gomicro/trust v0.0.1 h1:eU4pS5ke8ycKeIjddUaSwGiB5tEaWb4yfC0UzGsaKrM= github.com/gomicro/trust v0.0.1/go.mod h1:crE5Bq44opTM2nYZ0q+rh9Xcoi3FTR37oBHybrk2Wlc= github.com/google/cel-go v0.18.1 h1:V/lAXKq4C3BYLDy/ARzMtpkEEYfHQpZzVyzy69nEUjs= diff --git a/vendor/github.com/gomicro/scribe/color/color.go b/vendor/github.com/gomicro/scribe/color/color.go new file mode 100644 index 0000000..08a3eb3 --- /dev/null +++ b/vendor/github.com/gomicro/scribe/color/color.go @@ -0,0 +1,101 @@ +package color + +import "fmt" + +const ( + escape = "\x1b" +) + +const ( + Reset = iota +) + +const ( + FgBlack = iota + 30 + FgRed + FgGreen + FgYellow + FgBlue + FgMagenta + FgCyan + FgWhite +) + +const ( + FgHiBlack = iota + 90 + FgHiRed + FgHiGreen + FgHiYellow + FgHiBlue + FgHiMagenta + FgHiCyan + FgHiWhite +) + +func unset() string { + return fmt.Sprintf("%s[%dm", escape, Reset) +} + +func BlackFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgBlack, s, unset()) +} + +func RedFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgRed, s, unset()) +} + +func GreenFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgGreen, s, unset()) +} + +func YellowFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgYellow, s, unset()) +} + +func BlueFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgBlue, s, unset()) +} + +func MagentaFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgMagenta, s, unset()) +} + +func CyanFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgCyan, s, unset()) +} + +func WhiteFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgWhite, s, unset()) +} + +func HiBlackFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgHiBlack, s, unset()) +} + +func HiRedFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgHiRed, s, unset()) +} + +func HiGreenFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgHiGreen, s, unset()) +} + +func HiYellowFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgHiYellow, s, unset()) +} + +func HiBlueFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgHiBlue, s, unset()) +} + +func HiMagentaFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgHiMagenta, s, unset()) +} + +func HiCyanFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgHiCyan, s, unset()) +} + +func HiWhiteFg(s string) string { + return fmt.Sprintf("%s[1;%dm%s%s", escape, FgHiWhite, s, unset()) +} diff --git a/vendor/github.com/gomicro/scribe/scribe.go b/vendor/github.com/gomicro/scribe/scribe.go index 0bb1af2..96101bb 100644 --- a/vendor/github.com/gomicro/scribe/scribe.go +++ b/vendor/github.com/gomicro/scribe/scribe.go @@ -29,9 +29,9 @@ func (s *Scribe) EndDescribe() { s.level-- } -func (s *Scribe) Done(done string) { +func (s *Scribe) Print(str string) { s.level++ - s.printt(s.theme.Done(done)) + s.printt(s.theme.Print(str)) s.level-- } diff --git a/vendor/github.com/gomicro/scribe/scriber.go b/vendor/github.com/gomicro/scribe/scriber.go index 7d4afd9..bf1b6a7 100644 --- a/vendor/github.com/gomicro/scribe/scriber.go +++ b/vendor/github.com/gomicro/scribe/scriber.go @@ -3,5 +3,5 @@ package scribe type Scriber interface { BeginDescribe(desc string) EndDescribe() - Done(done string) + Print(done string) } diff --git a/vendor/github.com/gomicro/scribe/theme.go b/vendor/github.com/gomicro/scribe/theme.go index b54cc04..4892221 100644 --- a/vendor/github.com/gomicro/scribe/theme.go +++ b/vendor/github.com/gomicro/scribe/theme.go @@ -2,12 +2,12 @@ package scribe type Theme struct { Describe func(string) string - Done func(string) string + Print func(string) string } var DefaultTheme = &Theme{ Describe: NoopDecorator, - Done: NoopDecorator, + Print: NoopDecorator, } func NoopDecorator(s string) string { diff --git a/vendor/modules.txt b/vendor/modules.txt index d7c1489..13f47f0 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -19,9 +19,10 @@ github.com/bufbuild/protovalidate-go/resolver # github.com/golang/protobuf v1.5.3 ## explicit; go 1.9 github.com/golang/protobuf/proto -# github.com/gomicro/scribe v0.0.0-20250223093115-683c0d552f02 +# github.com/gomicro/scribe v0.0.0-20250223233355-e4d63fcf11e3 ## explicit; go 1.23.3 github.com/gomicro/scribe +github.com/gomicro/scribe/color # github.com/gomicro/trust v0.0.1 ## explicit; go 1.13 github.com/gomicro/trust From d066479d3cb4fde86379fe51fd938a0943bd7bb3 Mon Sep 17 00:00:00 2001 From: Daniel Hess Date: Sun, 23 Feb 2025 16:01:03 -0800 Subject: [PATCH 4/8] switch everything we can to use scribe for print thus far --- client/repos.go | 22 +++++++++------------- cmd/apply_members.go | 6 +++--- cmd/apply_repos.go | 16 ++++++++-------- cmd/apply_teams.go | 8 ++++---- cmd/root.go | 6 +++--- 5 files changed, 27 insertions(+), 31 deletions(-) diff --git a/client/repos.go b/client/repos.go index 238b4f7..76d1644 100644 --- a/client/repos.go +++ b/client/repos.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/gomicro/concord/report" + "github.com/gomicro/scribe" "github.com/google/go-github/v56/github" ) @@ -147,7 +148,7 @@ func (c *Client) GetRepoTeams(ctx context.Context, org, repo string) ([]*github. return teams, nil } -func (c *Client) AddRepoToTeam(ctx context.Context, org, team, repo, perm string) error { +func (c *Client) AddRepoToTeam(ctx context.Context, scrb scribe.Scriber, org, team, repo, perm string) error { gts, err := c.GetRepoTeams(ctx, org, repo) if err != nil { return fmt.Errorf("add repo team: %w", err) @@ -169,13 +170,11 @@ func (c *Client) AddRepoToTeam(ctx context.Context, org, team, repo, perm string } if relationExists && strings.EqualFold(tp, p) { - report.PrintInfo("team '" + team + "' has permission '" + perm + "'") - report.Println() + scrb.Print("team '" + team + "' already has permission '" + perm + "'") return nil } - report.PrintAdd("adding repo to team '" + team + "' with '" + perm + "'") - report.Println() + scrb.Print("adding repo to team '" + team + "' with '" + perm + "'") //TODO: Green for add c.Add(func() error { c.rate.Wait(ctx) //nolint: errcheck @@ -462,7 +461,7 @@ func (c *Client) SetRepoTopics(ctx context.Context, org, repo string, topics []s }) } -func (c *Client) ProtectBranch(ctx context.Context, org, repo, branch string, protection *github.ProtectionRequest) error { +func (c *Client) ProtectBranch(ctx context.Context, scrb scribe.Scriber, org, repo, branch string, protection *github.ProtectionRequest) error { ghpb, err := c.GetBranchProtection(ctx, org, repo, branch) if err != nil && !errors.Is(err, ErrBranchProtectionNotFound) { return err @@ -471,8 +470,7 @@ func (c *Client) ProtectBranch(ctx context.Context, org, repo, branch string, pr cs := &report.ChangeSet{} if ghpb != nil { - report.PrintInfo(branch + " branch protected") - report.Println() + scrb.Print(branch + " branch protected") } else { cs.Add("protecting branch "+branch, "protected branch "+branch) } @@ -503,8 +501,7 @@ func (c *Client) ProtectBranch(ctx context.Context, org, repo, branch string, pr cs.Add("setting required checks to ["+strings.Join(checks, ", ")+"]", "set required checks to ["+strings.Join(checks, ", ")+"]") } } else { - report.PrintInfo("status checks required") - report.Println() + scrb.Print("status checks required") } } else { if ghpb.GetRequiredStatusChecks() != nil { @@ -541,7 +538,7 @@ func (c *Client) ProtectBranch(ctx context.Context, org, repo, branch string, pr return nil } -func (c *Client) SetRequireSignedCommits(ctx context.Context, org, repo, branch string, require bool) error { +func (c *Client) SetRequireSignedCommits(ctx context.Context, scrb scribe.Scriber, org, repo, branch string, require bool) error { ghpb, err := c.GetBranchProtection(ctx, org, repo, branch) if err != nil && !errors.Is(err, ErrBranchProtectionNotFound) { return err @@ -552,8 +549,7 @@ func (c *Client) SetRequireSignedCommits(ctx context.Context, org, repo, branch if ghpb.GetRequiredSignatures().GetEnabled() != require { cs.Add(fmt.Sprintf("setting require signed commits to '%t'", require), fmt.Sprintf("set require signed commits to '%t'", require)) } else { - report.PrintInfo(fmt.Sprintf("require signed commits is '%t'", require)) - report.Println() + scrb.Print(fmt.Sprintf("require signed commits is '%t'", require)) } cs.PrintPre() diff --git a/cmd/apply_members.go b/cmd/apply_members.go index 00233c4..037dcf7 100644 --- a/cmd/apply_members.go +++ b/cmd/apply_members.go @@ -104,15 +104,15 @@ func membersRun(cmd *cobra.Command, args []string) error { for _, m := range missing { clt.InviteMember(ctx, org.Name, m) - scrb.Done("Invited " + m) + scrb.Print("Invited " + m) } for _, m := range managed { - scrb.Done(m + " exists in github") + scrb.Print(m + " exists in github") } for _, m := range unmanaged { - scrb.Done(m + " exists in github but not in manifest") + scrb.Print(m + " exists in github but not in manifest") } return nil diff --git a/cmd/apply_repos.go b/cmd/apply_repos.go index 7d3ecc7..3cc6ae7 100644 --- a/cmd/apply_repos.go +++ b/cmd/apply_repos.go @@ -122,13 +122,13 @@ func reposRun(cmd *cobra.Command, args []string) error { scrb.EndDescribe() if r.Archived != nil && *r.Archived { - scrb.Done("repo is archived, skipping") + scrb.Print("repo is archived, skipping") continue } err := ensureRepo(ctx, org.Name, r) if err != nil { - scrb.Done(err.Error()) // TODO: error color + scrb.Print(err.Error()) // TODO: error color } } } @@ -137,7 +137,7 @@ func reposRun(cmd *cobra.Command, args []string) error { for _, mr := range unmanaged { scrb.BeginDescribe(mr) scrb.EndDescribe() - scrb.Done("repo exists in github but not in manifest") // TODO: warn + scrb.Print("repo exists in github but not in manifest") // TODO: warn } } @@ -194,7 +194,7 @@ func ensureRepo(ctx context.Context, org string, repo *gh_pb.Repository) error { if !slices.Equal(ghl, l) { clt.SetRepoTopics(ctx, org, repo.Name, l) } else { - scrb.Done("labels are [" + strings.Join(l, ", ") + "]") + scrb.Print("labels are [" + strings.Join(l, ", ") + "]") } } @@ -230,7 +230,7 @@ func buildRepoEdits(repo *gh_pb.Repository, ghr *github.Repository, fresh bool) } // Nothing else can be done with archived repos if *repo.Archived { - scrb.Done("repo " + repo.Name + " is archived, skipping") + scrb.Print("repo " + repo.Name + " is archived, skipping") return edits } } @@ -294,7 +294,7 @@ func setTeamPermissions(ctx context.Context, org string, repo *gh_pb.Repository, for p, teams := range repo.Permissions { for _, t := range teams.Teams { - err = clt.AddRepoToTeam(ctx, org, strings.ToLower(t), repo.Name, p) + err = clt.AddRepoToTeam(ctx, scrb, org, strings.ToLower(t), repo.Name, p) if err != nil { return err } @@ -341,13 +341,13 @@ func setBranchProtection(ctx context.Context, org string, repo *gh_pb.Repository return err } - err = clt.ProtectBranch(ctx, org, repo.Name, branch.Name, state) + err = clt.ProtectBranch(ctx, scrb, org, repo.Name, branch.Name, state) if err != nil { return err } if branch.GetProtection() != nil { - err = clt.SetRequireSignedCommits(ctx, org, repo.Name, branch.Name, branch.GetProtection().GetSignedCommits()) + err = clt.SetRequireSignedCommits(ctx, scrb, org, repo.Name, branch.Name, branch.GetProtection().GetSignedCommits()) if err != nil { return err } diff --git a/cmd/apply_teams.go b/cmd/apply_teams.go index 124cbf4..580b7e5 100644 --- a/cmd/apply_teams.go +++ b/cmd/apply_teams.go @@ -119,7 +119,7 @@ func teamsRun(cmd *cobra.Command, args []string) error { scrb.BeginDescribe(mt) scrb.EndDescribe() - scrb.Done("team exists in github") + scrb.Print("team exists in github") ms, err := clt.GetTeamMembers(ctx, org.Name, mt) if err != nil { @@ -132,18 +132,18 @@ func teamsRun(cmd *cobra.Command, args []string) error { } for _, m := range managed { - scrb.Done(m + " exists in team") + scrb.Print(m + " exists in team") } for _, m := range unmanaged { - scrb.Done(m + " exists in team but not in manifest") + scrb.Print(m + " exists in team but not in manifest") } } for _, mt := range unmanaged { scrb.BeginDescribe(mt) scrb.EndDescribe() - scrb.Done("team exists in github but not in manifest") // TODO: warn + scrb.Print("team exists in github but not in manifest") // TODO: warn } return nil diff --git a/cmd/root.go b/cmd/root.go index 9e2c56e..3f1dbbe 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -12,6 +12,7 @@ import ( "github.com/gomicro/concord/config" "github.com/gomicro/concord/report" "github.com/gomicro/scribe" + "github.com/gomicro/scribe/color" "github.com/spf13/cobra" ) @@ -26,10 +27,9 @@ func init() { t := &scribe.Theme{ Describe: func(s string) string { - // Cyan - return fmt.Sprintf("\033[36m%s\033[0m", s) + return color.CyanFg(s) }, - Done: scribe.NoopDecorator, + Print: scribe.NoopDecorator, } scrb = scribe.NewScribe(os.Stdout, t) From 06de448919ca5db289cd67d478962551aa2e4a84 Mon Sep 17 00:00:00 2001 From: Daniel Hess Date: Sun, 23 Feb 2025 16:26:52 -0800 Subject: [PATCH 5/8] take care of the current todos for color --- client/repos.go | 3 ++- cmd/apply_repos.go | 5 +++-- cmd/apply_teams.go | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/client/repos.go b/client/repos.go index 76d1644..574264e 100644 --- a/client/repos.go +++ b/client/repos.go @@ -9,6 +9,7 @@ import ( "github.com/gomicro/concord/report" "github.com/gomicro/scribe" + "github.com/gomicro/scribe/color" "github.com/google/go-github/v56/github" ) @@ -174,7 +175,7 @@ func (c *Client) AddRepoToTeam(ctx context.Context, scrb scribe.Scriber, org, te return nil } - scrb.Print("adding repo to team '" + team + "' with '" + perm + "'") //TODO: Green for add + scrb.Print(color.GreenFg("adding repo to team '" + team + "' with '" + perm + "'")) c.Add(func() error { c.rate.Wait(ctx) //nolint: errcheck diff --git a/cmd/apply_repos.go b/cmd/apply_repos.go index 3cc6ae7..1a5c266 100644 --- a/cmd/apply_repos.go +++ b/cmd/apply_repos.go @@ -11,6 +11,7 @@ import ( "github.com/gomicro/concord/client" gh_pb "github.com/gomicro/concord/github/v1" "github.com/gomicro/concord/manifest" + "github.com/gomicro/scribe/color" "github.com/google/go-github/v56/github" "github.com/spf13/cobra" "golang.org/x/exp/slices" @@ -128,7 +129,7 @@ func reposRun(cmd *cobra.Command, args []string) error { err := ensureRepo(ctx, org.Name, r) if err != nil { - scrb.Print(err.Error()) // TODO: error color + scrb.Print(color.RedFg(err.Error())) } } } @@ -137,7 +138,7 @@ func reposRun(cmd *cobra.Command, args []string) error { for _, mr := range unmanaged { scrb.BeginDescribe(mr) scrb.EndDescribe() - scrb.Print("repo exists in github but not in manifest") // TODO: warn + scrb.Print(color.YellowFg("repo exists in github but not in manifest")) } } diff --git a/cmd/apply_teams.go b/cmd/apply_teams.go index 580b7e5..f500049 100644 --- a/cmd/apply_teams.go +++ b/cmd/apply_teams.go @@ -9,6 +9,7 @@ import ( "github.com/gomicro/concord/client" gh_pb "github.com/gomicro/concord/github/v1" "github.com/gomicro/concord/manifest" + "github.com/gomicro/scribe/color" "github.com/google/go-github/v56/github" "github.com/spf13/cobra" ) @@ -143,7 +144,7 @@ func teamsRun(cmd *cobra.Command, args []string) error { for _, mt := range unmanaged { scrb.BeginDescribe(mt) scrb.EndDescribe() - scrb.Print("team exists in github but not in manifest") // TODO: warn + scrb.Print(color.YellowFg("team exists in github but not in manifest")) } return nil From c6c0b3e328c50a38c15f226adccf53b1eae8b2ba Mon Sep 17 00:00:00 2001 From: Daniel Hess Date: Sun, 23 Feb 2025 21:32:37 -0800 Subject: [PATCH 6/8] undo everything for the change sets and use scribe --- client/client.go | 21 +++-- client/orgs.go | 51 ++++++------ client/repos.go | 184 ++++++++++++++++++++++++++++--------------- client/teams.go | 19 ++--- cmd/apply.go | 12 +-- cmd/apply_members.go | 2 +- cmd/apply_org.go | 2 +- cmd/apply_repos.go | 40 ++++++---- cmd/apply_teams.go | 6 +- cmd/root.go | 6 +- report/changeset.go | 35 -------- report/report.go | 46 ----------- 12 files changed, 208 insertions(+), 216 deletions(-) delete mode 100644 report/changeset.go delete mode 100644 report/report.go diff --git a/client/client.go b/client/client.go index 46760f6..0040c42 100644 --- a/client/client.go +++ b/client/client.go @@ -6,8 +6,10 @@ import ( "errors" "fmt" "net/http" + "os" - "github.com/gomicro/concord/report" + "github.com/gomicro/scribe" + "github.com/gomicro/scribe/color" "github.com/gomicro/trust" "github.com/google/go-github/v56/github" "golang.org/x/oauth2" @@ -77,15 +79,22 @@ func (c *Client) Apply() error { return nil } - report.Println() - report.PrintHeader("Applying") - report.Println() + t := &scribe.Theme{ + Describe: func(s string) string { + return color.CyanFg(s) + }, + Print: scribe.NoopDecorator, + } + + scrb := scribe.NewScribe(os.Stdout, t) + + scrb.BeginDescribe("Applying") + scrb.EndDescribe() for _, fn := range c.stack { err := fn() if err != nil { - report.PrintError(err.Error()) - report.Println() + scrb.Print(color.RedFg(err.Error())) } } diff --git a/client/orgs.go b/client/orgs.go index 32e5f0f..02869e5 100644 --- a/client/orgs.go +++ b/client/orgs.go @@ -6,7 +6,8 @@ import ( "fmt" "net/http" - "github.com/gomicro/concord/report" + "github.com/gomicro/scribe" + "github.com/gomicro/scribe/color" "github.com/google/go-github/v56/github" ) @@ -60,11 +61,8 @@ func (c *Client) GetMembers(ctx context.Context, orgName string) ([]*github.User return members, nil } -func (c *Client) InviteMember(ctx context.Context, orgName string, username string) { - cs := &report.ChangeSet{} - - cs.Add("invite "+username, "invited "+username) - cs.PrintPre() +func (c *Client) InviteMember(ctx context.Context, scrb scribe.Scriber, orgName string, username string) { + scrb.Print(color.GreenFg("invite " + username)) c.Add(func() error { user, resp, err := c.ghClient.Users.Get(ctx, username) @@ -91,13 +89,13 @@ func (c *Client) InviteMember(ctx context.Context, orgName string, username stri return err } - cs.PrintPost() + scrb.Print(color.GreenFg("invited " + username)) return nil }) } -func (c *Client) SetOrgPrivileges(ctx context.Context, orgName string, edits *github.Organization) error { +func (c *Client) SetOrgPrivileges(ctx context.Context, scrb scribe.Scriber, orgName string, edits *github.Organization) error { ghOrg, _, err := c.ghClient.Organizations.Get(ctx, orgName) if err != nil { if _, ok := err.(*github.RateLimitError); ok { @@ -113,31 +111,24 @@ func (c *Client) SetOrgPrivileges(ctx context.Context, orgName string, edits *gi return err } - cs := &report.ChangeSet{} - + base := false if edits.DefaultRepoPermission != nil && *edits.DefaultRepoPermission != *ghOrg.DefaultRepoPermission { - cs.Add( - fmt.Sprintf("setting base permissions to '%s'", *edits.DefaultRepoPermission), - fmt.Sprintf("set base permissions to '%s'", *edits.DefaultRepoPermission), - ) + scrb.Print(color.GreenFg(fmt.Sprintf("setting base permissions to '%s'", *edits.DefaultRepoPermission))) + base = true } + prvRepos := false if edits.MembersCanCreatePrivateRepos != nil && *edits.MembersCanCreatePrivateRepos != *ghOrg.MembersCanCreatePrivateRepos { - cs.Add( - fmt.Sprintf("setting private repo creation to '%t'", *edits.MembersCanCreatePrivateRepos), - fmt.Sprintf("set private repo creation to '%t'", *edits.MembersCanCreatePrivateRepos), - ) + scrb.Print(color.GreenFg(fmt.Sprintf("setting private repo creation to '%t'", *edits.MembersCanCreatePrivateRepos))) + prvRepos = true } + pubRepos := false if edits.MembersCanCreatePublicRepos != nil && *edits.MembersCanCreatePublicRepos != *ghOrg.MembersCanCreatePublicRepos { - cs.Add( - fmt.Sprintf("setting public repo creation to '%t'", *edits.MembersCanCreatePublicRepos), - fmt.Sprintf("set public repo creation to '%t'", *edits.MembersCanCreatePublicRepos), - ) + scrb.Print(color.GreenFg(fmt.Sprintf("setting public repo creation to '%t'", *edits.MembersCanCreatePublicRepos))) + pubRepos = true } - cs.PrintPre() - c.Add(func() error { _, resp, err := c.ghClient.Organizations.Edit(ctx, orgName, edits) if err != nil { @@ -152,7 +143,17 @@ func (c *Client) SetOrgPrivileges(ctx context.Context, orgName string, edits *gi return err } - cs.PrintPost() + if base { + scrb.Print(color.GreenFg(fmt.Sprintf("set base permissions to '%s'", *edits.DefaultRepoPermission))) + } + + if prvRepos { + scrb.Print(color.GreenFg(fmt.Sprintf("set private repo creation to '%t'", *edits.MembersCanCreatePrivateRepos))) + } + + if pubRepos { + scrb.Print(color.GreenFg(fmt.Sprintf("set public repo creation to '%t'", *edits.MembersCanCreatePublicRepos))) + } return nil }) diff --git a/client/repos.go b/client/repos.go index 574264e..2015c1e 100644 --- a/client/repos.go +++ b/client/repos.go @@ -7,7 +7,6 @@ import ( "net/http" "strings" - "github.com/gomicro/concord/report" "github.com/gomicro/scribe" "github.com/gomicro/scribe/color" "github.com/google/go-github/v56/github" @@ -196,10 +195,9 @@ func (c *Client) AddRepoToTeam(ctx context.Context, scrb scribe.Scriber, org, te } if relationExists { - report.PrintSuccess("updated repo to team '" + team + "' with '" + perm + "'") + scrb.Print(color.GreenFg("updated repo to team '" + team + "' with '" + perm + "'")) } else { - report.PrintAdd("added repo to team '" + team + "' with '" + perm + "'") - report.Println() + scrb.Print(color.GreenFg("added repo to team '" + team + "' with '" + perm + "'")) } return nil @@ -208,11 +206,8 @@ func (c *Client) AddRepoToTeam(ctx context.Context, scrb scribe.Scriber, org, te return nil } -func (c *Client) RemoveRepoFromTeam(ctx context.Context, org, team, repo string) { - cs := &report.ChangeSet{} - cs.Add("removing repo from team '"+team+"'", "removed repo from team '"+team+"'") - - cs.PrintPre() +func (c *Client) RemoveRepoFromTeam(ctx context.Context, scrb scribe.Scriber, org, team, repo string) { + scrb.Print(color.GreenFg("removing repo from team '" + team + "'")) c.Add(func() error { c.rate.Wait(ctx) //nolint: errcheck @@ -228,7 +223,7 @@ func (c *Client) RemoveRepoFromTeam(ctx context.Context, org, team, repo string) return fmt.Errorf("%s/%s: remove repo from team: %w", org, repo, err) } - cs.PrintPost() + scrb.Print(color.GreenFg("removed repo from team '" + team + "'")) return nil }) @@ -306,28 +301,25 @@ func (c *Client) IsBranchProtected(ctx context.Context, org, repo, branch string return b != nil, nil } -func (c *Client) CreateRepo(ctx context.Context, org string, repo *github.Repository) { - cs := &report.ChangeSet{} - cs.Add("creating repo "+repo.GetName(), "created repo "+repo.GetName()) +func (c *Client) CreateRepo(ctx context.Context, scrb scribe.Scriber, org string, repo *github.Repository) { + scrb.Print(color.GreenFg("creating repo " + repo.GetName())) if repo.Description != nil { - cs.Add("setting description to '"+repo.GetDescription()+"'", "set description to '"+repo.GetDescription()+"'") + scrb.Print(color.GreenFg("set description to '" + repo.GetDescription() + "'")) } if repo.Archived != nil { - cs.Add("setting archived to '"+fmt.Sprintf("%t", repo.GetArchived())+"'", "set archived to '"+fmt.Sprintf("%t", repo.GetArchived())+"'") + scrb.Print(color.GreenFg("set archived to '" + fmt.Sprintf("%t", repo.GetArchived()) + "'")) } if repo.Private != nil { - cs.Add("setting private to '"+fmt.Sprintf("%t", repo.GetPrivate())+"'", "set private to '"+fmt.Sprintf("%t", repo.GetPrivate())+"'") + scrb.Print(color.GreenFg("set private to '" + fmt.Sprintf("%t", repo.GetPrivate()) + "'")) } if repo.DefaultBranch != nil { - cs.Add("setting default branch to '"+repo.GetDefaultBranch()+"'", "set default branch to '"+repo.GetDefaultBranch()+"'") + scrb.Print(color.GreenFg("set default branch to '" + repo.GetDefaultBranch() + "'")) } - cs.PrintPre() - c.Add(func() error { c.rate.Wait(ctx) //nolint: errcheck _, _, err := c.ghClient.Repositories.Create(ctx, org, repo) @@ -339,15 +331,29 @@ func (c *Client) CreateRepo(ctx context.Context, org string, repo *github.Reposi return fmt.Errorf("%s/%s: create repo: %w", org, repo, err) } - cs.PrintPost() + scrb.Print(color.GreenFg("created repo " + repo.GetName())) + + if repo.Description != nil { + scrb.Print(color.GreenFg("set description to '" + repo.GetDescription() + "'")) + } + + if repo.Archived != nil { + scrb.Print(color.GreenFg("set archived to '" + fmt.Sprintf("%t", repo.GetArchived()) + "'")) + } + + if repo.Private != nil { + scrb.Print(color.GreenFg("set private to '" + fmt.Sprintf("%t", repo.GetPrivate()) + "'")) + } + + if repo.DefaultBranch != nil { + scrb.Print(color.GreenFg("set default branch to '" + repo.GetDefaultBranch() + "'")) + } return nil }) } -func (c *Client) InitRepo(ctx context.Context, org, repo, branch string) { - cs := &report.ChangeSet{} - +func (c *Client) InitRepo(ctx context.Context, scrb scribe.Scriber, org, repo, branch string) { filename := "README.md" content := []byte("# " + repo) @@ -357,9 +363,7 @@ func (c *Client) InitRepo(ctx context.Context, org, repo, branch string) { Branch: &branch, } - cs.Add("creating file "+filename, "created file "+filename) - - cs.PrintPre() + scrb.Print(color.GreenFg("creating file " + filename)) c.Add(func() error { c.rate.Wait(ctx) //nolint: errcheck @@ -372,41 +376,45 @@ func (c *Client) InitRepo(ctx context.Context, org, repo, branch string) { return fmt.Errorf("%s/%s: init repo: %w", org, repo, err) } - cs.PrintPost() + scrb.Print(color.GreenFg("created file " + filename)) return nil }) } -func (c *Client) UpdateRepo(ctx context.Context, org, repo string, edits *github.Repository) { - cs := &report.ChangeSet{} - +func (c *Client) UpdateRepo(ctx context.Context, scrb scribe.Scriber, org, repo string, edits *github.Repository) { + changes := false if edits.Description != nil { - cs.Add("updating description to '"+*edits.Description+"'", "updated description to '"+*edits.Description+"'") + scrb.Print(color.GreenFg("updating description to '" + *edits.Description + "'")) + changes = true } if edits.Archived != nil { - cs.Add("updating archived to '"+fmt.Sprintf("%t", *edits.Archived)+"'", "updated archived to '"+fmt.Sprintf("%t", *edits.Archived)+"'") + scrb.Print(color.GreenFg("updating archived to '" + fmt.Sprintf("%t", *edits.Archived) + "'")) + changes = true } if edits.Private != nil { - cs.Add("updating private to '"+fmt.Sprintf("%t", *edits.Private)+"'", "updated private to '"+fmt.Sprintf("%t", *edits.Private)+"'") + scrb.Print(color.GreenFg("updating private to '" + fmt.Sprintf("%t", *edits.Private) + "'")) + changes = true } if edits.DefaultBranch != nil { - cs.Add("updating default branch to '"+*edits.DefaultBranch+"'", "updated default branch to '"+*edits.DefaultBranch+"'") + scrb.Print(color.GreenFg("updating default branch to '" + *edits.DefaultBranch + "'")) + changes = true } if edits.DeleteBranchOnMerge != nil { - cs.Add("updating auto delete head branches to '"+fmt.Sprintf("%t", *edits.DeleteBranchOnMerge)+"'", "updated auto delete head branches to '"+fmt.Sprintf("%t", *edits.DeleteBranchOnMerge)+"'") + scrb.Print(color.GreenFg("updating auto delete head branches to '" + fmt.Sprintf("%t", *edits.DeleteBranchOnMerge) + "'")) + changes = true } if edits.AllowAutoMerge != nil { - cs.Add("updating allow auto merge to '"+fmt.Sprintf("%t", *edits.AllowAutoMerge)+"'", "updated allow auto merge to '"+fmt.Sprintf("%t", *edits.AllowAutoMerge)+"'") + scrb.Print(color.GreenFg("updating allow auto merge to '" + fmt.Sprintf("%t", *edits.AllowAutoMerge) + "'")) + changes = true } - cs.PrintPre() - if !cs.HasChanges() { + if !changes { return } @@ -429,17 +437,36 @@ func (c *Client) UpdateRepo(ctx context.Context, org, repo string, edits *github return fmt.Errorf("%s/%s: update repo: %w", org, repo, err) } - cs.PrintPost() + if edits.Description != nil { + scrb.Print(color.GreenFg("updated description to '" + *edits.Description + "'")) + } + + if edits.Archived != nil { + scrb.Print(color.GreenFg("updated archived to '" + fmt.Sprintf("%t", *edits.Archived) + "'")) + } + + if edits.Private != nil { + scrb.Print(color.GreenFg("updated private to '" + fmt.Sprintf("%t", *edits.Private) + "'")) + } + + if edits.DefaultBranch != nil { + scrb.Print(color.GreenFg("updated default branch to '" + *edits.DefaultBranch + "'")) + } + + if edits.DeleteBranchOnMerge != nil { + scrb.Print(color.GreenFg("updated auto delete head branches to '" + fmt.Sprintf("%t", *edits.DeleteBranchOnMerge) + "'")) + } + + if edits.AllowAutoMerge != nil { + scrb.Print(color.GreenFg("updated allow auto merge to '" + fmt.Sprintf("%t", *edits.AllowAutoMerge) + "'")) + } return nil }) } -func (c *Client) SetRepoTopics(ctx context.Context, org, repo string, topics []string) { - cs := &report.ChangeSet{} - cs.Add("updating labels to ["+strings.Join(topics, ", ")+"]", "updated labels to ["+strings.Join(topics, ", ")+"]") - - cs.PrintPre() +func (c *Client) SetRepoTopics(ctx context.Context, scrb scribe.Scriber, org, repo string, topics []string) { + scrb.Print(color.GreenFg("updating labels to [" + strings.Join(topics, ", ") + "]")) c.Add(func() error { c.rate.Wait(ctx) //nolint: errcheck @@ -456,7 +483,7 @@ func (c *Client) SetRepoTopics(ctx context.Context, org, repo string, topics []s return fmt.Errorf("%s/%s: set repo topics: %w", org, repo, err) } - cs.PrintPost() + scrb.Print(color.GreenFg("updated labels to [" + strings.Join(topics, ", ") + "]")) return nil }) @@ -468,28 +495,39 @@ func (c *Client) ProtectBranch(ctx context.Context, scrb scribe.Scriber, org, re return err } - cs := &report.ChangeSet{} - + protecting := false if ghpb != nil { scrb.Print(branch + " branch protected") } else { - cs.Add("protecting branch "+branch, "protected branch "+branch) + scrb.Print(color.GreenFg("protecting branch " + branch)) } + setReqPR := false + setReqPRTo := false if protection.RequiredPullRequestReviews != nil { if ghpb.GetRequiredPullRequestReviews() == nil { - cs.Add("setting require pr to 'true'", "set require pr to 'true'") + scrb.Print(color.GreenFg("setting require pr to 'true'")) + setReqPR = true + setReqPRTo = true } } else { if ghpb.GetRequiredPullRequestReviews() != nil { - cs.Add("setting require pr to 'false'", "set require pr to 'false'") + scrb.Print(color.GreenFg("setting require pr to 'false'")) + setReqPR = true + setReqPRTo = false } } + setReqChecks := false + setReqChecksTo := false + setChecks := false + checks := []string{} if protection.RequiredStatusChecks != nil { if ghpb.GetRequiredStatusChecks() == nil { - cs.Add("setting require status checks to 'true'", "set require status checks to 'true'") + scrb.Print(color.GreenFg("setting require status checks to 'true'")) + setReqChecks = true + setReqChecksTo = true rc := protection.GetRequiredStatusChecks() if len(rc.Checks) > 0 { @@ -499,19 +537,19 @@ func (c *Client) ProtectBranch(ctx context.Context, scrb scribe.Scriber, org, re } if len(checks) > 0 { - cs.Add("setting required checks to ["+strings.Join(checks, ", ")+"]", "set required checks to ["+strings.Join(checks, ", ")+"]") + scrb.Print(color.GreenFg("setting required checks to [" + strings.Join(checks, ", ") + "]")) + setChecks = true } } else { scrb.Print("status checks required") } } else { if ghpb.GetRequiredStatusChecks() != nil { - cs.Add("setting require status checks to 'false'", "set require status checks to 'false'") + scrb.Print(color.GreenFg("setting require status checks to 'false'")) + setReqChecks = true } } - cs.PrintPre() - c.Add(func() error { c.rate.Wait(ctx) //nolint: errcheck _, resp, err := c.ghClient.Repositories.UpdateBranchProtection(ctx, org, repo, branch, protection) @@ -531,7 +569,29 @@ func (c *Client) ProtectBranch(ctx context.Context, scrb scribe.Scriber, org, re return fmt.Errorf("%s/%s: protect branch: %w", org, repo, err) } - cs.PrintPost() + if protecting { + scrb.Print(color.GreenFg("protected branch " + branch)) + } + + if setReqPR { + if setReqPRTo { + scrb.Print(color.GreenFg("set require pr to 'true'")) + } else { + scrb.Print(color.GreenFg("set require pr to 'false'")) + } + } + + if setReqChecks { + if setReqChecksTo { + scrb.Print(color.GreenFg("set require status checks to 'true'")) + } else { + scrb.Print(color.GreenFg("set require status checks to 'false'")) + } + } + + if setChecks { + scrb.Print(color.GreenFg("set required checks to [" + strings.Join(checks, ", ") + "]")) + } return nil }) @@ -545,16 +605,14 @@ func (c *Client) SetRequireSignedCommits(ctx context.Context, scrb scribe.Scribe return err } - cs := &report.ChangeSet{} - + req := false if ghpb.GetRequiredSignatures().GetEnabled() != require { - cs.Add(fmt.Sprintf("setting require signed commits to '%t'", require), fmt.Sprintf("set require signed commits to '%t'", require)) + scrb.Print(color.GreenFg(fmt.Sprintf("setting require signed commits to '%t'", require))) + req = true } else { scrb.Print(fmt.Sprintf("require signed commits is '%t'", require)) } - cs.PrintPre() - c.Add(func() error { c.rate.Wait(ctx) //nolint: errcheck var resp *github.Response @@ -581,7 +639,9 @@ func (c *Client) SetRequireSignedCommits(ctx context.Context, scrb scribe.Scribe return fmt.Errorf("%s/%s: protect branch: set signature required: %w", org, repo, err) } - cs.PrintPost() + if req { + scrb.Print(color.GreenFg(fmt.Sprintf("set require signed commits to '%t'", require))) + } return nil }) diff --git a/client/teams.go b/client/teams.go index 7a8196e..f1e4c62 100644 --- a/client/teams.go +++ b/client/teams.go @@ -3,7 +3,8 @@ package client import ( "context" - "github.com/gomicro/concord/report" + "github.com/gomicro/scribe" + "github.com/gomicro/scribe/color" "github.com/google/go-github/v56/github" ) @@ -20,9 +21,8 @@ func (c *Client) GetTeams(ctx context.Context, orgName string) ([]*github.Team, return teams, nil } -func (c *Client) CreateTeam(ctx context.Context, orgName, teamName string) { - report.PrintAdd("create team " + teamName) - report.Println() +func (c *Client) CreateTeam(ctx context.Context, scrb scribe.Scriber, orgName, teamName string) { + scrb.Print(color.GreenFg("create team " + teamName)) c.Add(func() error { team, _, err := c.ghClient.Teams.CreateTeam(ctx, orgName, github.NewTeam{ @@ -55,16 +55,14 @@ func (c *Client) CreateTeam(ctx context.Context, orgName, teamName string) { return err } - report.PrintSuccess("created team " + teamName) - report.Println() + scrb.Print(color.GreenFg("created team " + teamName)) return nil }) } -func (c *Client) InviteTeamMember(ctx context.Context, org, team, user string) { - report.PrintAdd("invite " + user + " to team " + team) - report.Println() +func (c *Client) InviteTeamMember(ctx context.Context, scrb scribe.Scriber, org, team, user string) { + scrb.Print(color.GreenFg("invite " + user + " to team " + team)) c.Add(func() error { _, _, err := c.ghClient.Teams.AddTeamMembershipBySlug(ctx, org, team, user, nil) @@ -76,8 +74,7 @@ func (c *Client) InviteTeamMember(ctx context.Context, org, team, user string) { return err } - report.PrintSuccess("invited " + user + " to team " + team) - report.Println() + scrb.Print(color.GreenFg("invited " + user + " to team " + team)) return nil }) diff --git a/cmd/apply.go b/cmd/apply.go index aa1acc7..8bb4ca8 100644 --- a/cmd/apply.go +++ b/cmd/apply.go @@ -48,15 +48,17 @@ func applyRun(cmd *cobra.Command, args []string) error { return handleError(cmd, err) } - exists, err := clt.OrgExists(ctx, org.Name) + ghOrg, err := clt.GetOrg(ctx, org.Name) if err != nil { - return handleError(cmd, err) - } + if !errors.Is(err, client.ErrOrgNotFound) { + return handleError(cmd, err) + } - if !exists { return handleError(cmd, errors.New("organization does not exist")) } + free := ghOrg.GetPlan().GetName() == "free" + scrb.BeginDescribe("Organization") defer scrb.EndDescribe() @@ -75,7 +77,7 @@ func applyRun(cmd *cobra.Command, args []string) error { return handleError(cmd, err) } - err = reposRun(cmd, args) + err = reposRun(cmd, args, free) if err != nil { return handleError(cmd, err) } diff --git a/cmd/apply_members.go b/cmd/apply_members.go index 037dcf7..d0e8dcf 100644 --- a/cmd/apply_members.go +++ b/cmd/apply_members.go @@ -103,7 +103,7 @@ func membersRun(cmd *cobra.Command, args []string) error { missing, managed, unmanaged := getMemberBreakdown(org.People, ms) for _, m := range missing { - clt.InviteMember(ctx, org.Name, m) + clt.InviteMember(ctx, scrb, org.Name, m) scrb.Print("Invited " + m) } diff --git a/cmd/apply_org.go b/cmd/apply_org.go index 5da1fed..5aea422 100644 --- a/cmd/apply_org.go +++ b/cmd/apply_org.go @@ -97,7 +97,7 @@ func orgRun(cmd *cobra.Command, args []string) error { // TODO: this should be broken into two parts, determine if the org exists // and then apply the permissions - err = clt.SetOrgPrivileges(ctx, org.Name, buildOrgState(org)) + err = clt.SetOrgPrivileges(ctx, scrb, org.Name, buildOrgState(org)) if err != nil { return handleError(cmd, err) } diff --git a/cmd/apply_repos.go b/cmd/apply_repos.go index 1a5c266..d0db7ac 100644 --- a/cmd/apply_repos.go +++ b/cmd/apply_repos.go @@ -52,19 +52,21 @@ func applyReposRun(cmd *cobra.Command, args []string) error { return handleError(cmd, err) } - exists, err := clt.OrgExists(ctx, org.Name) + ghOrg, err := clt.GetOrg(ctx, org.Name) if err != nil { - return handleError(cmd, err) - } + if !errors.Is(err, client.ErrOrgNotFound) { + return handleError(cmd, err) + } - if !exists { return handleError(cmd, errors.New("organization does not exist")) } + free := ghOrg.GetPlan().GetName() == "free" + scrb.BeginDescribe("Organization") defer scrb.EndDescribe() - err = reposRun(cmd, args) + err = reposRun(cmd, args, free) if err != nil { return handleError(cmd, err) } @@ -83,7 +85,7 @@ func applyReposRun(cmd *cobra.Command, args []string) error { return nil } -func reposRun(cmd *cobra.Command, args []string) error { +func reposRun(cmd *cobra.Command, args []string, free bool) error { ctx := cmd.Context() org, err := manifest.OrgFromContext(ctx) @@ -127,7 +129,7 @@ func reposRun(cmd *cobra.Command, args []string) error { continue } - err := ensureRepo(ctx, org.Name, r) + err := ensureRepo(ctx, org.Name, free, r) if err != nil { scrb.Print(color.RedFg(err.Error())) } @@ -161,7 +163,7 @@ func getUnmanagedRepos(manifest []*gh_pb.Repository, repos []*github.Repository) return unmanaged } -func ensureRepo(ctx context.Context, org string, repo *gh_pb.Repository) error { +func ensureRepo(ctx context.Context, org string, free bool, repo *gh_pb.Repository) error { clt, err := client.ClientFromContext(ctx) if err != nil { return err @@ -174,12 +176,12 @@ func ensureRepo(ctx context.Context, org string, repo *gh_pb.Repository) error { fresh := false if errors.Is(err, client.ErrRepoNotFound) { - clt.CreateRepo(ctx, org, buildRepoState(repo)) - clt.InitRepo(ctx, org, repo.Name, *repo.DefaultBranch) + clt.CreateRepo(ctx, scrb, org, buildRepoState(repo)) + clt.InitRepo(ctx, scrb, org, repo.Name, *repo.DefaultBranch) fresh = true } - clt.UpdateRepo(ctx, org, repo.Name, buildRepoEdits(repo, ghr, fresh)) + clt.UpdateRepo(ctx, scrb, org, repo.Name, buildRepoEdits(repo, ghr, fresh)) if len(repo.Labels) > 0 { var ghl []string @@ -193,16 +195,20 @@ func ensureRepo(ctx context.Context, org string, repo *gh_pb.Repository) error { slices.Sort(l) if !slices.Equal(ghl, l) { - clt.SetRepoTopics(ctx, org, repo.Name, l) + clt.SetRepoTopics(ctx, scrb, org, repo.Name, l) } else { scrb.Print("labels are [" + strings.Join(l, ", ") + "]") } } - for _, pb := range repo.ProtectedBranches { - err := setBranchProtection(ctx, org, repo, pb) - if err != nil { - return err + if free && repo.GetPrivate() { + scrb.Print("skipping branch protection for private repo on free plan") + } else { + for _, pb := range repo.ProtectedBranches { + err := setBranchProtection(ctx, org, repo, pb) + if err != nil { + return err + } } } @@ -320,7 +326,7 @@ func setTeamPermissions(ctx context.Context, org string, repo *gh_pb.Repository, continue } - clt.RemoveRepoFromTeam(ctx, org, gt.GetSlug(), repo.Name) + clt.RemoveRepoFromTeam(ctx, scrb, org, gt.GetSlug(), repo.Name) } return nil diff --git a/cmd/apply_teams.go b/cmd/apply_teams.go index f500049..8ecf6c3 100644 --- a/cmd/apply_teams.go +++ b/cmd/apply_teams.go @@ -107,12 +107,12 @@ func teamsRun(cmd *cobra.Command, args []string) error { scrb.BeginDescribe(mt) scrb.EndDescribe() - clt.CreateTeam(ctx, org.Name, mt) + clt.CreateTeam(ctx, scrb, org.Name, mt) missing, _, _ := getTeamMembersBreakdown(mt, org.People, nil) for _, m := range missing { - clt.InviteTeamMember(ctx, org.GetName(), mt, m) + clt.InviteTeamMember(ctx, scrb, org.GetName(), mt, m) } } @@ -129,7 +129,7 @@ func teamsRun(cmd *cobra.Command, args []string) error { missing, managed, unmanaged := getTeamMembersBreakdown(mt, org.People, ms) for _, m := range missing { - clt.InviteTeamMember(ctx, org.GetName(), mt, m) + clt.InviteTeamMember(ctx, scrb, org.GetName(), mt, m) } for _, m := range managed { diff --git a/cmd/root.go b/cmd/root.go index 3f1dbbe..9a306cf 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -10,7 +10,6 @@ import ( "github.com/gomicro/concord/client" "github.com/gomicro/concord/config" - "github.com/gomicro/concord/report" "github.com/gomicro/scribe" "github.com/gomicro/scribe/color" "github.com/spf13/cobra" @@ -79,8 +78,7 @@ func confirm(cmd *cobra.Command, msg string) bool { return true } - report.Println() - report.PrintInfo(msg) + scrb.Print(msg) reader := bufio.NewReader(os.Stdin) for { @@ -92,7 +90,7 @@ func confirm(cmd *cobra.Command, msg string) bool { } else if strings.Compare(s, "y") == 0 { break } else { - report.PrintInfo(msg) + scrb.Print(msg) } } diff --git a/report/changeset.go b/report/changeset.go deleted file mode 100644 index 58f25bd..0000000 --- a/report/changeset.go +++ /dev/null @@ -1,35 +0,0 @@ -package report - -type ChangeSet struct { - changes []change -} - -func (c *ChangeSet) Add(pre, post string) { - c.changes = append(c.changes, change{ - pre: pre, - post: post, - }) -} - -func (c *ChangeSet) PrintPre() { - for i := range c.changes { - PrintAdd(c.changes[i].pre) - Println() - } -} - -func (c *ChangeSet) PrintPost() { - for i := range c.changes { - PrintSuccess(c.changes[i].post) - Println() - } -} - -func (c *ChangeSet) HasChanges() bool { - return len(c.changes) > 0 -} - -type change struct { - pre string - post string -} diff --git a/report/report.go b/report/report.go deleted file mode 100644 index d2a135e..0000000 --- a/report/report.go +++ /dev/null @@ -1,46 +0,0 @@ -package report - -import "fmt" - -const ( - colorRed = "\033[1;31m" - colorGreen = "\033[1;32m" - colorYellow = "\033[1;33m" - colorBlue = "\033[1;34m" - colorPurple = "\033[1;35m" - colorCyan = "\033[1;36m" - colorWhite = "\033[1;37m" - colorReset = "\033[0m" -) - -func PrintHeader(text string) { - fmt.Printf("%s%s%s", colorBlue, text, colorReset) -} - -func Println() { - fmt.Println() -} - -func PrintInfo(text string) { - fmt.Printf(" %s%s%s", colorWhite, text, colorReset) -} - -func PrintWarn(text string) { - fmt.Printf(" %s%s%s", colorYellow, text, colorReset) -} - -func PrintSuccess(text string) { - fmt.Printf(" %s%s%s", colorGreen, text, colorReset) -} - -func PrintError(text string) { - fmt.Printf(" %s%s%s", colorRed, text, colorReset) -} - -func PrintAdd(text string) { - fmt.Printf(" %s%s%s", colorGreen, text, colorReset) -} - -func PrintDelete(text string) { - fmt.Printf(" %s%s%s", colorRed, text, colorReset) -} From a9e21c347b879b9ea41c57c33427258e6e30572c Mon Sep 17 00:00:00 2001 From: Daniel Hess Date: Sun, 23 Feb 2025 21:34:11 -0800 Subject: [PATCH 7/8] missing a license --- LICENSE.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..4996717 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2022 Gomicro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 065b52f745eb5d81cfcdf74c7c98ec70b97b989d Mon Sep 17 00:00:00 2001 From: Daniel Hess Date: Sun, 23 Feb 2025 21:46:06 -0800 Subject: [PATCH 8/8] updating build --- .github/workflows/build.yml | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1456447..fd53ae2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,6 +1,11 @@ name: Build + on: [push] +env: + GO_VERSION: '1.23' + GOLANG_CI_VERSION: '1.61' + jobs: linting: @@ -9,14 +14,15 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - - name: golangci-lint - uses: golangci/golangci-lint-action@v3 + - uses: golangci/golangci-lint-action@v6 + name: "GolangCI-Lint ${{ env.GOLANG_CI_VERSION }}" with: - version: latest + version: v${{ env.GOLANG_CI_VERSION }} + args: --timeout=5m test: name: Test @@ -24,12 +30,12 @@ jobs: steps: - name: Install Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: - go-version: "1.21" + go-version: ${{ env.GO_VERSION }} - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -48,12 +54,12 @@ jobs: steps: - name: Install Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: - go-version: "1.21" + go-version: ${{ env.GO_VERSION }} - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -65,7 +71,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Snapshot - uses: goreleaser/goreleaser-action@v5 + uses: goreleaser/goreleaser-action@v6 with: distribution: goreleaser version: latest @@ -73,7 +79,7 @@ jobs: - name: Release if: startsWith(github.ref, 'refs/tags/') - uses: goreleaser/goreleaser-action@v5 + uses: goreleaser/goreleaser-action@v6 with: distribution: goreleaser version: latest