Skip to content

Commit d46beea

Browse files
committed
Fix same variant set multiple times during EMS
Update extra match search mechanism when one variant is specified several time in search query. Apply same behavior than for extra specifier: all values specified act as an AND operation. For instance "foo=val1 foo=val2" now returns modules that define a foo variant where val1 and val2 are both values available. Specification is only adapted for search context. On selection context only last value is retained when same variant is set several times. Fixes #499
1 parent 48eeb08 commit d46beea

File tree

2 files changed

+8
-11
lines changed

2 files changed

+8
-11
lines changed

tcl/modscan.tcl

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -232,20 +232,15 @@ proc doesModVariantMatch {mod pvrlist} {
232232
set availvrarr([lindex $availvr 0]) [lindex $availvr 1]
233233
set availvrisbool([lindex $availvr 0]) [lindex $availvr 4]
234234
}
235-
foreach pvr $pvrlist {
236-
set pvrarr([lindex $pvr 0]) [lindex $pvr 1]
237-
set pvrisbool([lindex $pvr 0]) [lindex $pvr 2]
238-
}
239-
240235
# no match if a specified variant is not found among module variants or
241236
# if the value is not available
242-
foreach vrname [array names pvrarr] {
237+
foreach pvr $pvrlist {
238+
lassign $pvr vrname pvrval pvrisbool
243239
# if variant is a boolean, specified value should be a boolean too
244240
# any value accepted for free-value variant
245241
if {![info exists availvrarr($vrname)] || ($availvrisbool($vrname)\
246-
&& !$pvrisbool($vrname)) || (!$availvrisbool($vrname) && [llength\
247-
$availvrarr($vrname)] > 0 && $pvrarr($vrname) ni\
248-
$availvrarr($vrname))} {
242+
&& !$pvrisbool) || (!$availvrisbool($vrname) && [llength\
243+
$availvrarr($vrname)] > 0 && $pvrval ni $availvrarr($vrname))} {
249244
set ret 0
250245
break
251246
}

tcl/modspec.tcl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,8 +1431,10 @@ proc parseModuleSpecificationProcAdvVersSpec {mlspec nonamespec xtspec\
14311431
if {[string last = $curarg] != $vrsepidx} {
14321432
knerror "Invalid variant specification '$arg'"
14331433
}
1434-
# replace previous value for variant if already set
1435-
if {[info exists vrnamearr($vrname)]} {
1434+
# replace previous value for variant if already set unless if
1435+
# extra specifier search enabled where all variant spec forms
1436+
# an AND operation
1437+
if {[info exists vrnamearr($vrname)] && !$xtspec} {
14361438
lreplace $vrlist $vrnamearr($vrname) $vrnamearr($vrname)
14371439
} else {
14381440
incr vridx

0 commit comments

Comments
 (0)