Date: Thu, 30 Aug 2012 23:28:33 +0200 From: Baptiste Daroussin <bapt@FreeBSD.org> To: John Nielsen <lists@jnielsen.net> Cc: "ports@freebsd.org" <ports@FreeBSD.org>, "current@freebsd.org" <current@FreeBSD.org> Subject: Re: Script to set/unset "automatic" status in PKGNG database Message-ID: <20120830212833.GN64447@ithaqua.etoilebsd.net> In-Reply-To: <CFA2273E-4498-4A64-BC9F-CE5AA560409D@jnielsen.net> References: <CFA2273E-4498-4A64-BC9F-CE5AA560409D@jnielsen.net>
next in thread | previous in thread | raw e-mail | index | archive | help
--N/GrjenRD+RJfyz+ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 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 y= our 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 do= es 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" port= s can be removed. Unfortunately, the pkg2ng utility has no way of knowing w= hich old-style packages it converts were installed automatically as depende= ncies, 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 reall= y like this functionality, I decided to update my local package database to= match my preferences. >=20 > Having succeeded, I decided a tool to make doing so easy could well benef= it others (as well as my future self). (Plus I wanted an excuse to play wit= h dialog(1) and "pkg query" a bit.) So here's the result. I'm not too attac= hed 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 we= lcome. >=20 >=20 > JN > #!/bin/sh >=20 > # Copyright (c) 2012 John Nielsen <john@jnielsen.net> >=20 > # 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. >=20 > # The PKGNG database file to use > DB=3D/var/db/pkg/local.sqlite >=20 > # Terminal geometry > sz=3D`stty size` > rows=3D`echo ${sz} | cut -d ' ' -f 1` > cols=3D`echo ${sz} | cut -d ' ' -f 2` > drows=3D$(( ${rows} - 3 )) > dcols=3D$(( ${cols} - 6 )) >=20 > # Dialog results are stored here > tmpfile=3D`mktemp -t set_pkg_auto` >=20 > # We always want the same style checklist > export DIALOGOPTS=3D"--extra-button --extra-label \"Select All\" --cancel= -label \"Deselect All\" --help-button --help-label Exit --separator ," >=20 > # Exit with an error message > die() { > rm -f ${tmpfile} > echo "${1}" > exit 1 > } >=20 > # Don't leave tmpfile behind even if we are killed/interrupted > trap "die \"Interrupt received.\"" 2 15 >=20 > # Run dialog to present the checklist and save the results in tmpfile > run_dialog() { > dialog --checklist "Select packages to consider for auto-removal" ${drow= s} ${dcols} ${drows} $* 2>${tmpfile} > return $? > } >=20 > # 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 $? > } >=20 > # Select all packages in the checklist > select_all() { > run_dialog `pkg query '%n %o' | sed -e 's/$/ on/g'` > return $? > } >=20 > # De-select all packages in the checklist > select_none() { > run_dialog `pkg query '%n %o' | sed -e 's/$/ off/g'` > return $? > } >=20 > # Update the package database to match selections in the specified file > do_update() { > autopkgs=3D`sed -e "s/^,//g" -e "s/\"/'/g" ${1}` > sqlite3 ${DB} "update packages set automatic=3D1 where name in (${autopk= gs});" \ > || die "SQlite error." > sqlite3 ${DB} "update packages set automatic=3D0 where name not in (${au= topkgs});" \ > || die "SQlite error." > } >=20 > # Run select_current for the first checklist > pkgset=3Dcurrent >=20 > # 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=3Dall > ;; > 1) # Cancel (Deselect all), show the checklist again > pkgset=3Dnone > ;; > *) # 4-Help (Exit) or ESC or error, exit. > die "No changes made." > ;; > esac > done >=20 > # If we got this far then tmpfile has a list of 'automatic' packages > do_update ${tmpfile} >=20 > # Clean up > rm -f ${tmpfile} > echo "Updated successfully." >=20 >=20 > _______________________________________________ > freebsd-ports@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-ports > To unsubscribe, send any mail to "freebsd-ports-unsubscribe@freebsd.org" --N/GrjenRD+RJfyz+ Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (FreeBSD) iEYEARECAAYFAlA/2wEACgkQ8kTtMUmk6ExDPwCfUmDtmvex/QO/hW82E+bIIqc0 nN4An0gA9W9fRW7yq0B33WU+OPEAj3oH =a0Ur -----END PGP SIGNATURE----- --N/GrjenRD+RJfyz+--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120830212833.GN64447>