Skip to content

Commit 78177d5

Browse files
authored
Merge pull request #3225 from jimklimov/FTY-remerge-20251220
FTY remerge from master as of 2025-12-18
2 parents fe63273 + d4484eb commit 78177d5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+2295
-205
lines changed

.github/workflows/01-make-dist.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,15 @@ jobs:
5050
with:
5151
fetch-depth: 0
5252
fetch-tags: true
53+
# NOTE: pull_request_target protects us by using the workflow definition
54+
# from target branch (so trusted operations like artifact management can
55+
# be used), but it also uses the code from that branch too, so fix it back.
56+
# Maybe use "github.event.pull_request.merge_commit_sha" instead?.. though
57+
# it may be null if the PR is not mergeable or is still checked for that,
58+
# or may return the commit for PREVIOUS pushed iteration's merge to target.
59+
# See more ideas in https://github.com/actions/checkout/issues/518 :
60+
ref: "${{ github.event.pull_request.number > 0 && github.event.pull_request.head.sha || github.ref_name }}"
61+
persist-credentials: false
5362

5463
# https://github.com/marketplace/actions/substitute-string
5564
# See also examples in https://github.com/dhimmel/dump-actions-context/

Makefile.am

Lines changed: 73 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ SUBDIRS_ALL_LIBS_LOCAL = \
8484
# (which used to cause us a lot of headache, building same things twice at
8585
# the same time).
8686

87+
# For the intents and purposes of recursive-make calls, we have built
88+
# or updated include/nut_version.h before other targets in all-recursive
89+
### MAINTAINER_GENERATE_HEADER_DEBUG = yes
90+
### export NUT_VERSION_H_GENERATED = true
91+
8792
#all all-recursive all-am-local all-local: all-fanout-maybe
8893
all-recursive: all-fanout-maybe
8994

@@ -105,7 +110,10 @@ all-fanout-maybe:
105110
if [ x"$(SUBDIR_MAKE_VERBOSE)" != x0 ] ; then \
106111
echo " SUBDIR-MAKE $@: implement optimization for parallel make as 'make all-fanout-subdirs'" ; \
107112
fi ; \
108-
$(MAKE) $(AM_MAKEFLAGS) all-fanout-subdirs ;; \
113+
$(MAKE) $(AM_MAKEFLAGS) all-fanout-subdirs || exit ; \
114+
if [ x"$(SUBDIR_MAKE_VERBOSE)" != x0 ] ; then \
115+
echo " SUBDIR-MAKE $@: optimization for parallel make as 'make all-fanout-subdirs' finished; now automake rules can follow up with default implementation of 'all-recursive' and/or 'all' (may try to regenerate some files again; should keep existing results though)" ; \
116+
fi ;; \
109117
*) \
110118
if [ x"$(SUBDIR_MAKE_VERBOSE)" != x0 ] ; then \
111119
echo " SUBDIR-MAKE $@: skip optimization for parallel make - we seem to run sequentially now, seen MAKEFLAGS='$(MAKEFLAGS)' AM_MAKEFLAGS='$(AM_MAKEFLAGS)'" ; \
@@ -123,10 +131,10 @@ all-fanout-maybe:
123131
# FIXME: Alas, we still tend to step on our toes when making everything at
124132
# once from scratch, so still do benefit from pre-making the libraries:
125133
all-fanout-staged:
126-
+$(MAKE) $(AM_MAKEFLAGS) all/include
127-
+$(MAKE) $(AM_MAKEFLAGS) all/common
128-
+$(MAKE) $(AM_MAKEFLAGS) all-fanout-libs
129-
+$(MAKE) $(AM_MAKEFLAGS) all-fanout-subdirs
134+
+$(MAKE) $(AM_MAKEFLAGS) NUT_VERSION_H_GENERATED=false all/include
135+
+$(MAKE) $(AM_MAKEFLAGS) NUT_VERSION_H_GENERATED=true all/common
136+
+$(MAKE) $(AM_MAKEFLAGS) NUT_VERSION_H_GENERATED=true all-fanout-libs
137+
+$(MAKE) $(AM_MAKEFLAGS) NUT_VERSION_H_GENERATED=true all-fanout-subdirs
130138

131139
all-fanout-subdirs: $(SUBDIRS_ALL_RECURSIVE)
132140

