Re: Script to set/unset "automatic" status in PKGNG database

From: Baptiste Daroussin <bapt_at_FreeBSD.org>
Date: Thu, 30 Aug 2012 23:28:33 +0200
Thank you,

Would you mind adding create a patch against the git tree of pkgng so that we
can include your script into the scripts subdirectory, so that we provide your
script along with the next pkg 1.0.1 as a contributed script?

regards,
Bapt

On Thu, Aug 30, 2012 at 03:19:59PM -0600, John Nielsen wrote:
> I today noticed the "pkg autoremove" command for the first time, which does much the same thing as pkg_cutleaves but relies on the "automatic" flag in the pkgng database rather than user input to determine which "leaf" ports can be removed. Unfortunately, the pkg2ng utility has no way of knowing which old-style packages it converts were installed automatically as dependencies, so they are all marked as non-automatic (i.e. user-requested). In my case, this was not true for the majority of installed ports. Since I really like this functionality, I decided to update my local package database to match my preferences.
> 
> Having succeeded, I decided a tool to make doing so easy could well benefit others (as well as my future self). (Plus I wanted an excuse to play with dialog(1) and "pkg query" a bit.) So here's the result. I'm not too attached to the name. It shouldn't eat your package database or steal your lunch money, but I'm not responsible if it does. Other than that, feedback is welcome.
> 
> 
> JN

> #!/bin/sh
> 
> # Copyright (c) 2012 John Nielsen <john_at_jnielsen.net>
> 
> # This script presents a checklist of all PKGNG packages registered on
> # the system, showing for each whether or not it is marked as "automatic"
> # (i.e. not explicitly requested by the user). Any changes are recorded
> # in the PKGNG database. I wrote it to make "pkg autoremove" useful
> # following a pkg2ng migration, but other uses are conceivable.
> 
> # The PKGNG database file to use
> DB=/var/db/pkg/local.sqlite
> 
> # Terminal geometry
> sz=`stty size`
> rows=`echo ${sz} | cut -d ' ' -f 1`
> cols=`echo ${sz} | cut -d ' ' -f 2`
> drows=$(( ${rows} - 3 ))
> dcols=$(( ${cols} - 6 ))
> 
> # Dialog results are stored here
> tmpfile=`mktemp -t set_pkg_auto`
> 
> # We always want the same style checklist
> export DIALOGOPTS="--extra-button --extra-label \"Select All\" --cancel-label \"Deselect All\" --help-button --help-label Exit --separator ,"
> 
> # Exit with an error message
> die() {
> 	rm -f ${tmpfile}
> 	echo "${1}"
> 	exit 1
> }
> 
> # Don't leave tmpfile behind even if we are killed/interrupted
> trap "die \"Interrupt received.\"" 2 15
> 
> # Run dialog to present the checklist and save the results in tmpfile
> run_dialog() {
> 	dialog --checklist "Select packages to consider for auto-removal" ${drows} ${dcols} ${drows} $* 2>${tmpfile}
> 	return $?
> }
> 
> # Show the current status from the package database in the checklist
> select_current() {
> 	run_dialog `pkg query '%n %o %a' | sed -e 's/1$/on/g' -e 's/0$/off/g'`
> 	return $?
> }
> 
> # Select all packages in the checklist
> select_all() {
> 	run_dialog `pkg query '%n %o' | sed -e 's/$/ on/g'`
> 	return $?
> }
> 
> # De-select all packages in the checklist
> select_none() {
> 	run_dialog `pkg query '%n %o' | sed -e 's/$/ off/g'`
> 	return $?
> }
> 
> # Update the package database to match selections in the specified file
> do_update() {
> 	autopkgs=`sed -e "s/^,//g" -e "s/\"/'/g" ${1}`
> 	sqlite3 ${DB} "update packages set automatic=1 where name in (${autopkgs});" \
> 		|| die "SQlite error."
> 	sqlite3 ${DB} "update packages set automatic=0 where name not in (${autopkgs});" \
> 		|| die "SQlite error."
> }
> 
> # Run select_current for the first checklist
> pkgset=current
> 
> # Show the checklist until "OK" or "Exit" is selected
> while : ; do
> 	select_${pkgset}
> 	case $? in
> 		0) # OK, continue with updates
> 			break;
> 			;;
> 		3) # Extra (Select all), show the checklist again
> 			pkgset=all
> 			;;
> 		1) # Cancel (Deselect all), show the checklist again
> 			pkgset=none
> 			;;
> 		*) # 4-Help (Exit) or ESC or error, exit.
> 			die "No changes made."
> 			;;
> 	esac
> done
> 
> # If we got this far then tmpfile has a list of 'automatic' packages
> do_update ${tmpfile}
> 
> # Clean up
> rm -f ${tmpfile}
> echo "Updated successfully."

> 
> 

> _______________________________________________
> freebsd-ports_at_freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-ports
> To unsubscribe, send any mail to "freebsd-ports-unsubscribe_at_freebsd.org"


Received on Thu Aug 30 2012 - 19:28:36 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:30 UTC