git: b3a970fc9202 - main - Revert "pkgbasify: Add new utility"

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Mon, 29 Jun 2026 15:54:14 UTC
The branch main has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=b3a970fc9202cc7c9e80e1bcb83d7d860a3475c5

commit b3a970fc9202cc7c9e80e1bcb83d7d860a3475c5
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2026-06-29 15:53:52 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2026-06-29 15:53:52 +0000

    Revert "pkgbasify: Add new utility"
    
    This reverts commit e6467516f584505ac29fd370966abd530a7b5454.
---
 usr.sbin/Makefile               |   1 -
 usr.sbin/pkgbasify/Makefile     |   6 -
 usr.sbin/pkgbasify/pkgbasify.8  | 215 ---------------
 usr.sbin/pkgbasify/pkgbasify.sh | 596 ----------------------------------------
 4 files changed, 818 deletions(-)

diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile
index 2b478b26d3d8..9e885d5d45c5 100644
--- a/usr.sbin/Makefile
+++ b/usr.sbin/Makefile
@@ -57,7 +57,6 @@ SUBDIR=	adduser \
 	nologin \
 	pciconf \
 	periodic \
-	pkgbasify \
 	pnfsdscopymr \
 	pnfsdsfile \
 	pnfsdskill \
diff --git a/usr.sbin/pkgbasify/Makefile b/usr.sbin/pkgbasify/Makefile
deleted file mode 100644
index cbd8637b78c3..000000000000
--- a/usr.sbin/pkgbasify/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-SCRIPTS=pkgbasify.sh
-LINKS=	${BINDIR}/pkgbasify ${BINDIR}/depkgbasify
-MAN=	pkgbasify.8
-MLINKS=	pkgbasify.8 depkgbasify.8
-
-.include <bsd.prog.mk>
diff --git a/usr.sbin/pkgbasify/pkgbasify.8 b/usr.sbin/pkgbasify/pkgbasify.8
deleted file mode 100644
index 9c44740e4132..000000000000
--- a/usr.sbin/pkgbasify/pkgbasify.8
+++ /dev/null
@@ -1,215 +0,0 @@
-.\"-
-.\" Copyright (c) 2026 Dag-Erling Smørgrav
-.\"
-.\" SPDX-License-Identifier: BSD-2-Clause
-.\"
-.Dd June 28, 2026
-.Dt PKGBASIFY 8
-.Os
-.Sh NAME
-.Nm pkgbasify ,
-.Nm depkgbasify
-.Nd convert a system to and from pkgbase
-.Sh SYNOPSIS
-.Nm pkgbasify
-.Op Fl hnqtv
-.Op Fl a | Fl y
-.Op Fl b Ar basedir
-.Op Fl j Ar jail
-.Op Fl r Ar repo
-.Nm depkgbasify
-.Op Fl hnqv
-.Op Fl a | Fl y
-.Op Fl b Ar basedir
-.Op Fl j Ar jail
-.Sh DESCRIPTION
-The
-.Nm pkgbasify
-utility converts a system installed from distribution sets to packaged
-base by registering, without actually installing, a set of packages
-that corresponds to what is already installed.
-See
-.Sx Converting to Packaged Base
-below.
-.Pp
-The
-.Nm depkgbasify
-utility converts a packaged base system back to distribution sets by
-unregistering all base packages.
-See
-.Sx Converting from Packaged Base
-below.
-.Pp
-In both cases, the user is urged to take a backup or snapshot of the
-system and perform a dry run before the actual conversion.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl a
-Automatic mode.
-Do not prompt the user, but skip certain optional steps.
-Mutually exclusive with
-.Fl y .
-.It Fl b Ar basedir
-Operate on a system mounted at
-.Ar basedir .
-.It Fl h
-Print a usage message and exit.
-.It Fl j Ar jail
-Operate on the specified jail.
-.It Fl n
-Dry run.
-Examine the system and download the necessary files but do not
-register or unregister anything.
-.It Fl q
-Quiet mode.
-.It Fl r Ar repo
-.Po
-.Nm pkgbasify
-only
-.Pc
-Use the specified packaged base repository instead of the default.
-.It Fl t
-.Po
-.Nm pkgbasify
-only
-.Pc
-Trim.
-Not yet implemented.
-.It Fl v
-Verbose mode.
-.It Fl y
-Assume the answer to every prompt is
-.Dq yes .
-Mutually exclusive with
-.Fl a .
-.El
-.Ss Converting to Packaged Base
-The
-.Nm pkgbasify
-utility begins by inspecting the system to identify which distribution
-sets are installed.
-It then downloads and registers the sets of base packages that
-correspond to those distribution sets.
-If not running in automatic mode, it then performs a forced upgrade
-and enables the
-.Dv BACKUP_LIBRARIES
-options in the
-.Xr pkg 8
-configuration.
-.Pp
-It is important to note that after the conversion, files that should
-have been present on the system but weren't will still be recorded in
-the package database.
-This is why a non-automatic
-.Nm pkgbasify
-offers to perform a forced upgrade: to reset the system to a state
-where the files on disk match the recorded inventory.
-However, since
-.Nm pkgbasify
-does not make a backup of the system before converting it, this forced
-upgrade is irreversible, which is also why it is skipped in automatic
-mode.
-.Ss Converting from Packaged Base
-The
-.Nm depkgbasify
-utility begins by identifying the repository from which the base
-system was installed.
-It then attempts to identify which package sets are partially or
-completely installed.
-If not running in automatic mode, it will then offer to complete any
-partially installed sets, remove the source tree (if installed from
-packages), and perform a last upgrade before the conversion.
-Finally, it unregisters all remaining base packages without removing
-any of the files.
-.Ss Round-trip Conversion
-When run in automatic mode, neither
-.Nm pkgbasify
-nor
-.Nm depkgbasify
-will make any changes to the system that the other cannot undo.
-Thus, starting with a system installed from distribution sets and
-running
-.Ql pkgbasify -a
-followed by
-.Ql depkgbasify -a
-should have a net effect of no changes to the system except for the
-package cache.
-Conversely, starting with a freshly updated packaged base system and
-running
-.Ql depkgbasify -a
-followed by
-.Ql pkgbasify -a
-should also have a net zero effect.
-.Sh ENVIRONMENT
-.Bl -tag -width indent
-.It Ev BASEDIR
-base directory as if passed to the
-.Fl b
-option.
-.It Ev BASEREPO
-repository as if passed to the
-.Fl r
-option.
-.It Ev JAIL
-jail id or name as if passed to the
-.Fl j
-option.
-.El
-.Sh EXIT STATUS
-.Ex -std pkgbasify depkgbasify
-.Sh SEE ALSO
-.Xr build 7 ,
-.Xr pkg 7 ,
-.Xr pkgbase 7 ,
-.Xr freebsd-update 8 ,
-.Xr pkg 8
-.Sh HISTORY
-The
-.Nm pkgbasify
-and
-.Nm depkgbasify
-utilities first appeared in
-.Fx 15.2 .
-.Sh AUTHORS
-The
-.Nm pkgbasify
-and
-.Nm depkgbasify
-utilities and this manual page were written by
-.An Dag-Erling Sm\(/orgrav Aq Mt des@FreeBSD.org .
-.Sh CAVEATS
-The
-.Nm pkgbasify
-utility is intended for use on systems installed from distribution
-sets.
-It will also work on systems installed from source, but if the system
-has been customized through the use of build options, the conversion
-will round it back up, so to speak, to the smallest set of
-distribution sets which include everything present on the system.
-Conversely,
-.Nm pkgbasify
-will not notice or register elements of the system which are disabled
-by default but have been locally enabled, built and installed, unless
-installing from a repository that has been built with the same build
-options.
-.Pp
-When converting a system installed from source to packaged base, the
-recommended procedure is to build a set of packages from the same
-source tree and using the same build options, then configure a
-repository pointing to those packages, and perform the conversion
-using that repository before switching to another and doing a forced
-upgrade.
-.Pp
-The
-.Nm depkgbasify
-utility merely unregisters the base packages.
-It does not revert the binaries to a state that could have been
-produced by an official installation image or
-.Xr freebsd-update 8 .
-However, if the system was using base packages from the official
-.Fx
-packaged base repository prior to the conversion, the contents should
-match what
-.Xr freebsd-update 8
-expects.
diff --git a/usr.sbin/pkgbasify/pkgbasify.sh b/usr.sbin/pkgbasify/pkgbasify.sh
deleted file mode 100755
index 86f926bfcd83..000000000000
--- a/usr.sbin/pkgbasify/pkgbasify.sh
+++ /dev/null
@@ -1,596 +0,0 @@
-#!/bin/sh
-#-
-# Copyright (c) 2026 Dag-Erling Smørgrav
-#
-# SPDX-License-Identifier: BSD-2-Clause
-#
-
-set -eu
-exec 3>&2
-
-progname="${0##*/}"
-localbase="$(/sbin/sysctl -qn user.localbase || echo /usr/local)"
-
-#
-# All the top-level sets except src
-#
-topsets="base base-dbg kernels kernels-dbg lib32 lib32-dbg tests"
-
-#
-# Default repository
-#
-OS=FreeBSD
-BASEREPO=${BASEREPO:-${OS}-base}
-
-#
-# Command-line options
-#
-auto=
-base=${BASEDIR:-}
-dryrun=
-jail=${JAIL:-}
-quiet=
-repo=
-trim=
-verbose=
-yes=
-
-#
-# Print a message
-#
-msg() {
-	local width=$((${COLUMNS:-80} - ${#progname} - 4))
-	echo "$@" | /usr/bin/fmt -sw${width} |
-	    /usr/bin/sed "s|^|${progname}: |"
-}
-
-#
-# Print an error message and exit
-#
-err() {
-	msg "$@" >&3
-	exit 1
-}
-
-#
-# Print a warning message
-#
-warn() {
-	if ! [ "${quiet}" ]; then
-		msg "$@" >&3
-	fi
-}
-
-#
-# Print an informational message
-#
-info() {
-	if ! [ "${quiet}" ]; then
-		msg "$@"
-	fi
-}
-
-#
-# Ask the user for confirmation
-#
-confirm() {
-	local ans=
-	if [ "${yes}" ]; then
-		return 0
-	fi
-	while :; do
-		read -p "$@ " -r ans
-		case ${ans} in
-		[Yy]|[Yy][Ee][Ss])
-			return 0
-			;;
-		[Nn]|[Nn][Oo])
-			return 1
-			;;
-		*)
-			echo "Please answer with yes or no." >&3
-			;;
-		esac
-	done
-}
-
-#
-# Execute a command, but print it first if verbose
-#
-v() {
-	if [ "${verbose}" ]; then
-		echo "$@" >&3
-	fi
-	"$@"
-}
-
-#
-# Compute the path of a file in the target environment
-#
-path() {
-	local path="${base}$1"
-	if [ -n "${jail}" ]; then
-		path="$(/usr/sbin/jls -j "${jail}" path)${path}"
-	fi
-	echo "${path}"
-}
-
-#
-# Check if a file exists in the target environment
-#
-exists() {
-	v test -e "$(path "$@")"
-}
-
-#
-# Run pkg(7)
-#
-# pkg(7) currently lacks support for -j and -r, otherwise we could run
-# every pkg command through it, which would prepare us for when pkg
-# eventually moves into base.  For now, we can use jexec for -j, but
-# there is no way to emulate -r.
-#
-pkg7() {
-	if [ -n "${base}" ]; then
-		err "pkg(7) currently lacks -r option"
-	elif [ -n "${jail}" ]; then
-		v /usr/sbin/jexec "${jail}" /usr/sbin/pkg "$@"
-	else
-		v /usr/sbin/pkg "$@"
-	fi
-}
-
-#
-# Run pkg(8)
-#
-pkg() {
-	v "${localbase}"/sbin/pkg ${jail:+-j"${jail}"} ${base:+-r"${base}"} "$@"
-}
-
-#
-# Run pkg bootstrap
-#
-pkg_bootstrap() {
-	if ! pkg7 -N 2>/dev/null; then
-		warn "Package manager not installed"
-		if confirm "Bootstrap the package manager?"; then
-			pkg7 bootstrap -r"${repo}" -y
-		else
-			err "Unable to proceed without package manager"
-		fi
-	fi
-}
-
-#
-# Check if a package exists in the repository
-#
-pkg_exists() {
-	pkg rquery -r"${repo}" -U %v "$@" >/dev/null
-}
-
-#
-# Run pkg fetch
-#
-pkg_fetch() {
-	pkg fetch -r"${repo}" -U ${quiet:+-q} "$@"
-}
-
-#
-# Run pkg install
-#
-pkg_install() {
-	pkg install -r"${repo}" -U ${dryrun:+-n} ${quiet:+-q} "$@"
-}
-
-#
-# Check if a package is installed
-#
-pkg_installed() {
-	pkg info -q "$@"
-}
-
-#
-# Run pkg query
-#
-pkg_query() {
-	pkg query "$@"
-}
-
-#
-# Run pkg install --register-only
-#
-pkg_register() {
-	pkg install -r"${repo}" --register-only ${dryrun:+-n} ${quiet:+-q} "$@"
-}
-
-#
-# Run pkg remove
-#
-pkg_remove() {
-	pkg remove ${dryrun:+-n} ${quiet:+-q} "$@"
-}
-
-#
-# Run pkg rquery
-#
-pkg_rquery() {
-	pkg rquery -r"${repo}" -U "$@"
-}
-
-#
-# Run pkg unregister
-#
-pkg_unregister() {
-	pkg unregister ${dryrun:+-n} ${quiet:+-q} "$@"
-}
-
-#
-# Run pkg update
-#
-pkg_update() {
-	pkg update -r"${repo}" ${quiet:+-q} "$@"
-}
-
-#
-# Run pkg upgrade
-#
-pkg_upgrade() {
-	pkg upgrade -r"${repo}" ${dryrun:+-n} ${quiet:+-q} "$@"
-}
-
-#
-# Generate a complete transitive list of dependencies
-#
-pkg_alldeps() {
-	local deps=$(pkg rquery %dn "$@")
-	if [ "${deps}" ]; then
-		echo "${deps}"
-		pkg_alldeps ${deps}
-	fi | sort -u
-}
-
-#
-# Check if pkg is new enough
-#
-check_pkg() {
-	local ver=$(pkg -v)
-	case ${ver} in
-	1.*|2.[0-6].*|2.7.[0-4])
-		err "pkg ${ver} is too old, I need pkg 2.7.5 or newer"
-		;;
-	esac
-}
-
-#
-# Try to ascertain if the system is running pkgbase
-#
-ispkgbase() {
-	pkg which -q /sbin/init >/dev/null
-}
-
-#
-# Convert to pkgbase
-#
-pkgbasify() {
-	local sets=base set=
-
-	# Check if we're running pkgbase
-	if ispkgbase; then
-		err "The system is already running packaged base"
-	fi
-
-	# Update the repository
-	pkg_update
-
-	# Some paths
-	local debug=/usr/lib/debug
-	local ld=/libexec/ld-elf.so.1
-	local ld32=/libexec/ld-elf32.so.1
-	local test=/usr/tests/Kyuafile
-	local src=/usr/src
-
-	# Sanity check
-	if ! exists "${ld}"; then
-		err "No base system found"
-	fi
-
-	# Decide whether to register base-dbg
-	if ! exists "${debug}${ld}.debug"; then
-		warn "No debugging symbols found"
-	else
-		sets="${sets} base-dbg"
-	fi
-
-	# Decide whether to register lib32 and lib32-dbg
-	if ! pkg_exists ${OS}-set-lib32; then
-		# Not available
-	elif ! exists "${ld32}"; then
-		warn "No 32-bit loader found"
-	else
-		sets="${sets} lib32"
-		if exists "${debug}${ld32}.debug"; then
-			sets="${sets} lib32-dbg"
-		fi
-	fi
-
-	# Decide whether to register tests
-	if ! exists "${test}"; then
-		warn "No test suite found"
-	else
-		sets="${sets} tests"
-	fi
-
-	# Decide whether to register kernels and kernels-dbg
-	local kernel=/boot/kernel/kernel
-	if [ -z "${jail}${base}" ]; then
-		if ! kernel=$(/sbin/sysctl -qn kern.bootfile); then
-			err "Unable to identify the running kernel"
-		fi
-		case ${kernel%/kernel} in
-		*.old)
-			kernel=${kernel%.old/kernel}/kernel
-			;;
-		esac
-		case ${kernel} in
-		/boot/kernel/kernel)
-			;;
-		*)
-			kernel=
-			;;
-		esac
-	fi
-	if [ -z "${kernel}" ] || ! exists "${kernel}"; then
-		warn "Non-standard kernel, or no kernel installed"
-		kernel=
-	else
-		sets="${sets} kernels"
-		if exists "${debug}${kernel}.debug"; then
-			sets="${sets} kernels-dbg"
-		fi
-	fi
-
-	# Decide whether to register src
-	if ! exists "${src}/Makefile.inc1"; then
-		warn "No source tree found"
-	elif exists "${src}/.git"; then
-		warn "Source tree managed by Git "
-	else
-		sets="${sets} src"
-	fi
-
-	# We now have our list of sets
-	sets=$(for set in ${sets}; do echo ${OS}-set-$set; done)
-
-	if ! [ "${quiet}" ] || ! [ "${yes}" ]; then
-		echo "The following package sets will be installed:"
-		echo
-		pkg_rquery "%n %c" ${sets} | \
-		    /usr/bin/sed 's/ (metapackage)//' |
-		    /usr/bin/column -tl2 |
-		    /usr/bin/sed 's/^/    /'
-		echo
-	fi
-
-	# Final checkpoint
-	if ! [ "${auto}" ] && ! confirm "Proceed with conversion?"; then
-		err "Conversion abandoned"
-	fi
-
-	# Download the packages first
-	warn "Downloading packages, this may take a while..."
-	pkg_fetch -d -y ${sets}
-
-	# Now register them
-	pkg_register -y ${sets}
-
-	# Force-upgrade
-	if ! [ "${auto}" ] && confirm "Reinstall base packages?"; then
-		pkg_upgrade -f -y
-	fi
-
-	# Check if BACKUP_LIBRARIES is turned on
-	case $(pkg config BACKUP_LIBRARIES) in
-	no)
-		warn "The recommended BACKUP_LIBRARIES option is not enabled"
-		if ! [ "${auto}" ] &&
-		    confirm "Enable BACKUP_LIBRARIES option?"; then
-			if ! [ "${dryrun}" ]; then
-				v /usr/bin/sed -i.bak \
-				    -e $'1i\\\nBACKUP_LIBRARIES = true;' \
-				    $(path ${localbase}/etc/pkg.conf)
-			fi
-			info "BACKUP_LIBRARIES option enabled"
-		fi
-		;;
-	esac
-
-	# Done!
-	if ! [ "${dryrun}" ]; then
-		info "Conversion complete"
-	fi
-}
-
-#
-# Convert from pkgbase
-#
-depkgbasify() {
-	local havesrc= pkg= set=
-
-	# Check if we're running pkgbase
-	if ! ispkgbase; then
-		err "The system is not running packaged base"
-	fi
-
-	# Identify and update the repository
-	repo=$(pkg_query %R ${OS}-runtime)
-	info "Using repository ${repo}"
-	pkg_update
-
-	# Check which sets are partially or completely installed
-	info "Examining the system..."
-	for set in ${topsets}; do
-		if pkg_installed ${OS}-set-${set}; then
-			info "The ${set} set is installed"
-			continue
-		elif ! pkg_exists %v ${OS}-set-${set}; then
-			# set does not exist
-			continue
-		fi
-		local want=$(pkg_alldeps ${OS}-set-${set} | grep -v ${OS}-set)
-		local have=$(pkg_query %n ${want} || true)
-		if [ "${have}" = "${want}" ]; then
-			info "The ${set} set is complete"
-		elif [ "${have}" ]; then
-			info "The ${set} set is partially installed"
-			if ! [ "${auto}" ] &&
-			    confirm "Complete the ${set} set?"; then
-				pkg_fetch -d -y ${OS}-set-${set}
-				pkg_install -y ${OS}-set-${set}
-			fi
-		else
-			info "The ${set} set is absent"
-		fi
-	done
-
-	# Check if the source tree is installed
-	for pkg in set-src src-sys src; do
-		if pkg_installed ${OS}-${pkg}; then
-			havesrc="${havesrc} ${OS}-${pkg}"
-		fi
-	done
-	if [ "${havesrc}" ]; then
-		info "The source tree appears to be installed.  You may want" \
-		     "to uninstall it before converting to make room for a" \
-		     "Git clone."
-		if ! [ "${auto}" ] && confirm "Uninstall the source tree?"; then
-			pkg_remove -fy ${havesrc}
-		fi
-	fi
-
-	# One final upgrade?
-	if ! [ "${auto}" ] && confirm "Upgrade installed base packages?"; then
-		pkg_upgrade -y
-	fi
-
-	# Final checkpoint
-	if ! [ "${auto}" ] && ! confirm "Proceed with conversion?"; then
-		err "Conversion abandoned"
-	fi
-
-	# Unregister all base packages
-	pkg_unregister -f -y $(pkg_query -e '%o ~ base/*' '%n')
-
-	# Done!
-	if ! [ "${dryrun}" ]; then
-		info "Conversion complete"
-	fi
-}
-
-#
-# Print usage message and exit
-#
-usage() {
-	exec >&3
-	echo -n "usage: ${progname} "
-	case ${progname%.sh} in
-	pkgbasify)
-		echo "[-hnqtv] [-a | -y] [-b basedir] [-j jail] [-r repo]"
-		;;
-	depkgbasify)
-		echo "[-hnqv] [-a | -y] [-b basedir] [-j jail]"
-		;;
-	*)
-		echo "-h"
-		;;
-	esac
-	exit 1
-}
-
-#
-# Entry point
-#
-main() {
-	local opt
-
-	# Check program name and set defaults
-	case ${progname%.sh} in
-	pkgbasify)
-		repo=${BASEREPO}
-		;;
-	depkgbasify)
-		;;
-	*)
-		usage
-		;;
-	esac
-
-	# Parse options
-	while getopts "ab:hj:nr:qtvy" opt; do
-		case ${opt} in
-		a)
-			auto=true
-			;;
-		b)
-			base="${OPTARG}"
-			;;
-		h)
-			usage
-			;;
-		j)
-			jail="${OPTARG}"
-			;;
-		n)
-			dryrun=true
-			;;
-		r)
-			repo="${OPTARG}"
-			;;
-		q)
-			quiet=true
-			;;
-		t)
-			trim=true
-			;;
-		v)
-			verbose=true
-			;;
-		y)
-			yes=true
-			;;
-		*)
-			usage
-			;;
-		esac
-	done
-	shift $((OPTIND - 1))
-
-	# Check for conflicting options
-	if [ "${auto}" ] && [ "${yes}" ]; then
-		usage
-	fi
-	case ${progname%.sh} in
-	depkgbasify)
-		if [ "${repo}" ] || [ "${trim}" ]; then
-			usage
-		fi
-		;;
-	esac
-
-	# Bootstrap pkg if necessary
-	pkg_bootstrap
-
-	# Check the pkg version
-	check_pkg
-
-	# Do what we were asked to do
-	case ${progname%.sh} in
-	pkgbasify)
-		pkgbasify "$@"
-		;;
-	depkgbasify)
-		depkgbasify "$@"
-		;;
-	esac
-}
-
-main "$@"