Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package chirp for openSUSE:Factory checked 
in at 2025-09-08 09:57:19
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/chirp (Old)
 and      /work/SRC/openSUSE:Factory/.chirp.new.1977 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "chirp"

Mon Sep  8 09:57:19 2025 rev:37 rq:1303000 version:20250905

Changes:
--------
--- /work/SRC/openSUSE:Factory/chirp/chirp.changes      2025-09-01 
17:17:37.161490405 +0200
+++ /work/SRC/openSUSE:Factory/.chirp.new.1977/chirp.changes    2025-09-08 
09:58:16.996286099 +0200
@@ -1,0 +2,11 @@
+Sat Sep  6 09:08:44 UTC 2025 - Andreas Stieger <[email protected]>
+
+- Update to version 20250905:
+  * tk270: Fix for python3
+  * bff8hppro: Fix high power level watts
+  * ft8900: decouple from ft8800
+  * ft8800: fix memory issues
+  * Updated Italian and Spanish translations
+  * Improved autocomplete for memory structure objects
+
+-------------------------------------------------------------------

Old:
----
  chirp-20250829.obscpio

New:
----
  chirp-20250905.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ chirp.spec ++++++
--- /var/tmp/diff_new_pack.1eBZen/_old  2025-09-08 09:58:17.732316691 +0200
+++ /var/tmp/diff_new_pack.1eBZen/_new  2025-09-08 09:58:17.732316691 +0200
@@ -19,7 +19,7 @@
 
 %define pythons python3
 Name:           chirp
-Version:        20250829
+Version:        20250905
 Release:        0
 Summary:        Tool for programming amateur radio sets
 License:        GPL-3.0-only

++++++ _service ++++++
--- /var/tmp/diff_new_pack.1eBZen/_old  2025-09-08 09:58:17.776318519 +0200
+++ /var/tmp/diff_new_pack.1eBZen/_new  2025-09-08 09:58:17.780318686 +0200
@@ -4,8 +4,8 @@
     <param name="scm">git</param>
     <param name="changesgenerate">enable</param>
     <param name="filename">chirp</param>
-    <param name="versionformat">20250829</param>
-    <param name="revision">938353802815c83def264211522fa47abad07ca5</param>
+    <param name="versionformat">20250905</param>
+    <param name="revision">3ae46e3d79291af978e63aa8abfb114612451971</param>
   </service>
   <service mode="manual" name="set_version"/>
   <service name="tar" mode="buildtime"/>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.1eBZen/_old  2025-09-08 09:58:17.804319683 +0200
+++ /var/tmp/diff_new_pack.1eBZen/_new  2025-09-08 09:58:17.808319850 +0200
@@ -1,7 +1,7 @@
 <servicedata>
   <service name="tar_scm">
     <param name="url">https://github.com/kk7ds/chirp.git</param>
-    <param 
name="changesrevision">938353802815c83def264211522fa47abad07ca5</param>
+    <param 
name="changesrevision">3ae46e3d79291af978e63aa8abfb114612451971</param>
   </service>
 </servicedata>
 (No newline at EOF)

++++++ chirp-20250829.obscpio -> chirp-20250905.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20250829/chirp/bitwise.py 
new/chirp-20250905/chirp/bitwise.py
--- old/chirp-20250829/chirp/bitwise.py 2025-08-29 03:13:48.000000000 +0200
+++ new/chirp-20250905/chirp/bitwise.py 2025-09-05 05:34:40.000000000 +0200
@@ -836,12 +836,13 @@
             self._generators[key] = value
             self._keys.append(key)
 
+    def __dir__(self):
+        return list(super().__dir__()) + list(self._generators.keys())
+
     def __getattr__(self, name):
         try:
             return self._generators[name]
         except KeyError:
-            LOG.error('Request for struct element %s not in %s' % (
-                name, self._generators.keys()))
             raise AttributeError("No attribute %s in struct %s" % (
                 name, self._name))
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20250829/chirp/drivers/baofeng_uv17Pro.py 
new/chirp-20250905/chirp/drivers/baofeng_uv17Pro.py
--- old/chirp-20250829/chirp/drivers/baofeng_uv17Pro.py 2025-08-29 
03:13:48.000000000 +0200
+++ new/chirp-20250905/chirp/drivers/baofeng_uv17Pro.py 2025-09-05 
05:34:40.000000000 +0200
@@ -1633,7 +1633,7 @@
 
     VALID_BANDS = [_airband, _vhf_range, UV17Pro._vhf2_range,
                    UV17Pro._uhf_range, UV17Pro._uhf2_range]