@@ -190,12 +198,12 @@ SUBDIR_TGT_RULE = ( \
190198
[ x"$${TGT-}" != x ] || TGT="`echo '$@' | awk -F/ '{print $$1}'`" ; \
191199
[ x"$${DIR-}" != x ] || DIR="`echo '$@' | sed 's,^[^/]*/,,'`" ; \
192200
if [ x"$(SUBDIR_MAKE_VERBOSE)" != x0 ] ; then \
193-
echo " SUBDIR-MAKE STARTING: 'make $$TGT' in $$DIR ..." ; \
201+
echo " SUBDIR-MAKE STARTING $@: 'make $${SUBDIR_TGT_MAKEFLAGS-} $$TGT' in $$DIR ..." ; \
194202
fi ; \
195203
cd "$(abs_builddir)/$${DIR}" && \
196204
$(MAKE) $(AM_MAKEFLAGS) $${SUBDIR_TGT_MAKEFLAGS-} "$${TGT}" || { RES=$$?; echo " SUBDIR-MAKE FAILURE: 'make $$TGT' in $$DIR" >&2 ; exit $$RES ; } ; \
197205
if [ x"$(SUBDIR_MAKE_VERBOSE)" != x0 ] ; then \
198-
echo " SUBDIR-MAKE SUCCESS: 'make $$TGT' in $$DIR" ; \
206+
echo " SUBDIR-MAKE SUCCESS $@: 'make $${SUBDIR_TGT_MAKEFLAGS-} $$TGT' in $$DIR" ; \
199207
fi ; \
200208
)
201209

