@@ -7,6 +7,7 @@ package gogit
77import (
88 "context"
99 "fmt"
10+ "strings"
1011
1112 "github.com/fluxcd/go-git-providers/gitprovider"
1213 deliveryv1alpha1 "github.com/open-component-model/git-controller/apis/delivery/v1alpha1"
@@ -39,20 +40,29 @@ func CreateOrganizationRepository(ctx context.Context, gc gitprovider.Client, do
3940
4041 switch spec .ExistingRepositoryPolicy {
4142 case mpasv1alpha1 .ExistingRepositoryPolicyFail :
42- if _ , err := gc .OrgRepositories ().Create (ctx , ref , info ); err != nil {
43+ repo , err := gc .OrgRepositories ().Create (ctx , ref , info )
44+ if err != nil {
4345 return fmt .Errorf ("failed to create repository: %w" , err )
4446 }
4547
48+ if err := createCodeownersFile (ctx , repo , spec .Maintainers ); err != nil {
49+ return fmt .Errorf ("failed to add CODEOWNERS file: %w" , err )
50+ }
51+
4652 logger .Info ("successfully created organization repository" , "domain" , domain , "repository" , spec .RepositoryName )
4753 case mpasv1alpha1 .ExistingRepositoryPolicyAdopt :
48- _ , created , err := gc .OrgRepositories ().Reconcile (ctx , ref , info )
54+ repo , created , err := gc .OrgRepositories ().Reconcile (ctx , ref , info )
4955 if err != nil {
5056 return fmt .Errorf ("failed to reconcile repository: %w" , err )
5157 }
5258
5359 if ! created {
5460 logger .Info ("using existing repository" , "domain" , domain , "repository" , spec .RepositoryName )
5561 } else {
62+ if err := createCodeownersFile (ctx , repo , spec .Maintainers ); err != nil {
63+ return fmt .Errorf ("failed to add CODEOWNERS file: %w" , err )
64+ }
65+
5666 logger .Info ("successfully created organization repository" , "domain" , domain , "repository" , spec .RepositoryName )
5767 }
5868 default :
@@ -86,20 +96,29 @@ func CreateUserRepository(ctx context.Context, gc gitprovider.Client, domain str
8696
8797 switch spec .ExistingRepositoryPolicy {
8898 case mpasv1alpha1 .ExistingRepositoryPolicyFail :
89- if _ , err := gc .UserRepositories ().Create (ctx , ref , info ); err != nil {
99+ repo , err := gc .UserRepositories ().Create (ctx , ref , info )
100+ if err != nil {
90101 return fmt .Errorf ("failed to create repository: %w" , err )
91102 }
92103
104+ if err := createCodeownersFile (ctx , repo , spec .Maintainers ); err != nil {
105+ return fmt .Errorf ("failed to add CODEOWNERS file: %w" , err )
106+ }
107+
93108 logger .Info ("successfully created user repository" , "domain" , domain , "repository" , spec .RepositoryName )
94109 case mpasv1alpha1 .ExistingRepositoryPolicyAdopt :
95- _ , created , err := gc .UserRepositories ().Reconcile (ctx , ref , info )
110+ repo , created , err := gc .UserRepositories ().Reconcile (ctx , ref , info )
96111 if err != nil {
97112 return fmt .Errorf ("failed to reconcile repository: %w" , err )
98113 }
99114
100115 if ! created {
101116 logger .Info ("using existing repository" , "domain" , domain , "repository" , spec .RepositoryName )
102117 } else {
118+ if err := createCodeownersFile (ctx , repo , spec .Maintainers ); err != nil {
119+ return fmt .Errorf ("failed to add CODEOWNERS file: %w" , err )
120+ }
121+
103122 logger .Info ("successfully created user repository" , "domain" , domain , "repository" , spec .RepositoryName )
104123 }
105124 default :
@@ -194,3 +213,38 @@ func CreateUserPullRequest(ctx context.Context, gc gitprovider.Client, domain, b
194213
195214 return nil
196215}
216+
217+ // Repositories groups together a common functionality of both repository types.
218+ type Repositories interface {
219+ Commits () gitprovider.CommitClient
220+ }
221+
222+ func createCodeownersFile (ctx context.Context , repo Repositories , maintainers mpasv1alpha1.Maintainers ) error {
223+ if len (maintainers .Users ) == 0 {
224+ return nil
225+ }
226+
227+ logger := log .FromContext (ctx )
228+
229+ content := strings.Builder {}
230+
231+ for _ , m := range maintainers .Users {
232+ _ , _ = content .WriteString (fmt .Sprintf ("%s\n " , m ))
233+ }
234+
235+ files := []gitprovider.CommitFile {
236+ {
237+ Path : gitprovider .StringVar ("." ),
238+ Content : gitprovider .StringVar (content .String ()),
239+ },
240+ }
241+
242+ commit , err := repo .Commits ().Create (ctx , "main" , "adding CODEOWNERS" , files )
243+ if err != nil {
244+ return fmt .Errorf ("failed to create CODEOWNERS file: %w" , err )
245+ }
246+
247+ logger .Info ("successfully added CODEOWNERS" , "url" , commit .Get ().URL )
248+
249+ return nil
250+ }
0 commit comments