-    POWER_LEVELS = [chirp_common.PowerLevel("High", watts=8.00),
+    POWER_LEVELS = [chirp_common.PowerLevel("High", watts=10.00),
                     chirp_common.PowerLevel("Low",  watts=1.00),
                     chirp_common.PowerLevel('Mid', watts=3.00)]
     LIST_POWER_ON_TIME = ['3 Seconds', '5 Seconds', '10 Seconds']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20250829/chirp/drivers/ft7800.py 
new/chirp-20250905/chirp/drivers/ft7800.py
--- old/chirp-20250829/chirp/drivers/ft7800.py  2025-08-29 03:13:48.000000000 
+0200
+++ new/chirp-20250905/chirp/drivers/ft7800.py  2025-09-05 05:34:40.000000000 
+0200
@@ -144,7 +144,8 @@
 
 MODES = ["FM", "AM", "NFM"]
 DUPLEX = ["", "", "-", "+", "split"]
-STEPS = [5.0, 10.0, 12.5, 15.0, 20.0, 25.0, 50.0, 100.0]
+STEPS = (5.0, 10.0, 12.5, 15.0, 20.0, 25.0, 50.0, 100.0)
+STEPS_8800 = (5.0, 10.0, 12.5, 15.0, 20.0, 25.0, 50.0)
 SKIPS = ["", "S", "P", ""]
 
 CHARSET = ["%i" % int(x) for x in range(0, 10)] + \
@@ -251,7 +252,9 @@
     """Base class for FT-7800,7900,8800,8900 radios"""
     BAUD_RATE = 9600
     VENDOR = "Yaesu"
-    MODES = list(MODES)
+    MODES = MODES
+    STEPS = STEPS
+
     _block_size = 64
 
     POWER_LEVELS_VHF = [chirp_common.PowerLevel("Hi", watts=50),
@@ -297,10 +300,10 @@
         rf.has_bank = False
         rf.has_ctone = False
         rf.has_dtcs_polarity = False
-        rf.valid_modes = MODES
+        rf.valid_modes = self.MODES
         rf.valid_tmodes = self.TMODES
         rf.valid_duplexes = ["", "-", "+", "split"]
-        rf.valid_tuning_steps = STEPS
+        rf.valid_tuning_steps = self.STEPS
         rf.valid_bands = [(108000000, 520000000), (700000000, 990000000)]
         rf.valid_skips = ["", "S", "P"]
         rf.valid_power_levels = self.POWER_LEVELS_VHF
@@ -385,6 +388,12 @@
         flgidx = (mem.number - 1) % 4
         _flg["skip%i" % flgidx] = SKIPS.index(mem.skip)
 
+    def _get_mem_mode(self, mem, _mem):
+        mem.mode = self.MODES[_mem.mode]
+
+    def _set_mem_mode(self, mem, _mem):
+        _mem.mode = self.MODES.index(mem.mode)
+
     def get_memory(self, number):
         _mem = self._memobj.memory[number - 1]
 
@@ -397,10 +406,12 @@
         mem.freq = get_freq(int(_mem.freq) * 10000)
         mem.rtone = chirp_common.TONES[_mem.tone]
         mem.tmode = self.TMODES[_mem.tmode]
-        mem.mode = self.MODES[_mem.mode]
+
+        self._get_mem_mode(mem, _mem)
+
         mem.dtcs = chirp_common.DTCS_CODES[_mem.dtcs]
         if self.get_features().has_tuning_step:
-            mem.tuning_step = STEPS[_mem.tune_step]
+            mem.tuning_step = self.STEPS[_mem.tune_step]
         mem.duplex = DUPLEX[_mem.duplex]
         mem.offset = self._get_mem_offset(mem, _mem)
         mem.name = self._get_mem_name(mem, _mem)
@@ -424,10 +435,12 @@
         set_freq(mem.freq, _mem, "freq")
         _mem.tone = chirp_common.TONES.index(mem.rtone)
         _mem.tmode = self.TMODES.index(mem.tmode)
-        _mem.mode = self.MODES.index(mem.mode)
+
+        self._set_mem_mode(mem, _mem)
+
         _mem.dtcs = chirp_common.DTCS_CODES.index(mem.dtcs)
         if self.get_features().has_tuning_step:
-            _mem.tune_step = STEPS.index(mem.tuning_step)
+            _mem.tune_step = self.STEPS.index(mem.tuning_step)
         _mem.duplex = DUPLEX.index(mem.duplex)
         _mem.split = mem.duplex == "split" and int(mem.offset / 10000) or 0
         if mem.power:
@@ -796,7 +809,8 @@
 struct {
   u8 used:1,
      unknown1:1,
-     mode:2,
+     wid_nar:1,
+     am:1,
      unknown2:1,
      duplex:3;
   bbcd freq[3];
@@ -811,7 +825,7 @@
   u8 namevalid:1,
      dtcs:7;
   u8 name[6];
-} memory[500];
+} memory[512];
 
 #seekto 0x%X;
 struct {
@@ -824,7 +838,7 @@
      skip1:2,
      skip2:2,
      skip3:2;
-} flags[250];
+} flags[256];
 
 #seekto 0x7B48;
 u8 checksum;
