@@ -42,6 +42,7 @@ type Provider struct {
4242 projectKey string
4343 repo * v1alpha1.Repository
4444 triggerEvent string
45+ cachedChangedFiles * changedfiles.ChangedFiles
4546}
4647
4748func (v Provider ) Client () * scm.Client {
@@ -371,13 +372,28 @@ func (v *Provider) GetConfig() *info.ProviderConfig {
371372 }
372373}
373374
375+ // GetFiles gets and caches the list of files changed by a given event.
374376func (v * Provider ) GetFiles (ctx context.Context , runevent * info.Event ) (changedfiles.ChangedFiles , error ) {
375- OrgAndRepo := fmt .Sprintf ("%s/%s" , runevent .Organization , runevent .Repository )
376- if runevent .TriggerTarget == triggertype .PullRequest {
377+ if v .cachedChangedFiles == nil {
378+ changes , err := v .fetchChangedFiles (ctx , runevent )
379+ if err != nil {
380+ return changedfiles.ChangedFiles {}, err
381+ }
382+ v .cachedChangedFiles = & changes
383+ }
384+ return * v .cachedChangedFiles , nil
385+ }
386+
387+ func (v * Provider ) fetchChangedFiles (ctx context.Context , runevent * info.Event ) (changedfiles.ChangedFiles , error ) {
388+ changedFiles := changedfiles.ChangedFiles {}
389+
390+ orgAndRepo := fmt .Sprintf ("%s/%s" , runevent .Organization , runevent .Repository )
391+
392+ switch runevent .TriggerTarget {
393+ case triggertype .PullRequest :
377394 opts := & scm.ListOptions {Page : 1 , Size : apiResponseLimit }
378- changedFiles := changedfiles.ChangedFiles {}
379395 for {
380- changes , _ , err := v .Client ().PullRequests .ListChanges (ctx , OrgAndRepo , runevent .PullRequestNumber , opts )
396+ changes , _ , err := v .Client ().PullRequests .ListChanges (ctx , orgAndRepo , runevent .PullRequestNumber , opts )
381397 if err != nil {
382398 return changedfiles.ChangedFiles {}, fmt .Errorf ("failed to list changes for pull request: %w" , err )
383399 }
@@ -408,14 +424,10 @@ func (v *Provider) GetFiles(ctx context.Context, runevent *info.Event) (changedf
408424
409425 opts .Page ++
410426 }
411- return changedFiles , nil
412- }
413-
414- if runevent .TriggerTarget == triggertype .Push {
427+ case triggertype .Push :
415428 opts := & scm.ListOptions {Page : 1 , Size : apiResponseLimit }
416- changedFiles := changedfiles.ChangedFiles {}
417429 for {
418- changes , _ , err := v .Client ().Git .ListChanges (ctx , OrgAndRepo , runevent .SHA , opts )
430+ changes , _ , err := v .Client ().Git .ListChanges (ctx , orgAndRepo , runevent .SHA , opts )
419431 if err != nil {
420432 return changedfiles.ChangedFiles {}, fmt .Errorf ("failed to list changes for commit %s: %w" , runevent .SHA , err )
421433 }
@@ -442,9 +454,10 @@ func (v *Provider) GetFiles(ctx context.Context, runevent *info.Event) (changedf
442454
443455 opts .Page ++
444456 }
445- return changedFiles , nil
457+ default :
458+ // No action necessary
446459 }
447- return changedfiles. ChangedFiles {} , nil
460+ return changedFiles , nil
448461}
449462
450463func (v * Provider ) CreateToken (_ context.Context , _ []string , _ * info.Event ) (string , error ) {
0 commit comments