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