@@ -207,7 +215,8 @@ SUBDIR_TGT_RULE = ( \
207215

208216
### Delivers: nut_version.h
209217
all-libs-local/include:
210-
+@$(SUBDIR_TGT_RULE)
218+
+@NUT_VERSION_H_GENERATED=false; export NUT_VERSION_H_GENERATED; \
219+
$(SUBDIR_TGT_RULE)
211220

212221
### Delivers: libcommon.la libcommonclient.la libcommonstr.la libcommonstrjson.la
213222
### (consume only one of these at a time!)
@@ -216,7 +225,8 @@ all-libs-local/include:
216225
### Requires-ext: include/nut_version.h
217226
### Requires-int: libparseconf.la libcommonclient.la
218227
all-libs-local/common: all-libs-local/include
219-
+@$(SUBDIR_TGT_RULE)
228+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
229+
$(SUBDIR_TGT_RULE)
220230

221231
### Delivers: libupsclient.la libnutclient.la libnutclientstub.la
222232
### Delivers: libupsclient-version.h
@@ -226,7 +236,8 @@ all-libs-local/common: all-libs-local/include
226236
### Requires-ext: common/libparseconf.la
227237
### Requires-int: libupsclient.la
228238
all-libs-local/clients: all-libs-local/common
229-
+@$(SUBDIR_TGT_RULE)
239+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
240+
$(SUBDIR_TGT_RULE)
230241

231242
### Delivers: libdummy.la libdummy_serial.la libdummy_upsdrvquery.la
232243
### Delivers: libdummy_mockdrv.la libserial-nutscan.la
@@ -236,7 +247,8 @@ all-libs-local/clients: all-libs-local/common
236247
### Requires-int: libdummy.la libdummy_upsdrvquery.la
237248
### Requires-int: libdummy_serial.la
238249
all-libs-local/drivers: all-libs-local/common
239-
+@$(SUBDIR_TGT_RULE)
250+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
251+
$(SUBDIR_TGT_RULE)
240252

241253
### Delivers: libdriverstubusb.la
242254
### LIB-Requires-ext: #COMMENTED-AWAY# common/libcommon.la
@@ -245,7 +257,8 @@ all-libs-local/drivers: all-libs-local/common
245257
### Requires-ext: drivers/libdummy_mockdrv.la
246258
### Requires-int: libdriverstubusb.la
247259
all-libs-local/tests: all-libs-local/common
248-
+@$(SUBDIR_TGT_RULE)
260+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
261+
$(SUBDIR_TGT_RULE)
249262

250263
### Delivers: generated sources and/or headers for nut-scanner
251264
### No dependencies: actually runs as part of autogen.sh but may be
@@ -265,7 +278,8 @@ all-libs-local/tools:
265278
### however does directly use libupsclient-version.h
266279
### for hints to find it at run-time
267280
all-libs-local/tools/nut-scanner: all-libs-local/drivers all-libs-local/common all-libs-local/clients all-libs-local/tools
268-
+@$(SUBDIR_TGT_RULE)
281+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
282+
$(SUBDIR_TGT_RULE)
269283

270284
# Handle all SUBDIRS_ALL_RECURSIVE in a way that dependencies can be specified,
271285
# and portably to different make program implementations. Note we may revisit
@@ -282,13 +296,16 @@ all-recursive/data:
282296
+@$(SUBDIR_TGT_RULE)
283297

284298
all/include: all-libs-local/include
285-
+@$(SUBDIR_TGT_RULE)
299+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
300+
$(SUBDIR_TGT_RULE)
286301

287302
prep-src-docs/docs/man:
288-
+@SUBDIR_TGT_MAKEFLAGS='MAINTAINER_DOCS_PREP_MAN_DELAY=3'; export SUBDIR_TGT_MAKEFLAGS; $(SUBDIR_TGT_RULE)
303+
+@SUBDIR_TGT_MAKEFLAGS='MAINTAINER_DOCS_PREP_MAN_DELAY=3'; export SUBDIR_TGT_MAKEFLAGS; \
304+
$(SUBDIR_TGT_RULE)
289305

290306
prep-src-docs/docs:
291-
+@DOCS_NO_MAN=true; export DOCS_NO_MAN; $(SUBDIR_TGT_RULE)
307+
+@DOCS_NO_MAN=true; export DOCS_NO_MAN; \
308+
$(SUBDIR_TGT_RULE)
292309

293310
all/docs/man: prep-src-docs/docs/man
294311
+@$(SUBDIR_TGT_RULE)
@@ -325,15 +342,17 @@ all-recursive/docs: all/docs all/docs/man
325342

326343
### Requires-int: libparseconf.la libcommonclient.la
327344
all/common: all/include all-libs-local/common
328-
+@$(SUBDIR_TGT_RULE)
345+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
346+
$(SUBDIR_TGT_RULE)
329347

330348
### Requires-ext: common/libcommon.la common/libcommonclient.la
331349
### Requires-ext: common/libparseconf.la
332350
### Requires-ext: common/libcommonversion.la
333351
### Requires-ext: common/libcommonstrjson.la
334352
### Requires-int: libupsclient.la
335353
all/clients: all/common all-libs-local/clients
336-
+@$(SUBDIR_TGT_RULE)
354+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
355+
$(SUBDIR_TGT_RULE)
337356

338357
### Summary of drivers/ subdir dependencies:
339358
### Requires-ext: common/libcommon.la common/libparseconf.la
@@ -356,7 +375,8 @@ if SOME_DRIVERS
356375
# in the default list - FIXME: configure.ac could tell us, so
357376
# we could provide it for tests/NIT anyway...)
358377
all/drivers: all-libs-local/clients all-libs-local/common all-libs-local/drivers
359-
+@$(SUBDIR_TGT_RULE)
378+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
379+
$(SUBDIR_TGT_RULE)
360380

361381
all-drivers: all/drivers
362382
else !SOME_DRIVERS
@@ -368,18 +388,22 @@ else !SOME_DRIVERS
368388
# should depend on both "dummy-ups" and the rest in so constrained
369389
# "all/drivers". This allows to ultimately not order one after another.
370390
dummy-ups$(EXEEXT)/drivers: all-libs-local/clients all-libs-local/common all-libs-local/drivers
371-
+@$(SUBDIR_TGT_RULE)
391+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
392+
$(SUBDIR_TGT_RULE)
372393

373394
all/drivers: all/common all-libs-local/drivers
374-
+@SUBDIR_TGT_MAKEFLAGS='NUTSW_DRIVERLIST_DUMMY_UPS=dummy'; export SUBDIR_TGT_MAKEFLAGS; $(SUBDIR_TGT_RULE)
395+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
396+
SUBDIR_TGT_MAKEFLAGS='NUTSW_DRIVERLIST_DUMMY_UPS=dummy'; export SUBDIR_TGT_MAKEFLAGS; \
397+
$(SUBDIR_TGT_RULE)
375398

376399
all-drivers: dummy-ups$(EXEEXT)/drivers all/drivers
377400
endif !SOME_DRIVERS
378401

379402
### Requires-ext: common/libcommon.la common/libparseconf.la
380403
### Requires-ext: common/libcommonversion.la
381404
all/server: all-libs-local/common
382-
+@$(SUBDIR_TGT_RULE)
405+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
406+
$(SUBDIR_TGT_RULE)
383407

384408
### LIB-Requires-ext: drivers/libserial-nutscan.la
385409
### LIB-Requires-ext: common/libnutwincompat.la common/libcommonstr.la
@@ -389,18 +413,21 @@ all/server: all-libs-local/common
389413
all/tools/nut-scanner: all-libs-local/include all-libs-local/common \
390414
all-libs-local/drivers all-libs-local/clients \
391415
all-libs-local/tools/nut-scanner
392-
+@$(SUBDIR_TGT_RULE)
416+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
417+
$(SUBDIR_TGT_RULE)
393418

394419
# only libnutscan is needed for nutconf,
395420
# but we do wholesale subdir all-libs-local at the moment...
396421
### Requires-ext: common/libcommon.la common/libnutconf.la
397422
### Requires-ext: common/libcommonversion.la
398423
### Requires-ext: tools/nut-scanner/libnutscan.la
399424
all/tools/nutconf: all-libs-local/tools/nut-scanner all-libs-local/common
400-
+@$(SUBDIR_TGT_RULE)
425+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
426+
$(SUBDIR_TGT_RULE)
401427

402428
all-recursive/tools: all/tools/nutconf all/tools/nut-scanner
403-
+@$(SUBDIR_TGT_RULE)
429+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
430+
$(SUBDIR_TGT_RULE)
404431

405432
# Prereqs for NIT are runnable upsd, upsc, upsmon, dummy-ups, sample configs...
406433
# For the actual "make check-NIT" runs - also python scripts and/or compiled
@@ -410,32 +437,38 @@ all-recursive/tools: all/tools/nutconf all/tools/nut-scanner
410437
# But then we should also consider what is enabled by configure and what is not.
411438
# Maybe we are doing a quick build not to be tested at all? :-/
412439
all/tests/NIT: all/clients all/server all-drivers all-recursive/tools all-recursive/data
413-
+@$(SUBDIR_TGT_RULE)
440+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
441+
$(SUBDIR_TGT_RULE)
414442

415443
### LIB-Requires-ext: #COMMENTED-AWAY# common/libcommon.la
416444
### Requires-ext: common/libcommon.la common/libnutconf.la
417445
### Requires-ext: clients/libnutclient.la clients/libnutclientstub.la
418446
### Requires-ext: drivers/libdummy_mockdrv.la
419447
### Requires-int: libdriverstubusb.la
420448
all/tests: all-libs-local/tests all-libs-local/drivers all-libs-local/common all-libs-local/clients
421-
+@$(SUBDIR_TGT_RULE)
449+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
450+
$(SUBDIR_TGT_RULE)
422451

423452
all-recursive/tests: all/tests/NIT all/tests
424-
+@$(SUBDIR_TGT_RULE)
453+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
454+
$(SUBDIR_TGT_RULE)
425455

426456
if HAVE_MINGW_RESGEN
427457
if HAVE_WINDOWS
428458
### Requires-ext: common/libcommon.la
429459
### Requires-ext: common/libcommonversion.la
430460
all/scripts/Windows: all-libs-local/common
431-
+@$(SUBDIR_TGT_RULE)
461+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
462+
$(SUBDIR_TGT_RULE)
432463
else !HAVE_WINDOWS
433464
all/scripts/Windows:
434-
+@$(SUBDIR_TGT_RULE)
465+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
466+
$(SUBDIR_TGT_RULE)
435467
endif !HAVE_WINDOWS
436468
else !HAVE_MINGW_RESGEN
437469
all/scripts/Windows:
438-
+@$(SUBDIR_TGT_RULE)
470+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
471+
$(SUBDIR_TGT_RULE)
439472
endif !HAVE_MINGW_RESGEN
440473

441474
# May rely on dstate.o as well as common libs
@@ -448,10 +481,12 @@ if WITH_REGENERATE_DMF_NUTSCAN
448481
DMF_DEP_NUTSCAN += all-libs-local/tools/nut-scanner
449482
endif WITH_REGENERATE_DMF_NUTSCAN
450483
all/scripts/DMF: all-libs-local/drivers all-libs-local/common $(DMF_DEP_NUTSCAN)
451-
+@$(SUBDIR_TGT_RULE)
484+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
485+
$(SUBDIR_TGT_RULE)
452486

453487
all-recursive/scripts: all/scripts/Windows all/scripts/DMF
454-
+@$(SUBDIR_TGT_RULE)
488+
+@NUT_VERSION_H_GENERATED=true; export NUT_VERSION_H_GENERATED; \
489+
$(SUBDIR_TGT_RULE)
455490

456491
# ----------------------------------------------------------------------
457492
# flags to pass to ./configure when calling "make distcheck" and "make
@@ -1588,6 +1623,7 @@ install-win-bundle-thirdparty:
15881623
if test -n "$$ARCH" ; then export ARCH ; fi ; \
15891624
DESTDIR='$(DESTDIR)' ; export DESTDIR ; \
15901625
( cd '$(DESTDIR)' || exit ; \
1626+
GREP=$(GREP)' EGREP='$(EGREP)' \
15911627
DESTDIR="" '$(abs_top_srcdir)/scripts/Windows/dllldd.sh' dllldddir . \
15921628
| while read D ; do \
15931629
echo " DLL->bin $$D" 2>&1 ; \
@@ -1596,6 +1632,7 @@ install-win-bundle-thirdparty:
15961632
) || exit ; \
15971633
( if test x"$(bindir)" = x"$(sbindir)" ; then exit 0 ; fi ; \
15981634
cd '$(DESTDIR)/$(sbindir)' || exit ; \
1635+
GREP=$(GREP)' EGREP='$(EGREP)' \
15991636
'$(abs_top_srcdir)/scripts/Windows/dllldd.sh' dllldddir . \
16001637
| while read D ; do \
16011638
echo " DLL->sbin $$D" 2>&1 ; \
@@ -1605,6 +1642,7 @@ install-win-bundle-thirdparty:
16051642
( if test x"$(driverexecdir)" = x"$(bindir)" ; then exit 0 ; fi ; \
16061643
if test x"$(driverexecdir)" = x"$(sbindir)" ; then exit 0 ; fi ; \
16071644
cd '$(DESTDIR)/$(driverexecdir)' || exit ; \
1645+
GREP=$(GREP)' EGREP='$(EGREP)' \
16081646
'$(abs_top_srcdir)/scripts/Windows/dllldd.sh' dllldddir . \
16091647
| while read D ; do \
16101648
echo " DLL->drv $$D" 2>&1 ; \
@@ -1616,6 +1654,7 @@ install-win-bundle-thirdparty:
16161654
if test x"$(cgiexecdir)" = x"$(sbindir)" ; then exit 0 ; fi ; \
16171655
if test x"$(driverexecdir)" = x"$(cgiexecdir)" ; then exit 0 ; fi ; \
16181656
cd '$(DESTDIR)/$(cgiexecdir)' || exit ; \
1657+
GREP=$(GREP)' EGREP='$(EGREP)' \
16191658
'$(abs_top_srcdir)/scripts/Windows/dllldd.sh' dllldddir . \
16201659
| while read D ; do \
16211660
echo " DLL->cgi $$D" 2>&1 ; \
@@ -1627,6 +1666,7 @@ install-win-bundle-thirdparty:
16271666
if test x"$(libexecdir)" = x"$(driverexecdir)" ; then exit 0 ; fi ; \
16281667
if test x"$(libexecdir)" = x"$(cgiexecdir)" ; then exit 0 ; fi ; \
16291668
cd '$(DESTDIR)/$(libexecdir)' || exit ; \
1669+
GREP=$(GREP)' EGREP='$(EGREP)' \
16301670
'$(abs_top_srcdir)/scripts/Windows/dllldd.sh' dllldddir . \
16311671
| while read D ; do \
16321672
echo " DLL->libexec $$D" 2>&1 ; \

NEWS.adoc

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,15 @@ https://github.com/networkupstools/nut/milestone/12
5555
stable name as a default implementation). Drivers united by `main.c`
5656
framework introduced a `upsdrv_tweak_prognames()` hook method to let
5757
them manipulate the array of `prognames[]` aliases. [PR #3101]
58+
* USB drivers could truncate strings received from devices as a fallout
59+
of PR #2604 merged in NUT v2.8.3; this should now be fixed. [PR #3211,
60+
issue #3201]
5861
* `libusb0` and `libusb1` integrations now try both "Resource Descriptor
5962
Length" values they could identify on some devices: sometimes the first
6063
(or otherwise preferred) option may be not the correct one, so try the
6164
other too. [issue #3136]
65+
* Improved high-verbosity debug tracing of NUT `libhid` and `usbhid-ups`
66+
to help make sense of data processing issues (HID paths, strings). [#3201]
6267
* For state tree methods, introduced `difftime_st_tree_timespec()` to
6368
abstract platform-dependent definitions of `st_tree_timespec_t`. [PR #3156]
6469
* Introduced global variables for last changed timestamp and value of
@@ -75,6 +80,9 @@ https://github.com/networkupstools/nut/milestone/12
7580
systemd watchdog situation once, will not spam more about it" even if
7681
those "logged" messages were at an invisible verbosity level. [issue #3157,
7782
PR #3151]
83+
* Revised detection of (relative) paths to program and configuration files
84+
near the currently running program in NUT for Windows builds. [issues #3207,
85+
#3063, #3065, #3219]
7886

7987
- `asem`, `bestfortress`, `bestuferrups`, `bicker_ser`, `everups`, `metasys`,
8088
`masterguard`, `mge-utalk`, `oneac`, `phoenixcontact_modbus`, `pijuice`,
@@ -87,6 +95,9 @@ https://github.com/networkupstools/nut/milestone/12
8795
* Abandoned use of obsolete `gethostbyname()` in favour of `getaddrinfo()`.
8896
Extended to be IPv6-capable along the way. [#1209]
8997

98+
- Introduced a new NUT driver named `meanwell_ntu` which provides support for
99+
the Mean Well NTU series hybrid inverter and UPS units. [PR #3206]
100+
90101
- `nhs_ser` driver updates:
91102
* Driver source code includes a table to map baud rates (defined by the OS
92103
as C macros) to numbers and strings more useful to the driver program.
@@ -292,6 +303,10 @@ several `FSD` notifications into one executed action. [PR #3097]
292303
provided 'confargs' etc.) [#3140]
293304
* Added configure script options for 'libregex' tuning, just so it is on par
294305
with our other optional dependencies. [#3140]
306+
* Changed `--enable-extapi-enphase` to not default to `auto` and then get
307+
installed on every system capable of using it; this is a niche capability
308+
for users of specific devices via a cloud portal. [follow-up to PR #2813
309+
for issue #2807]
295310

296311
- Fixed CI recipes for PyPI publication of PyNUT(Client) module to also
297312
include the source distribution (was posted for NUT v2.8.1 and v2.8.2
@@ -352,6 +367,20 @@ several `FSD` notifications into one executed action. [PR #3097]
352367
syntax is not supported everywhere (or the `!` operator generally).
353368
[#3099, #1660]
354369

370+
- Revised `tools/gitlog2version.sh` helper script (logic added into
371+
a new `tools/semver-compare.sh`) with a mode to expand NUT SEMVER
372+
components into wide zero-padded numbers, so it is easier to
373+
alphanumerically compare different releases regardless of version
374+
component lengths in digits (and differences in their amounts). You can
375+
request an inverse operation with `NUT_VERSION_STRIP_LEADING_ZEROES=true`.
376+
Added tests to cover different shell interpreter platforms (piggy-back
377+
on the `tests/nut-driver-enumerator-test.sh` script), and made sure
378+
that outputs of legacy-mode processing (with `NUT_VERSION_DEFAULT`
379+
string provided by caller or saved in a tarball) are consistent with
380+
git-mode. The new `tools/semver-compare.sh` helper can be used directly
381+
to expand and strip version strings, sort and compare multiple versions
382+
as one simple operation. [issue #3055, PRs #3213, #3217]
383+
355384
- The NUT Integration Testing suite (NIT) script, if started as `root`,
356385
can now consult its run-time situation vs. `BUILTIN_RUN_AS_USER` and
357386
`BUILTIN_RUN_AS_GROUP` environment variables, and if those accounts

0 commit comments

Comments
 (0)