@@ -849,6 +863,7 @@
     _memstart = 0x0000
 
     TMODES = ["", "Tone", "TSQL", "DTCS"]
+    STEPS = STEPS_8800
 
     @classmethod
     def get_prompts(cls):
@@ -880,7 +895,7 @@
         rf = FTx800Radio.get_features(self)
         rf.has_sub_devices = self.VARIANT == ""
         rf.has_bank = True
-        rf.memory_bounds = (1, 500)
+        rf.memory_bounds = (1, 512)
         return rf
 
     def get_sub_devices(self):
@@ -940,6 +955,21 @@
         _mem.namevalid = 1
         _mem.nameused = bool(mem.name.rstrip())
 
+    def _get_mem_mode(self, mem, _mem):
+        if _mem.am:
+            mem.mode = "AM"
+        else:
+            mem.mode = "NFM" if _mem.wid_nar else "FM"
+
+    def _set_mem_mode(self, mem, _mem):
+        if mem.mode == "AM":
+            _mem.am = True
+            _mem.wid_nar = False
+
+        else:
+            _mem.am = False
+            _mem.wid_nar = mem.mode == "NFM"
+
 
 class FT8800RadioLeft(FT8800Radio):
     """Yaesu FT-8800 Left VFO subdevice"""
@@ -991,7 +1021,7 @@
 
 
 @directory.register
-class FT8900Radio(FT8800Radio):
+class FT8900Radio(FTx800Radio):
     """Yaesu FT-8900"""
     MODEL = "FT-8900"
 
@@ -1000,17 +1030,40 @@
     _block_lengths = [8, 14784, 1]
 
     MODES = ["FM", "NFM", "AM"]
+    TMODES = ["", "Tone", "TSQL", "DTCS"]
+    STEPS = STEPS
 
-    def get_bank_model(self):
-        return
+    @classmethod
+    def get_prompts(cls):
+        rp = chirp_common.RadioPrompts()
+        rp.pre_download = _(
+            "1. Turn radio off.\n"
+            "2. Connect cable to DATA jack.\n"
+            "3. Press and hold in the \"left\" [V/M] key while turning the\n"
+            "     radio on.\n"
+            "4. Rotate the \"right\" DIAL knob to select \"CLONE START\".\n"
+            "5. Press the [SET] key. The display will disappear\n"
+            "     for a moment, then the \"CLONE\" notation will appear.\n"
+            "6. <b>After clicking OK</b>, press the \"left\" [V/M] key to\n"
+            "     send image.\n")
+        rp.pre_upload = _(
+            "1. Turn radio off.\n"
+            "2. Connect cable to DATA jack.\n"
+            "3. Press and hold in the \"left\" [V/M] key while turning the\n"
+            "     radio on.\n"
+            "4. Rotate the \"right\" DIAL knob to select \"CLONE START\".\n"
+            "5. Press the [SET] key. The display will disappear\n"
+            "     for a moment, then the \"CLONE\" notation will appear.\n"
+            "6. Press the \"left\" [LOW] key (\"CLONE -RX-\" will appear"
+            " on\n"
+            "     the display).\n")
+        return rp
 
     def process_mmap(self):
         self._memobj = bitwise.parse(MEM_FORMAT_8900, self._mmap)
 
     def get_features(self):
