From 4c08e2b0b9a7fb1b99ae79d913626ecf08624eca Mon Sep 17 00:00:00 2001
From: Sergey Smolnikov <ssmol@equinor.com>
Date: Thu, 16 Jan 2025 16:35:51 +0100
Subject: [PATCH] Fixed branch matcher pattern replacer

---
 charts/radix-operator/Chart.yaml           |  4 +-
 pkg/apis/utils/branch/path_matcher.go      |  2 +-
 pkg/apis/utils/branch/path_matcher_test.go | 43 +++++++++++++++++++---
 3 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/charts/radix-operator/Chart.yaml b/charts/radix-operator/Chart.yaml
index f11a12a64..f4dfb025a 100644
--- a/charts/radix-operator/Chart.yaml
+++ b/charts/radix-operator/Chart.yaml
@@ -1,7 +1,7 @@
 apiVersion: v2
 name: radix-operator
-version: 1.48.3
-appVersion: 1.68.3
+version: 1.48.4
+appVersion: 1.68.4
 kubeVersion: ">=1.24.0"
 description: Radix Operator
 keywords:
diff --git a/pkg/apis/utils/branch/path_matcher.go b/pkg/apis/utils/branch/path_matcher.go
index f3059de4b..f9cd1e479 100644
--- a/pkg/apis/utils/branch/path_matcher.go
+++ b/pkg/apis/utils/branch/path_matcher.go
@@ -12,7 +12,7 @@ const (
 )
 
 var (
-	patternReplacer = strings.NewReplacer("/**/", "/.*", "*", "[^/]*", "?", ".")
+	patternReplacer = strings.NewReplacer("/**/", "/.*", "*", ".*", "?", ".")
 )
 
 // IsValidPattern Checks that the path is a branch pattern
diff --git a/pkg/apis/utils/branch/path_matcher_test.go b/pkg/apis/utils/branch/path_matcher_test.go
index 0c231f46a..203192e65 100644
--- a/pkg/apis/utils/branch/path_matcher_test.go
+++ b/pkg/apis/utils/branch/path_matcher_test.go
@@ -1,6 +1,7 @@
 package branch
 
 import (
+	"strings"
 	"testing"
 
 	"github.com/stretchr/testify/assert"
@@ -23,18 +24,44 @@ func TestIsValidPattern(t *testing.T) {
 	assert.True(t, IsValidPattern("??st"))
 	assert.True(t, IsValidPattern("?est/*"))
 	assert.True(t, IsValidPattern("te?t/*"))
+	assert.True(t, IsValidPattern("*"))
+	assert.True(t, IsValidPattern("**"))
+	assert.True(t, IsValidPattern(".*"))
+	assert.True(t, IsValidPattern(".*/*"))
+	assert.True(t, IsValidPattern(".**"))
+	assert.True(t, IsValidPattern("test-test"))
+	assert.True(t, IsValidPattern("**/test"))
+	assert.True(t, IsValidPattern("**/*"))
 }
 
 func TestMatchesPattern(t *testing.T) {
 	assert.False(t, MatchesPattern("Test", "test"))
 	assert.False(t, MatchesPattern("release", "release/0.1.3"))
 	assert.False(t, MatchesPattern("release", "release/q3/0.1.3"))
-	assert.False(t, MatchesPattern("release/*", "release/q3/0.1.3"))
 	assert.False(t, MatchesPattern("release/*", "release"))
 	assert.False(t, MatchesPattern("release/**/*", "release"))
-	assert.False(t, MatchesPattern("test/*/tull", "test/test1/test2/tull"))
+	assert.False(t, MatchesPattern("(test)|(main)/*", "release/t"))
+	assert.False(t, MatchesPattern("v\\d+\\.\\d+\\.\\d+", "v1q.0.2"))
+	assert.False(t, MatchesPattern("v\\d+\\.\\d+\\.\\d+", "v1..2"))
+	assert.False(t, MatchesPattern("v\\d+\\.\\d+\\.\\d+", "v1.2"))
+	assert.False(t, MatchesPattern("v\\d+\\.\\d+\\.\\d+\\.*", "v1.2.20-asdf"))
 
+	assert.True(t, MatchesPattern("release/*", "release/q3/0.1.3"))
+	assert.True(t, MatchesPattern("test/*/tull", "test/test1/test2/tull"))
+	assert.True(t, MatchesPattern("**", "test"))
+	assert.True(t, MatchesPattern("**", "test/test-test"))
+	assert.True(t, MatchesPattern("*/**/*", "test/test2/test3"))
+	assert.True(t, MatchesPattern("test/**/test3", "test/test2/test3"))
+	assert.True(t, MatchesPattern("test/**/test3", "test/test2/test3"))
+	assert.True(t, MatchesPattern(".**", "test/test-test"))
+	assert.True(t, MatchesPattern("**", "test-test"))
 	assert.True(t, MatchesPattern("test", "test"))
+	assert.True(t, MatchesPattern("*", "test"))
+	assert.True(t, MatchesPattern("*", "test/test-test"))
+	assert.True(t, MatchesPattern(".*", "test/test-test"))
+	assert.True(t, MatchesPattern("*", "test-test"))
+	assert.True(t, MatchesPattern("test/*", "test/test"))
+	assert.True(t, MatchesPattern("*", "test/test"))
 	assert.True(t, MatchesPattern("te??", "test"))
 	assert.True(t, MatchesPattern("??st", "test"))
 	assert.True(t, MatchesPattern("*", "test"))
@@ -48,8 +75,12 @@ func TestMatchesPattern(t *testing.T) {
 	assert.True(t, MatchesPattern("release/**/*", "release/q3/0.1.3"))
 	assert.True(t, MatchesPattern("v\\d+\\.\\d+\\.\\d+", "v1.0.2"))
 	assert.True(t, MatchesPattern("v\\d+\\.\\d+\\.\\d+", "v123.033.2112"))
-	assert.False(t, MatchesPattern("v\\d+\\.\\d+\\.\\d+", "v1q.0.2"))
-	assert.False(t, MatchesPattern("v\\d+\\.\\d+\\.\\d+", "v1..2"))
-	assert.False(t, MatchesPattern("v\\d+\\.\\d+\\.\\d+", "v1.2"))
-	assert.False(t, MatchesPattern("v\\d+\\.\\d+\\.\\d+\\.*", "v1.2.20-asdf"))
+	assert.True(t, MatchesPattern("(test)|(main)/*", "test/t"))
+	assert.True(t, MatchesPattern("(test)|(main)/*", "main/t"))
+}
+
+func TestMatchesPattern2(t *testing.T) {
+	replace := strings.NewReplacer("**", "*", ".**", ".*", "*", ".*", "..*", ".*").Replace("*/w*f**f*.***.**.*")
+	assert.NotEmpty(t, replace)
+	//assert.True(t, MatchesPattern(".**", "test/test-test"))
 }