Skip to content

Commit a3dcb5b

Browse files
fix(target): make --target flag case insensitive to match Tanka (#56)
Tanka's --target flag performs case-insensitive regex matching on kind/name, but rtk was using case-sensitive matching. This caused filters like "configmap/.*" to not match "ConfigMap" resources. Fix both target filtering code paths (extract_manifests in util.rs for show/apply/diff/prune, and compile_target_patterns in export.rs for export) to use RegexBuilder with case_insensitive(true). Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 2d33261 commit a3dcb5b

File tree

7 files changed

+76
-2
lines changed

7 files changed

+76
-2
lines changed

cmds/rtk/src/commands/util.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ pub fn extract_manifests(
127127
if !target_filters.is_empty() {
128128
let filters: Vec<regex::Regex> = target_filters
129129
.iter()
130-
.map(|f| regex::Regex::new(f))
130+
.map(|f| regex::RegexBuilder::new(f).case_insensitive(true).build())
131131
.collect::<Result<Vec<_>, _>>()
132132
.context("invalid target filter regex")?;
133133

cmds/rtk/src/export.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,10 @@ fn compile_target_patterns(patterns: &[String]) -> Result<Vec<regex::Regex>> {
317317
patterns
318318
.iter()
319319
.map(|p| {
320-
regex::Regex::new(p).map_err(|e| anyhow::anyhow!("Invalid target regex '{}': {}", p, e))
320+
regex::RegexBuilder::new(p)
321+
.case_insensitive(true)
322+
.build()
323+
.map_err(|e| anyhow::anyhow!("Invalid target regex '{}': {}", p, e))
321324
})
322325
.collect()
323326
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
apiVersion: v1
2+
data:
3+
key: value
4+
kind: ConfigMap
5+
metadata:
6+
name: app-config
7+
namespace: default
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"default/ConfigMap-app-config.golden": "main.jsonnet"
3+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"version": 1,
3+
"dependencies": [],
4+
"legacyImports": true
5+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Test environment for case-insensitive --target flag
2+
// Tanka's --target is case insensitive, so "configmap/.*" should match "ConfigMap"
3+
4+
local env = {
5+
apiVersion: 'tanka.dev/v1alpha1',
6+
kind: 'Environment',
7+
metadata: {
8+
name: 'target-filter-case-insensitive-test',
9+
},
10+
spec: {
11+
apiServer: 'https://localhost:6443',
12+
namespace: 'default',
13+
},
14+
data: {
15+
// This should be exported (matches configmap/.* case-insensitively)
16+
'app-config': {
17+
apiVersion: 'v1',
18+
kind: 'ConfigMap',
19+
metadata: {
20+
name: 'app-config',
21+
namespace: 'default',
22+
},
23+
data: {
24+
key: 'value',
25+
},
26+
},
27+
// This should NOT be exported (Deployment doesn't match configmap/.*)
28+
'app-deployment': {
29+
apiVersion: 'apps/v1',
30+
kind: 'Deployment',
31+
metadata: {
32+
name: 'app',
33+
namespace: 'default',
34+
},
35+
spec: {
36+
replicas: 1,
37+
selector: {
38+
matchLabels: { app: 'app' },
39+
},
40+
template: {
41+
metadata: { labels: { app: 'app' } },
42+
spec: {
43+
containers: [{
44+
name: 'main',
45+
image: 'nginx:1.25',
46+
}],
47+
},
48+
},
49+
},
50+
},
51+
},
52+
};
53+
54+
env
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[args]
2+
export = ["--target", "configmap/.*"]

0 commit comments

Comments
 (0)