From a87065a081e8c1f1b28ba5f883414d99bb26f5e3 Mon Sep 17 00:00:00 2001 From: pdxlocations Date: Sat, 28 Feb 2026 22:11:11 -0800 Subject: [PATCH 1/3] fix: update repeated field checks to use is_repeated property --- meshtastic/__main__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index 168540025..f21f3e4f0 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -158,11 +158,11 @@ def _printSetting(config_type, uni_name, pref_value, repeated): config_values = getattr(config, config_type.name) if not wholeField: pref_value = getattr(config_values, pref.name) - repeated = pref.label == pref.LABEL_REPEATED + repeated = pref.is_repeated _printSetting(config_type, uni_name, pref_value, repeated) else: for field in config_values.ListFields(): - repeated = field[0].label == field[0].LABEL_REPEATED + repeated = field[0].is_repeated _printSetting(config_type, field[0].name, field[1], repeated) else: # Always show whole field for remote node @@ -253,7 +253,7 @@ def setPref(config, comp_name, raw_val) -> bool: return False # repeating fields need to be handled with append, not setattr - if pref.label != pref.LABEL_REPEATED: + if not pref.is_repeated: try: if config_type.message_type is not None: config_values = getattr(config_part, config_type.name) From 414a621091b5b82f865cb2d313b98e2e484081bf Mon Sep 17 00:00:00 2001 From: pdxlocations Date: Sun, 1 Mar 2026 08:44:37 -0800 Subject: [PATCH 2/3] add fallback for older protobuf dependency --- meshtastic/__main__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index f21f3e4f0..827d77bd7 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -158,11 +158,12 @@ def _printSetting(config_type, uni_name, pref_value, repeated): config_values = getattr(config, config_type.name) if not wholeField: pref_value = getattr(config_values, pref.name) - repeated = pref.is_repeated + repeated = getattr(pref, "is_repeated", pref.label == pref.LABEL_REPEATED) _printSetting(config_type, uni_name, pref_value, repeated) else: for field in config_values.ListFields(): - repeated = field[0].is_repeated + fd = field[0] + repeated = getattr(fd, "is_repeated", fd.label == fd.LABEL_REPEATED) _printSetting(config_type, field[0].name, field[1], repeated) else: # Always show whole field for remote node @@ -253,7 +254,7 @@ def setPref(config, comp_name, raw_val) -> bool: return False # repeating fields need to be handled with append, not setattr - if not pref.is_repeated: + if not getattr(pref, "is_repeated", pref.label == pref.LABEL_REPEATED): try: if config_type.message_type is not None: config_values = getattr(config_part, config_type.name) From b003214d1b0d5521318d36d0216065f29292335e Mon Sep 17 00:00:00 2001 From: pdxlocations Date: Sun, 1 Mar 2026 08:56:59 -0800 Subject: [PATCH 3/3] Fix property fallback --- meshtastic/__main__.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index 827d77bd7..5bb6a0e91 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -158,12 +158,11 @@ def _printSetting(config_type, uni_name, pref_value, repeated): config_values = getattr(config, config_type.name) if not wholeField: pref_value = getattr(config_values, pref.name) - repeated = getattr(pref, "is_repeated", pref.label == pref.LABEL_REPEATED) + repeated = _is_repeated_field(pref) _printSetting(config_type, uni_name, pref_value, repeated) else: for field in config_values.ListFields(): - fd = field[0] - repeated = getattr(fd, "is_repeated", fd.label == fd.LABEL_REPEATED) + repeated = _is_repeated_field(field[0]) _printSetting(config_type, field[0].name, field[1], repeated) else: # Always show whole field for remote node @@ -254,7 +253,7 @@ def setPref(config, comp_name, raw_val) -> bool: return False # repeating fields need to be handled with append, not setattr - if not getattr(pref, "is_repeated", pref.label == pref.LABEL_REPEATED): + if not _is_repeated_field(pref): try: if config_type.message_type is not None: config_values = getattr(config_part, config_type.name) @@ -1132,6 +1131,12 @@ def subscribe() -> None: # pub.subscribe(onNode, "meshtastic.node") +def _is_repeated_field(field_desc) -> bool: + """Return True if the protobuf field is repeated. Protobuf 6:3.10 and later us an is_repeated property""" + if hasattr(field_desc, "is_repeated"): + return bool(field_desc.is_repeated) + return field_desc.label == field_desc.LABEL_REPEATED + def set_missing_flags_false(config_dict: dict, true_defaults: set[tuple[str, str]]) -> None: """Ensure that missing default=True keys are present in the config_dict and set to False.""" for path in true_defaults: