@@ -136,6 +136,21 @@ local function tbl_get(t, default, ...)
136136 return t or default
137137end
138138
139+ --- @param t table
140+ --- @param value any
141+ local function setNested (t , value , ...)
142+ local keys = {... }
143+ local cur = t
144+ for i = 1 , # keys - 1 do
145+ local k = keys [i ]
146+ if type (cur [k ]) ~= " table" then
147+ cur [k ] = {}
148+ end
149+ cur = cur [k ]
150+ end
151+ cur [keys [# keys ]] = value
152+ end
153+
139154local warned_run_cmd_shim = false
140155
141156--- @param opts Shelua.Opts
@@ -419,6 +434,7 @@ local cmd_mt = {
419434 end ,
420435}
421436
437+ local has_warned_about_x_ = false
422438local MT = {
423439 --- @type Shelua.Opts
424440 __metatable = {
@@ -441,13 +457,27 @@ local MT = {
441457 -- change settings by assigning them to table
442458 __newindex = function (self , key , value )
443459 if type (key ) == " string" and key :sub (1 , 3 ) == " _x_" then
444- local fkey = key :sub (4 )
460+ if not has_warned_about_x_ then
461+ io.stderr :write (" shelua: Using `sh._x_name = { nested = { settings = { to_be = \" merged\" } } }` to deep extend settings has been deprecated.\n " )
462+ io.stderr :write (" Use `sh[{\" name\" }] = { nested = { settings = { to_be = \" merged\" } } }` instead.\n " )
463+ end
464+ key = key :sub (4 )
465+ local opts = getmetatable (self )
466+ if type (rawget (opts , key )) ~= " table" then
467+ opts [key ] = value
468+ else
469+ recUpdate (opts [key ], value )
470+ end
471+ elseif type (key ) == " table" and key [1 ] and # key == 1 then
472+ key = key [1 ]
445473 local opts = getmetatable (self )
446- if type (rawget (opts , fkey )) ~= " table" then
447- opts [fkey ] = value
474+ if type (rawget (opts , key )) ~= " table" then
475+ opts [key ] = value
448476 else
449- recUpdate (opts [fkey ], value )
477+ recUpdate (opts [key ], value )
450478 end
479+ elseif type (key ) == " table" and # key > 1 then
480+ setNested (getmetatable (self ), value , (unpack or table.unpack )(key ))
451481 else
452482 getmetatable (self )[key ] = value
453483 end
0 commit comments