Skip to content

Commit 9978f88

Browse files
committed
Do not list repositories if the repository filters are not regexes
1 parent 149b295 commit 9978f88

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

cmd/acr/purge_test.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -734,11 +734,21 @@ func TestCollectTagFilters(t *testing.T) {
734734
mockClient.AssertExpectations(t)
735735
})
736736

737-
t.Run("SingleRepo", func(t *testing.T) {
737+
t.Run("SingleRepoWithRegex", func(t *testing.T) {
738738
assert := assert.New(t)
739739
mockClient := &mocks.BaseClientAPI{}
740740
mockClient.On("GetRepositories", mock.Anything, "", mock.Anything).Return(ManyRepositoriesResult, nil).Once()
741741
mockClient.On("GetRepositories", mock.Anything, mock.Anything, mock.Anything).Return(NoRepositoriesResult, nil).Once()
742+
filters, err := common.CollectTagFilters(testCtx, []string{testRepo + ".?:.*"}, mockClient, 60, defaultRepoPageSize)
743+
assert.Equal(1, len(filters), "Number of found should be one")
744+
assert.Equal(".*", filters[testRepo], "Filter for test repo should be .*")
745+
assert.Equal(nil, err, "Error should be nil")
746+
mockClient.AssertExpectations(t)
747+
})
748+
749+
t.Run("SingleRepoWithoutRegex", func(t *testing.T) {
750+
assert := assert.New(t)
751+
mockClient := &mocks.BaseClientAPI{}
742752
filters, err := common.CollectTagFilters(testCtx, []string{testRepo + ":.*"}, mockClient, 60, defaultRepoPageSize)
743753
assert.Equal(1, len(filters), "Number of found should be one")
744754
assert.Equal(".*", filters[testRepo], "Filter for test repo should be .*")
@@ -764,7 +774,7 @@ func TestCollectTagFilters(t *testing.T) {
764774
mockClient := &mocks.BaseClientAPI{}
765775
mockClient.On("GetRepositories", mock.Anything, "", mock.Anything).Return(ManyRepositoriesResult, nil).Once()
766776
mockClient.On("GetRepositories", mock.Anything, mock.Anything, mock.Anything).Return(NoRepositoriesResult, nil).Once()
767-
filters, err := common.CollectTagFilters(testCtx, []string{"ba:.*"}, mockClient, 60, defaultRepoPageSize)
777+
filters, err := common.CollectTagFilters(testCtx, []string{"ba?:.*"}, mockClient, 60, defaultRepoPageSize)
768778
assert.Equal(0, len(filters), "Number of found repos should be zero")
769779
assert.Equal(nil, err, "Error should be nil")
770780
mockClient.AssertExpectations(t)
@@ -775,7 +785,7 @@ func TestCollectTagFilters(t *testing.T) {
775785
mockClient := &mocks.BaseClientAPI{}
776786
mockClient.On("GetRepositories", mock.Anything, "", mock.Anything).Return(ManyRepositoriesResult, nil).Once()
777787
mockClient.On("GetRepositories", mock.Anything, mock.Anything, mock.Anything).Return(NoRepositoriesResult, nil).Once()
778-
filters, err := common.CollectTagFilters(testCtx, []string{"foo/bar:.*"}, mockClient, 60, defaultRepoPageSize)
788+
filters, err := common.CollectTagFilters(testCtx, []string{"foo/bar?:.*"}, mockClient, 60, defaultRepoPageSize)
779789
assert.Equal(1, len(filters), "Number of found repos should be one")
780790
assert.Equal(nil, err, "Error should be nil")
781791
mockClient.AssertExpectations(t)
@@ -786,7 +796,7 @@ func TestCollectTagFilters(t *testing.T) {
786796
mockClient := &mocks.BaseClientAPI{}
787797
mockClient.On("GetRepositories", mock.Anything, "", mock.Anything).Return(ManyRepositoriesResult, nil).Once()
788798
mockClient.On("GetRepositories", mock.Anything, mock.Anything, mock.Anything).Return(NoRepositoriesResult, nil).Once()
789-
filters, err := common.CollectTagFilters(testCtx, []string{"foo/bar:(?:.*)"}, mockClient, 60, defaultRepoPageSize)
799+
filters, err := common.CollectTagFilters(testCtx, []string{"foo/bar?:(?:.*)"}, mockClient, 60, defaultRepoPageSize)
790800
assert.Equal(1, len(filters), "Number of found repos should be one")
791801
assert.Equal(nil, err, "Error should be nil")
792802
mockClient.AssertExpectations(t)
@@ -840,7 +850,7 @@ func TestCollectTagFilters(t *testing.T) {
840850
assert := assert.New(t)
841851
mockClient := &mocks.BaseClientAPI{}
842852
mockClient.On("GetRepositories", mock.Anything, "", mock.Anything).Return(NoRepositoriesResult, nil).Once()
843-
filters, err := common.CollectTagFilters(testCtx, []string{testRepo + ":.*"}, mockClient, 60, defaultRepoPageSize)
853+
filters, err := common.CollectTagFilters(testCtx, []string{testRepo + "?:.*"}, mockClient, 60, defaultRepoPageSize)
844854
assert.Equal(0, len(filters), "Number of found repos should be zero")
845855
assert.Equal(nil, err, "Error should be nil")
846856
mockClient.AssertExpectations(t)
@@ -849,8 +859,6 @@ func TestCollectTagFilters(t *testing.T) {
849859
t.Run("EmptyRepoRegex", func(t *testing.T) {
850860
assert := assert.New(t)
851861
mockClient := &mocks.BaseClientAPI{}
852-
mockClient.On("GetRepositories", mock.Anything, "", mock.Anything).Return(ManyRepositoriesResult, nil).Once()
853-
mockClient.On("GetRepositories", mock.Anything, mock.Anything, mock.Anything).Return(NoRepositoriesResult, nil).Once()
854862
_, err := common.CollectTagFilters(testCtx, []string{":.*"}, mockClient, 60, defaultRepoPageSize)
855863
assert.NotEqual(nil, err, "Error should not be nil")
856864
mockClient.AssertExpectations(t)
@@ -859,8 +867,6 @@ func TestCollectTagFilters(t *testing.T) {
859867
t.Run("EmptyTagRegex", func(t *testing.T) {
860868
assert := assert.New(t)
861869
mockClient := &mocks.BaseClientAPI{}
862-
mockClient.On("GetRepositories", mock.Anything, "", mock.Anything).Return(ManyRepositoriesResult, nil).Once()
863-
mockClient.On("GetRepositories", mock.Anything, mock.Anything, mock.Anything).Return(NoRepositoriesResult, nil).Once()
864870
_, err := common.CollectTagFilters(testCtx, []string{testRepo + ".*:"}, mockClient, 60, defaultRepoPageSize)
865871
assert.NotEqual(nil, err, "Error should not be nil")
866872
mockClient.AssertExpectations(t)

cmd/common/image_functions.go

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,34 @@ func GetRepositoryAndTagRegex(filter string) (string, string, error) {
9797

9898
// CollectTagFilters collects all matching repos and collects the associated tag filters
9999
func CollectTagFilters(ctx context.Context, rawFilters []string, client acrapi.BaseClientAPI, regexMatchTimeout int64, repoPageSize int32) (map[string]string, error) {
100-
allRepoNames, err := GetAllRepositoryNames(ctx, client, repoPageSize)
101-
if err != nil {
102-
return nil, err
100+
var allRepoNames []string
101+
102+
// Bypass listing the repositories if there are no regex in the repository name filters
103+
notRegexRegex := regexp2.MustCompile(`^[a-z0-9-\/]+$`, defaultRegexpOptions)
104+
listRepositories := false
105+
for _, filter := range rawFilters {
106+
repoRegex, _, err := GetRepositoryAndTagRegex(filter)
107+
if err != nil {
108+
return nil, err
109+
}
110+
111+
notRegex, err := notRegexRegex.MatchString(repoRegex)
112+
if err != nil {
113+
return nil, err
114+
}
115+
if !notRegex {
116+
listRepositories = true
117+
break
118+
}
119+
120+
allRepoNames = append(allRepoNames, repoRegex)
121+
}
122+
123+
if listRepositories {
124+
var err error
125+
if allRepoNames, err = GetAllRepositoryNames(ctx, client, repoPageSize); err != nil {
126+
return nil, err
127+
}
103128
}
104129

105130
tagFilters := map[string]string{}

0 commit comments

Comments
 (0)