-        rf = FT8800Radio.get_features(self)
-        rf.has_sub_devices = False
-        rf.has_bank = False
+        rf = FTx800Radio.get_features(self)
         rf.valid_modes = self.MODES
         rf.valid_bands = [(28000000,  29700000),
                           (50000000,  54000000),
@@ -1025,19 +1078,50 @@
     def _checksums(self):
         return [yaesu_clone.YaesuChecksum(0x0000, 0x39C7)]
 
+    def _get_mem_offset(self, mem, _mem):
+        if mem.duplex == "split":
+            return get_freq(int(_mem.split) * 10000)
+
+        # The offset is packed into the upper two bits of the last four
+        # bytes of the name (?!)
+        val = 0
+        for i in _mem.name[2:6]:
+            val <<= 2
+            val |= ((i & 0xC0) >> 6)
+
+        return (val * 5) * 10000
+
+    def _set_mem_offset(self, mem, _mem):
+        if mem.duplex == "split":
+            set_freq(mem.offset, _mem, "split")
+            return
+
+        val = int(mem.offset / 10000) // 5
+        for i in reversed(list(range(2, 6))):
+            _mem.name[i] = (_mem.name[i] & 0x3F) | ((val & 0x03) << 6)
+            val >>= 2
+
+    def _get_mem_name(self, mem, _mem):
+        name = ""
+        if _mem.namevalid:
+            for i in _mem.name:
+                index = int(i) & 0x3F
+                if index < len(CHARSET):
+                    name += CHARSET[index]
+
+        return name.rstrip()
+
+    def _set_mem_name(self, mem, _mem):
+        _mem.name = [CHARSET.index(x) for x in mem.name.ljust(6)[:6]]
+        _mem.namevalid = 1
+        _mem.nameused = bool(mem.name.rstrip())
+
     def _get_mem_skip(self, mem, _mem):
         return SKIPS[_mem.skip]
 
     def _set_mem_skip(self, mem, _mem):
         _mem.skip = SKIPS.index(mem.skip)
 
-    def get_memory(self, number):
-        mem = super().get_memory(number)
-
-        _mem = self._memobj.memory[number - 1]
-
-        return mem
-
     def set_memory(self, mem):
         FT8800Radio.set_memory(self, mem)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20250829/chirp/drivers/tk270.py 
new/chirp-20250905/chirp/drivers/tk270.py
--- old/chirp-20250829/chirp/drivers/tk270.py   2025-08-29 03:13:48.000000000 
+0200
+++ new/chirp-20250905/chirp/drivers/tk270.py   2025-09-05 05:34:40.000000000 
+0200
@@ -48,11 +48,11 @@
 #seekto 0x0338;
 u8 scan[4];             //  4 bytes / bit LSBF for the channel
 
-#seekto 0x033C;
+// #seekto 0x033C;
 u8 active[4];           //  4 bytes / bit LSBF for the active cha
                         // active = 0
 
-#seekto 0x0340;
+// #seekto 0x0340;
 struct {
   u8 kMoni;             // monitor key function
   u8 kScan;             // scan key function
@@ -95,8 +95,8 @@
 MEM_SIZE = 0x400
 BLOCK_SIZE = 8
 MEM_BLOCKS = list(range(0, (MEM_SIZE // BLOCK_SIZE)))
-ACK_CMD = "\x06"
-TIMEOUT = 0.05  # from 0.03 up it' s safe, we set in 0.05 for a margin
+ACK_CMD = b"\x06"
+TIMEOUT = 1
 
 POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=1),
                 chirp_common.PowerLevel("High", watts=5)]
@@ -146,10 +146,10 @@
     rawsend(radio, frame)
 
 
-def make_frame(cmd, addr, data=""):
+def make_frame(cmd, addr, data=b""):
     """Pack the info in the format it likes"""
     ts = struct.pack(">BHB", ord(cmd), addr, 8)
-    if data == "":
+    if not data:
         return ts
     else:
         if len(data) == 8:
@@ -200,33 +200,15 @@
         raise errors.RadioError(msg)
 
     # we will try to open the radio 5 times, this is an improved mechanism
-    magic = "PROGRAM"
-    exito = False
-    for i in range(0, 5):
-        for i in range(0, len(magic)):
-            ack = rawrecv(radio, 1)
-            time.sleep(0.05)
-            send(radio, magic[i])
+    magic = b"PROGRAM"
+    radio.pipe.write(magic)
+    handshake(radio, 'Radio did not respond to program command')
 
-        try:
-            handshake(radio, "Radio not entering Program mode")
-            exito = True
-            break
-        except:
-            LOG.debug("Attempt #%s, failed, trying again" % i)
-            pass
-
-    # check if we had EXITO
-    if exito is False:
-        msg = "The radio did not accept program mode after five tries.\n"
-        msg += "Check you interface cable and power cycle your radio."
-        raise errors.RadioError(msg)
-
-    rawsend(radio, "\x02")
+    rawsend(radio, b"\x02")
     ident = rawrecv(radio, 8)
     handshake(radio, "Comm error after ident", True)
 
-    if not (radio.TYPE in ident):
+    if not (radio.TYPE.encode() in ident):
         LOG.debug("Incorrect model ID, got %s" % util.hexprint(ident))
         msg = "Incorrect model ID, got %s, it not contains %s" % \
             (ident[0:5], radio.TYPE)
@@ -240,11 +222,11 @@
     # UI progress
     status = chirp_common.Status()
     status.cur = 0
-    status.max = MEM_SIZE / BLOCK_SIZE
+    status.max = MEM_SIZE // BLOCK_SIZE
     status.msg = "Cloning from radio..."
     radio.status_fn(status)
 
-    data = ""
+    data = b""
     for addr in MEM_BLOCKS:
         send(radio, make_frame("R", addr * BLOCK_SIZE))
         data += recv(radio)
@@ -257,7 +239,7 @@
         status.msg = "Cloning from radio..."
         radio.status_fn(status)
 
-    return memmap.MemoryMap(data)
+    return memmap.MemoryMapBytes(data)
 
 
 def do_upload(radio):
@@ -267,7 +249,7 @@
     # UI progress
     status = chirp_common.Status()
     status.cur = 0
-    status.max = MEM_SIZE / BLOCK_SIZE
+    status.max = MEM_SIZE // BLOCK_SIZE
     status.msg = "Cloning to radio..."
     radio.status_fn(status)
     count = 0
@@ -319,7 +301,6 @@
     VARIANT = ""
     MODEL = ""
     _kind = ""
-    NEEDS_COMPAT_SERIAL = True
 
     @classmethod
     def get_prompts(cls):
@@ -384,7 +365,13 @@
 
     def sync_in(self):
         """Download from radio"""
-        self._mmap = do_download(self)
+        try:
+            self._mmap = do_download(self)
+        except errors.RadioError:
+            raise
+        except Exception as e:
+            LOG.exception('Error downloading: %s', e)
+            raise errors.RadioError("Error downloading data from radio")
         self.process_mmap()
 
     def sync_out(self):
@@ -392,13 +379,17 @@
         # Get the data ready for upload
         try:
             self._prep_data()
-        except:
+        except Exception as e:
+            LOG.exception('Failed to prepare data for upload: %s', e)
             raise errors.RadioError("Error processing the radio data")
 
         # do the upload
         try:
             do_upload(self)
-        except:
+        except errors.RadioError:
+            raise
+        except Exception as e:
+            LOG.exception('Error uploading: %s', e)
             raise errors.RadioError("Error uploading data to radio")
 
     def set_variant(self):
@@ -446,13 +437,13 @@
         # fldata = "\x00\xf0\xff\xff\xff" * achs + \
             # "\xff" * (5 * (self._upper - achs))
 
-        fldata = "\xFF" * 5 * self._upper
+        fldata = b"\xFF" * 5 * self._upper
         self._fill(0x0280, fldata)
 
     def _fill(self, offset, data):
         """Fill an specified area of the memmap with the passed data"""
         for addr in range(0, len(data)):
-            self._mmap[offset + addr] = data[addr]
+            self._mmap[offset + addr] = bytes([data[addr]])
 
     def process_mmap(self):
         """Process the mem map into the mem object"""
@@ -494,7 +485,7 @@
     def decode_tone(self, val):
         """Parse the tone data to decode from mem, it returns:
         Mode (''|DTCS|Tone), Value (None|###), Polarity (None,N,R)"""
-        if val.get_raw(asbytes=False) == "\xFF\xFF":
+        if val.get_raw() == b"\xFF\xFF":
             return '', None, None
 
         val = int(val)
@@ -557,11 +548,11 @@
         # Memory number
         mem.number = number
 
-        if _mem.get_raw(asbytes=False)[0] == "\xFF":
+        if _mem.get_raw()[0] == 0xFF:
             mem.empty = True
             # but is not enough, you have to clear the memory in the mmap
             # to get it ready for the sync_out process, just in case
-            _mem.set_raw("\xFF" * 16)
+            _mem.set_raw(b"\xFF" * 16)
             # set the channel to inactive state
             self.set_active(number - 1, False)
             return mem
@@ -569,7 +560,7 @@
         # Freq and offset
         mem.freq = int(_mem.rxfreq) * 10
         # tx freq can be blank
-        if _mem.get_raw(asbytes=False)[4] == "\xFF" or int(_mem.txen) == 255:
+        if _mem.get_raw()[4] == 0xFF or int(_mem.txen) == 255:
             # TX freq not set
             mem.offset = 0
             mem.duplex = "off"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20250829/chirp/drivers/tk760g.py 
new/chirp-20250905/chirp/drivers/tk760g.py
--- old/chirp-20250829/chirp/drivers/tk760g.py  2025-08-29 03:13:48.000000000 
+0200
+++ new/chirp-20250905/chirp/drivers/tk760g.py  2025-09-05 05:34:40.000000000 
+0200
@@ -334,7 +334,8 @@
     """Raw read from the radio device"""
     try:
         data = radio.pipe.read(amount)
-    except:
+    except Exception as e:
+        LOG.exception('Failed read: %s', e)
         raise errors.RadioError("Error reading data from radio")
 
     # DEBUG
@@ -348,7 +349,8 @@
     """Raw send to the radio device"""
     try:
         radio.pipe.write(data)
-    except:
+    except Exception as e:
+        LOG.exception('Failed write: %s', e)
         raise errors.RadioError("Error sending data to radio")
 
     # DEBUG
@@ -419,7 +421,7 @@
         raise errors.RadioError('No response from radio')
     elif cmd == b'Z':
         # Empty "zero" block
-        ff = _raw_recv(radio, 1)
+        _raw_recv(radio, 1)
         _handshake(radio, "after zero block")
         return b'\xff' * 256
     elif cmd != b'W':
@@ -749,7 +751,7 @@
             if bnumb != 255 and (bank != 255 and bank != 0):
                 try:
                     data[bank].append(ch)
-                except:
+                except Exception:
                     data[bank] = list()
                     data[bank].append(ch)
                 data[bank].sort()
@@ -1118,7 +1120,6 @@
         mess = self._memobj.message
         keys = self._memobj.keys
         idm = self._memobj.id
-        passwd = self._memobj.passwords
 
         # basic features of the radio
         basic = RadioSettingGroup("basic", "Basic Settings")
@@ -1372,7 +1373,7 @@
                     # catching the "off" values as zero
                     try:
                         value = int(value)
-                    except:
+                    except ValueError:
                         value = 0
 
                     # tot case step 15
@@ -1455,7 +1456,8 @@
                 b = 0
             mem = self._memobj.memory[loc - 1]
             mem.bank = b + 1
-        except:
+        except Exception as e:
+            LOG.warning('Failed to set bank: %s', e)
             msg = "You can't have a channel without a bank, click another bank"
             raise errors.InvalidDataError(msg)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20250829/chirp/drivers/tk8180.py 
new/chirp-20250905/chirp/drivers/tk8180.py
--- old/chirp-20250829/chirp/drivers/tk8180.py  2025-08-29 03:13:48.000000000 
+0200
+++ new/chirp-20250905/chirp/drivers/tk8180.py  2025-09-05 05:34:40.000000000 
+0200
@@ -583,8 +583,8 @@
     def __init__(self, *a, **k):
         self._zones = []
         chirp_common.CloneModeRadio.__init__(self, *a, **k)
-        _dat_header = (b'KPG89D\xFF\xFF\xFF\xFFV1.61' + self._model +
-                       (b'\xFF' * 11) + (b'\xFF' * 32))
+        self._dat_header = (b'KPG89D\xFF\xFF\xFF\xFFV1.61' + self._model +
+                            (b'\xFF' * 11) + (b'\xFF' * 32))
 
     def sync_in(self):
         try:
@@ -637,7 +637,6 @@
         return self._model.startswith(b'P')
 
     def probe_layout(self):
-        start_addrs = []
         tmp_format = '#seekto 0x0A00; ul16 zone_starts[128];'
         mem = bitwise.parse(tmp_format, self._mmap)
         zone_format = """struct zoneinfo {
@@ -735,7 +734,6 @@
                 dest_zoneinfo.set_raw(source_zoneinfo.get_raw(asbytes=False))
                 dest_zoneinfo.count = count
 
-                source_i = 0
                 for dest_i in range(0, min(count, old_count)):
                     dest[dest_i].set_raw(source[dest_i].get_raw(asbytes=False))
             else:
@@ -1450,8 +1448,6 @@
         return group
 
     def get_settings(self):
-        settings = self._memobj.settings
-
         zones = self._get_zones()
         common1 = self._get_common1()
         common2 = self._get_common2()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20250829/chirp/locale/es.po 
new/chirp-20250905/chirp/locale/es.po
--- old/chirp-20250829/chirp/locale/es.po       2025-08-29 03:13:48.000000000 
+0200
+++ new/chirp-20250905/chirp/locale/es.po       2025-09-05 05:34:40.000000000 
+0200
@@ -7,7 +7,7 @@
 "Project-Id-Version: CHIRP\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2025-08-28 16:10-0700\n"
-"PO-Revision-Date: 2025-05-09 01:28-0400\n"
+"PO-Revision-Date: 2025-08-29 21:56-0400\n"
 "Last-Translator: MELERIX\n"
 "Language-Team: \n"
 "Language: es\n"
@@ -2100,7 +2100,7 @@
 #: ../wxui/developer.py:617
 #, python-format
 msgid "Issue %i is not in a valid state to load modules. It is highly 
recommended that you not attempt to manually load modules from this issue as it 
is likely to cause problems."
-msgstr ""
+msgstr "El problema %i no está en un estado válido para cargar módulos. Se 
recomienda encarecidamente que no intentes cargar módulos manualmente desde 
este problema ya que es probable que cause problemas."
 
 #: ../wxui/developer.py:672
 msgid "Issue number:"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20250829/chirp/locale/it.po 
new/chirp-20250905/chirp/locale/it.po
--- old/chirp-20250829/chirp/locale/it.po       2025-08-29 03:13:48.000000000 
+0200
+++ new/chirp-20250905/chirp/locale/it.po       2025-09-05 05:34:40.000000000 
+0200
@@ -10,7 +10,7 @@
 "Project-Id-Version: CHIRP\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2025-08-28 16:10-0700\n"
-"PO-Revision-Date: 2025-05-11 11:19+0200\n"
+"PO-Revision-Date: 2025-08-31 11:00+0200\n"
 "Last-Translator: Giovanni Scafora IK5TWZ <[email protected]>\n"
 "Language-Team: CHIRP Italian Translation\n"
 "Language: it\n"
@@ -2100,7 +2100,7 @@
 #: ../wxui/developer.py:617
 #, python-format
 msgid "Issue %i is not in a valid state to load modules. It is highly 
recommended that you not attempt to manually load modules from this issue as it 
is likely to cause problems."
-msgstr ""
+msgstr "Il problema %i non è in uno stato valido per caricare i moduli. Si 
consiglia vivamente di non tentare di caricare manualmente i moduli da questo 
modulo, poiché ciò potrebbe causare problemi."
 
 #: ../wxui/developer.py:672
 msgid "Issue number:"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20250829/chirp/wxui/memedit.py 
new/chirp-20250905/chirp/wxui/memedit.py
--- old/chirp-20250829/chirp/wxui/memedit.py    2025-08-29 03:13:48.000000000 
+0200
+++ new/chirp-20250905/chirp/wxui/memedit.py    2025-09-05 05:34:40.000000000 
+0200
@@ -1458,6 +1458,11 @@
                 self._grid.GetRowLabelValue(row)))
             return
 
+        if not isinstance(memory.number, int):
+            LOG.error('Memory for row %i (lookup number %r) '
+                      'has non-integer number field: %r',
+                      row, number, memory.number)
+
         if row in self._memory_errors:
             del self._memory_errors[row]
 
Binary files old/chirp-20250829/tests/images/Kenwood_TK-278.img and 
new/chirp-20250905/tests/images/Kenwood_TK-278.img differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20250829/tests/py3-untested-drivers.txt 
new/chirp-20250905/tests/py3-untested-drivers.txt
--- old/chirp-20250829/tests/py3-untested-drivers.txt   2025-08-29 
03:13:48.000000000 +0200
+++ new/chirp-20250905/tests/py3-untested-drivers.txt   2025-09-05 
05:34:40.000000000 +0200
@@ -17,14 +17,6 @@
 KYD_IP-620
 KYD_NC-630A
 Kenwood_ITM
-Kenwood_TK-260
-Kenwood_TK-270
-Kenwood_TK-272
-Kenwood_TK-278
-Kenwood_TK-360
-Kenwood_TK-370
-Kenwood_TK-372
-Kenwood_TK-378
 Kenwood_TM-D710_CloneMode
 Kenwood_TS-480_CloneMode
 Kenwood_TS-480_LiveMode
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20250829/tests/test_edges.py 
new/chirp-20250905/tests/test_edges.py
--- old/chirp-20250829/tests/test_edges.py      2025-08-29 03:13:48.000000000 
+0200
+++ new/chirp-20250905/tests/test_edges.py      2025-09-05 05:34:40.000000000 
+0200
@@ -142,6 +142,11 @@
             # radios have empty in the immutable set.
             if m1.empty:
                 m1.empty = False
+
+            self.assertIsInstance(m1.number, int,
+                                  ('Special memory %s number %r is not an '
+                                   'integer') % (name, m1.number))
+
             try:
                 del m1.extra
             except AttributeError:
@@ -174,6 +179,9 @@
             self.assertEqual('', m.extd_number,
                              'Non-special memory %i should not have '
                              'extd_number set to %r' % (i, m.extd_number))
+            self.assertIsInstance(m.number, int,
+                                  'Memory number %r is not an integer' %
+                                  m.number)
 
     def test_get_memory_name_trailing_whitespace(self):
         if self.radio.MODEL == 'KG-UV8E':
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20250829/tools/cpep8.manifest 
new/chirp-20250905/tools/cpep8.manifest
--- old/chirp-20250829/tools/cpep8.manifest     2025-08-29 03:13:48.000000000 
+0200
+++ new/chirp-20250905/tools/cpep8.manifest     2025-09-05 05:34:40.000000000 
+0200
@@ -53,8 +53,6 @@
 ./chirp/drivers/th_uv88.py
 ./chirp/drivers/thd72.py
 ./chirp/drivers/tk760.py
-./chirp/drivers/tk760g.py
-./chirp/drivers/tk8180.py
 ./chirp/drivers/tmd710.py
 ./chirp/drivers/ts480.py
 ./chirp/drivers/ts590.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20250829/tools/fast-driver.py 
new/chirp-20250905/tools/fast-driver.py
--- old/chirp-20250829/tools/fast-driver.py     2025-08-29 03:13:48.000000000 
+0200
+++ new/chirp-20250905/tools/fast-driver.py     2025-09-05 05:34:40.000000000 
+0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env Python3
+#!/usr/bin/env python3
 
 import glob
 import os

++++++ chirp.obsinfo ++++++
--- /var/tmp/diff_new_pack.1eBZen/_old  2025-09-08 09:58:18.532349942 +0200
+++ /var/tmp/diff_new_pack.1eBZen/_new  2025-09-08 09:58:18.536350109 +0200
@@ -1,5 +1,5 @@
 name: chirp
-version: 20250829
-mtime: 1756430028
-commit: 938353802815c83def264211522fa47abad07ca5
+version: 20250905
+mtime: 1757043280
+commit: 3ae46e3d79291af978e63aa8abfb114612451971
 

Reply via email to