Re: Script to set/unset "automatic" status in PKGNG database
--Apple-Mail=_FDEE990F-D701-45B0-9123-3D66BB606832
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
charset=us-ascii
On Aug 30, 2012, at 3:28 PM, Baptiste Daroussin <bapt@freebsd.org> =
wrote:
> 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.
>>=20
>> 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.
>=20
> 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?
No problem. Attached is the output of "git diff origin" after dropping =
my script in to my local tree. Let me know if you need something else.
Changes between this and the version I originally posted:
Added 2-clause license and disclaimer
Replaced SQL with 'pkg set' commands. Since I didn't come up =
with a fast way to list the packages not in the 'automatic' list, I =
first set all packages to 0 (not automatic), then set the ones in the =
list to 1. This is likely slower than the SQL variant was, but it's not =
bad and not something likely to be run frequently.
JN
--Apple-Mail=_FDEE990F-D701-45B0-9123-3D66BB606832
Content-Disposition: attachment;
filename=set_pkg_auto.sh.diff
Content-Type: application/octet-stream;
name="set_pkg_auto.sh.diff"
Content-Transfer-Encoding: 7bit
diff --git a/scripts/set_pkg_auto.sh b/scripts/set_pkg_auto.sh
new file mode 100755
index 0000000..6342e7a
--- /dev/null
+++ b/scripts/set_pkg_auto.sh
@@ -0,0 +1,116 @@
+#!/bin/sh
+
+# Copyright (c) 2012 John Nielsen <john@jnielsen.net>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer
+# in this position and unchanged.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# 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
+# via 'pkg set ...'. I wrote it to make "pkg autoremove" useful following
+# a pkg2ng migration, but other uses are conceivable.
+
+# 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"
+
+# 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' ${1}`
+ # First unset all
+ pkg set -ay -A 0
+ # Then set selected
+ pkg set -y -A 1 ${autopkgs}
+}
+
+# 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."
--Apple-Mail=_FDEE990F-D701-45B0-9123-3D66BB606832
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
charset=us-ascii
--Apple-Mail=_FDEE990F-D701-45B0-9123-3D66BB606832
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org"
--Apple-Mail=_FDEE990F-D701-45B0-9123-3D66BB606832--
討論串 (同標題文章)
完整討論串 (本文為第 9 之 10 篇):