diff --git a/cmds/rtk/src/commands/util.rs b/cmds/rtk/src/commands/util.rs index 2885a749..a5c1c9ea 100644 --- a/cmds/rtk/src/commands/util.rs +++ b/cmds/rtk/src/commands/util.rs @@ -127,7 +127,7 @@ pub fn extract_manifests( if !target_filters.is_empty() { let filters: Vec = target_filters .iter() - .map(|f| regex::Regex::new(f)) + .map(|f| regex::RegexBuilder::new(f).case_insensitive(true).build()) .collect::, _>>() .context("invalid target filter regex")?; diff --git a/cmds/rtk/src/export.rs b/cmds/rtk/src/export.rs index a2f11c65..7270ab28 100644 --- a/cmds/rtk/src/export.rs +++ b/cmds/rtk/src/export.rs @@ -317,7 +317,10 @@ fn compile_target_patterns(patterns: &[String]) -> Result> { patterns .iter() .map(|p| { - regex::Regex::new(p).map_err(|e| anyhow::anyhow!("Invalid target regex '{}': {}", p, e)) + regex::RegexBuilder::new(p) + .case_insensitive(true) + .build() + .map_err(|e| anyhow::anyhow!("Invalid target regex '{}': {}", p, e)) }) .collect() } diff --git a/test_fixtures/golden_envs/target_filter_case_insensitive_env/golden/default/ConfigMap-app-config.golden b/test_fixtures/golden_envs/target_filter_case_insensitive_env/golden/default/ConfigMap-app-config.golden new file mode 100644 index 00000000..1da689e1 --- /dev/null +++ b/test_fixtures/golden_envs/target_filter_case_insensitive_env/golden/default/ConfigMap-app-config.golden @@ -0,0 +1,7 @@ +apiVersion: v1 +data: + key: value +kind: ConfigMap +metadata: + name: app-config + namespace: default diff --git a/test_fixtures/golden_envs/target_filter_case_insensitive_env/golden/manifest.json b/test_fixtures/golden_envs/target_filter_case_insensitive_env/golden/manifest.json new file mode 100644 index 00000000..b673de20 --- /dev/null +++ b/test_fixtures/golden_envs/target_filter_case_insensitive_env/golden/manifest.json @@ -0,0 +1,3 @@ +{ + "default/ConfigMap-app-config.golden": "main.jsonnet" +} \ No newline at end of file diff --git a/test_fixtures/golden_envs/target_filter_case_insensitive_env/jsonnetfile.json b/test_fixtures/golden_envs/target_filter_case_insensitive_env/jsonnetfile.json new file mode 100644 index 00000000..4388812c --- /dev/null +++ b/test_fixtures/golden_envs/target_filter_case_insensitive_env/jsonnetfile.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "dependencies": [], + "legacyImports": true +} diff --git a/test_fixtures/golden_envs/target_filter_case_insensitive_env/main.jsonnet b/test_fixtures/golden_envs/target_filter_case_insensitive_env/main.jsonnet new file mode 100644 index 00000000..864e13f8 --- /dev/null +++ b/test_fixtures/golden_envs/target_filter_case_insensitive_env/main.jsonnet @@ -0,0 +1,54 @@ +// Test environment for case-insensitive --target flag +// Tanka's --target is case insensitive, so "configmap/.*" should match "ConfigMap" + +local env = { + apiVersion: 'tanka.dev/v1alpha1', + kind: 'Environment', + metadata: { + name: 'target-filter-case-insensitive-test', + }, + spec: { + apiServer: 'https://localhost:6443', + namespace: 'default', + }, + data: { + // This should be exported (matches configmap/.* case-insensitively) + 'app-config': { + apiVersion: 'v1', + kind: 'ConfigMap', + metadata: { + name: 'app-config', + namespace: 'default', + }, + data: { + key: 'value', + }, + }, + // This should NOT be exported (Deployment doesn't match configmap/.*) + 'app-deployment': { + apiVersion: 'apps/v1', + kind: 'Deployment', + metadata: { + name: 'app', + namespace: 'default', + }, + spec: { + replicas: 1, + selector: { + matchLabels: { app: 'app' }, + }, + template: { + metadata: { labels: { app: 'app' } }, + spec: { + containers: [{ + name: 'main', + image: 'nginx:1.25', + }], + }, + }, + }, + }, + }, +}; + +env diff --git a/test_fixtures/golden_envs/target_filter_case_insensitive_env/tk-compare.toml b/test_fixtures/golden_envs/target_filter_case_insensitive_env/tk-compare.toml new file mode 100644 index 00000000..7c9eba60 --- /dev/null +++ b/test_fixtures/golden_envs/target_filter_case_insensitive_env/tk-compare.toml @@ -0,0 +1,2 @@ +[args] +export = ["--target", "configmap/.*"]