From 2082ec18d7a742d1ed658a742cb59d1f9b20594b Mon Sep 17 00:00:00 2001 From: Guy Vago Date: Tue, 14 Apr 2026 18:31:07 +0300 Subject: [PATCH 1/2] fix(labels): escape single quotes in custom label descriptions When custom label descriptions contain single quotes (e.g., "Don't merge"), the generated `custom_labels_class` Enum produces malformed Python string literals. This adds `.replace("'", "\\'")` to escape embedded single quotes before wrapping the description in single-quote delimiters. Co-Authored-By: Claude Opus 4.6 (1M context) --- pr_agent/algo/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pr_agent/algo/utils.py b/pr_agent/algo/utils.py index 3e8576753f..d1844b1742 100644 --- a/pr_agent/algo/utils.py +++ b/pr_agent/algo/utils.py @@ -956,7 +956,7 @@ def set_custom_labels(variables, git_provider=None): counter = 0 labels_minimal_to_labels_dict = {} for k, v in labels.items(): - description = "'" + v['description'].strip('\n').replace('\n', '\\n') + "'" + description = "'" + v['description'].strip('\n').replace('\n', '\\n').replace("'", "\\'") + "'" # variables["custom_labels_class"] += f"\n {k.lower().replace(' ', '_')} = '{k}' # {description}" variables["custom_labels_class"] += f"\n {k.lower().replace(' ', '_')} = {description}" labels_minimal_to_labels_dict[k.lower().replace(' ', '_')] = k From 9314319a37525ad3e372f8dcb49ec423679f6361 Mon Sep 17 00:00:00 2001 From: Guy Vago Date: Wed, 15 Apr 2026 09:22:09 +0300 Subject: [PATCH 2/2] fix(labels): validate custom label value before accessing description key Add defensive check so set_custom_labels() handles cases where the label value is not a dict or is missing the 'description' key, instead of raising a KeyError/TypeError. Co-Authored-By: Claude Opus 4.6 (1M context) --- pr_agent/algo/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pr_agent/algo/utils.py b/pr_agent/algo/utils.py index d1844b1742..fbc0a3091f 100644 --- a/pr_agent/algo/utils.py +++ b/pr_agent/algo/utils.py @@ -956,7 +956,8 @@ def set_custom_labels(variables, git_provider=None): counter = 0 labels_minimal_to_labels_dict = {} for k, v in labels.items(): - description = "'" + v['description'].strip('\n').replace('\n', '\\n').replace("'", "\\'") + "'" + description = v.get('description', '') if isinstance(v, dict) else str(v) + description = "'" + description.strip('\n').replace('\n', '\\n').replace("'", "\\'") + "'" # variables["custom_labels_class"] += f"\n {k.lower().replace(' ', '_')} = '{k}' # {description}" variables["custom_labels_class"] += f"\n {k.lower().replace(' ', '_')} = {description}" labels_minimal_to_labels_dict[k.lower().replace(' ', '_')] = k