postinstall vs. obsolete libs

Valery Ushakov <[email protected]>
Newsgroups gmane.os.netbsd.devel.userlevel
Message-ID <[email protected]>
Martin's bin/58697 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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.