NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: bin/58697: postinstall(8) removes non-obsolete compat libs



The following reply was made to PR bin/58697; it has been noted by GNATS.

From: Valery Ushakov <uwe%stderr.spb.ru@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc: 
Subject: Re: bin/58697: postinstall(8) removes non-obsolete compat libs
Date: Tue, 8 Oct 2024 13:47:14 +0300

 This made me look at postinstall again, which reminded me that
 _obsolete_libs has an awk script that is unnecessarily opaque (with
 variable names like "res", "result", "line", a function "digit" that
 actually returns a number, not necessarily single-digit, etc).  Since
 I had to dig into that awk script anyway, I thought it might be a good
 time to fix it, so that I don't need to re-do that work of untabgling
 it the next time.
 
 While there, I noticed that Christos attempt to protect new old libs
 when downgrading never really worked b/c it filters by filename, but
 the awk script emits absolute pathnames.
 
 Here's the patch, only very lightly tested.  It's a context diff, b/c
 the unfied version is not very readable.
 
 Feedback is welcome.
 
 
 *** postinstall.in.~1.63.~	2024-04-27 02:31:54.577307347 +0300
 --- postinstall.in	2024-09-27 00:19:43.813013871 +0300
 ***************
 *** 608,664 ****
   
   	(
   
 ! 	if [ ! -e "${DEST_DIR}/${dir}" ]
 ! 	then
 ! 		return 0
 ! 	fi
 ! 
   	cd "${DEST_DIR}/${dir}" || err 2 "can't cd to ${DEST_DIR}/${dir}"
 ! 	echo lib*.so.* \
 ! 	| tr ' ' '\n' \
 ! 	| ${AWK} -v LibDir="${dir}/" '
   #{
   
 ! function digit(v, c, n) { return (n <= c) ? v[n] : 0 }
   
 ! function checklib(results, line, regex) {
 ! 	if (! match(line, regex))
   		return
 ! 	lib = substr(line, RSTART, RLENGTH)
 ! 	rev = substr($0, RLENGTH+1)
 ! 	if (! (lib in results)) {
 ! 		results[lib] = rev
   		return
   	}
 ! 	orevc = split(results[lib], orev, ".")
 ! 	nrevc = split(rev, nrev, ".")
 ! 	maxc = (orevc > nrevc) ? orevc : nrevc
 ! 	for (i = 1; i <= maxc; i++) {
 ! 		res = digit(orev, orevc, i) - digit(nrev, nrevc, i)
 ! 		if (res < 0) {
 ! 			print LibDir lib results[lib]
 ! 			results[lib] = rev
   			return
 ! 		} else if (res > 0) {
 ! 			print LibDir lib rev
   			return
   		}
   	}
   }
   
 ! /^lib.*\.so\.[0-9]+\.[0-9]+(\.[0-9]+)?(\.debug)?$/ {
 ! 	if (AllLibs)
 ! 		checklib(minor, $0, "^lib.*\\.so\\.")
 ! 	else
 ! 		checklib(found, $0, "^lib.*\\.so\\.[0-9]+\\.")
 ! }
 ! 
 ! /^lib.*\.so\.[0-9]+$/ {
 ! 	if (AllLibs)
 ! 		checklib(major, $0, "^lib.*\\.so\\.")
 ! }
 ! 
 ! #}' | exclude_libs
   
   	)
   }
 --- 608,693 ----
   
   	(
   
 ! 	[ -e "${DEST_DIR}/${dir}" ] || return 0
   	cd "${DEST_DIR}/${dir}" || err 2 "can't cd to ${DEST_DIR}/${dir}"
 ! 
 ! 	# TODO: make this selectable with a command line option?
 ! 	local maybe_purge_major
 ! 	#maybe_purge_major='-v PurgeOldMajor=1'
 ! 
 ! 	printf '%s\n' lib*.so.* | ${AWK} ${maybe_purge_major} '
   #{
   
 ! BEGIN {
 ! 	BASE_REGEX  = "^lib.*\\.so\\."
 ! 	MAJOR_REGEX = (BASE_REGEX "[0-9]+\\.")
 ! 
 ! 	# in the usual case different major versions of the same
 ! 	# library are considered different stems and do not compete
 ! 	# with each other, we keep one of each, but you may request to
 ! 	# purge old majors, in which case all versions compete for the
 ! 	# single basename stem
 ! 	if (PurgeOldMajor)
 ! 		keepone = BASE_REGEX
 ! 	else
 ! 		keepone = MAJOR_REGEX
 ! }
 ! 
 ! # major version symlink
 ! PurgeOldMajor && /^lib.*\.so\.[0-9]+$/ {
 ! 	checklib(major, $0, BASE_REGEX)
 ! }
 ! 
 ! # specific minor version of a library
 ! /^lib.*\.so\.[0-9]+\.[0-9]+(\.[0-9]+)?(\.debug)?$/ {
 ! 	checklib(minor, $0, keepone)
 ! }
   
 ! function checklib(latest, libname, stem_regex) {
 ! 	if (! match(libname, stem_regex))
   		return
 ! 	stem = substr(libname, RSTART, RLENGTH)
 ! 	vers = substr(libname, RLENGTH + 1)
 ! 
 ! 	# first time we see this stem? just record the version
 ! 	if (! (stem in latest)) {
 ! 		latest[stem] = vers
   		return
   	}
 ! 
 ! 	# split version suffixes into the list of numeric components
 ! 	oversc = split(latest[stem], overs, ".")
 ! 	nversc = split(vers,         nvers, ".")
 ! 	maxc = (oversc > nversc) ? oversc : nversc
 ! 
 ! 	# is the new version "later" than the one we have seen?
 ! 	for (i = 1; i <= maxc; ++i) {
 ! 		cmp = (overs[i]+0) - (nvers[i]+0)
 ! 
 ! 		if (cmp < 0) {
 ! 			# the one we have seen is older, so report it
 ! 			# as obsolete and update the latest seen
 ! 			# version to this new one
 ! 			print stem latest[stem]
 ! 			latest[stem] = vers
   			return
 ! 		}
 ! 		else if (cmp > 0) {
 ! 			# the one we have just read is older than the
 ! 			# one we have seen previously, so report this
 ! 			# "new" one as obsolete
 ! 			print libname
   			return
   		}
   	}
   }
   
 ! 	# the ouput if further filtered by exclude_libs that protects
 ! 	# libraries that have symlinks pointing to them, which one
 ! 	# encounters when downgrading
 ! #}'	\
 ! 	| exclude_libs \
 ! 	| ${SED} "s|^|${dir}/|"
   
   	)
   }
 
 -uwe
 


Home | Main Index | Thread Index | Old Index