From d075fb71289452980a72b65da9bcdea023e39b2e Mon Sep 17 00:00:00 2001 From: Bill Ferguson Date: Tue, 2 Dec 2025 16:23:28 -0500 Subject: [PATCH] official/apply_camera_style - fixed pattern matching bug that allowed camera styles to be applied twice fixed pattern matching bug affecting Canon EOS R, RP, and R5 Added more debugging statements to pattern matching functions --- official/apply_camera_style.lua | 36 ++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/official/apply_camera_style.lua b/official/apply_camera_style.lua index fe836c3..bc7ba4a 100644 --- a/official/apply_camera_style.lua +++ b/official/apply_camera_style.lua @@ -34,12 +34,17 @@ Bill Ferguson CHANGES + + 20251202 - fixed pattern matching bugs affecting Canon EOS R? series + styles and styles being applied twice if images are reimported + + Added more debugging statements to pattern matching functions ]] local dt = require "darktable" local du = require "lib/dtutils" -- local df = require "lib/dtutils.file" --- local ds = require "lib/dtutils.string" +local ds = require "lib/dtutils.string" -- local dtsys = require "lib/dtutils.system" local log = require "lib/dtutils.log" -- local debug = require "darktable.debug" @@ -50,7 +55,7 @@ local log = require "lib/dtutils.log" -- - - - - - - - - - - - - - - - - - - - - - - - local MODULE = "apply_camera_style" -local DEFAULT_LOG_LEVEL = log.info +local DEFAULT_LOG_LEVEL = log.warn local TMP_DIR = dt.configuration.tmp_dir local STYLE_PREFIX = "_l10n_darktable|_l10n_camera styles|" local MAKER = 3 @@ -154,24 +159,32 @@ local function process_pattern(pattern) local log_level = set_log_level(acs.log_level) + log.msg(log.debug, "input pattern is " .. pattern) + pattern = string.lower(pattern) + log.msg(log.debug, "lower case pattern is " .. pattern) -- strip off series pattern = string.gsub(pattern, " series$", "?") + log.msg(log.debug, "series stripped off pattern is " .. pattern) -- match a character - if string.match(pattern, "?$") then + if string.match(pattern, "r%?%?$") then -- handle EOS R case - pattern = string.gsub(pattern, "?", ".?") + pattern = string.gsub(pattern, "%?%?", ".?") + log.msg(log.debug, "matched EOS R pattern is " .. pattern) else pattern = string.gsub(pattern, "?", ".") + log.msg(log.debug, "didn't match EOS R pattern is " .. pattern) end - pattern = string.gsub(pattern, " ", " ?") -- escape dashes pattern = string.gsub(pattern, "%-", "%%-") + log.msg(log.debug, "escape dashes conditional pattern is " .. pattern) -- make spaces optional pattern = string.gsub(pattern, " ", " ?") -- until we end up with a set, I'll defer set processing, i.e. [...] + --log.msg(log.debug, "make spaces conditional again? pattern is " .. pattern) -- anchor the pattern to ensure we don't short match pattern = "^" .. pattern .. "$" + log.msg(log.debug, "anchored pattern is " .. pattern) restore_log_level(log_level) @@ -326,9 +339,11 @@ local function has_style_tag(image, tag_name) log.msg(log.debug, "looking for tag " .. tag_name) for _, tag in ipairs(image:get_tags()) do - log.msg(log.debug, "checking against " .. tag.name) - if tag.name == tag_name then - log.msg(log.debug, "matched tag " .. tag_name) + log.msg(log.debug, "got attached tag " .. tag.name) + local cleaned_tag_name = string.gsub(tag_name, "_l10n_", "") + log.msg(log.debug, "checking against " .. cleaned_tag_name) + if ds.sanitize_lua(tag.name) == cleaned_tag_name then + log.msg(log.debug, "matched tag " .. cleaned_tag_name) result = true end end @@ -358,7 +373,7 @@ local function mangle_model(model) model = string.gsub(model, "eos 1200d", "eos rebel t5") model = string.gsub(model, "eos 1300d", "eos rebel t6") model = string.gsub(model, "eos 2000d", "eos rebel t7") - log.msg(log.debug, "mandle model returning " .. model) + log.msg(log.debug, "mangle model returning " .. model) end restore_log_level(log_level) @@ -389,14 +404,15 @@ local function apply_style_to_images(images) if acs.styles[maker] then local no_match = true for i, pattern in ipairs(acs.styles[maker].patterns) do + log.msg(log.debug, "pattern is " .. pattern) if string.match(model, pattern) or (i == #acs.styles[maker].patterns and string.match(pattern, "generic")) then local tag_name = "darktable|style|" .. acs.styles[maker].styles[i].name if not has_style_tag(image, tag_name) then image:apply_style(acs.styles[maker].styles[i]) - no_match = false log.msg(log.info, "applied style " .. acs.styles[maker].styles[i].name .. " to " .. image.filename) end + no_match = false log.log_level(loglevel) break end