Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 30 Aug 2012 16:55:21 -0600
From:      John Nielsen <lists@jnielsen.net>
To:        Baptiste Daroussin <bapt@freebsd.org>
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:  <93748C09-084C-4B3D-9BDE-B69EFEF14EEA@jnielsen.net>
In-Reply-To: <20120830224006.GP64447@ithaqua.etoilebsd.net>
References:  <CFA2273E-4498-4A64-BC9F-CE5AA560409D@jnielsen.net> <20120830212833.GN64447@ithaqua.etoilebsd.net> <BC3A517F-CA9F-42A3-A1F5-9ACA2D07A860@jnielsen.net> <20120830224006.GP64447@ithaqua.etoilebsd.net>

index | next in thread | previous in thread | raw e-mail

[-- Attachment #1 --]
On Aug 30, 2012, at 4:40 PM, Baptiste Daroussin <bapt@freebsd.org> wrote:

> Thanks you should be enough, can you provide a git format-patch patch so that
> you get your name in the logs :D

Here you go.


[-- Attachment #2 --]
From d8ac55e449a899431e0e99bce81337247d577ff2 Mon Sep 17 00:00:00 2001
From: John Nielsen <john@jnielsen.net>
Date: Thu, 30 Aug 2012 16:50:55 -0600
Subject: [PATCH] Add script to interactively set/un-set 'automatic' status of
 installed packages.

---
 scripts/set_pkg_auto.sh | 116 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 116 insertions(+)
 create mode 100755 scripts/set_pkg_auto.sh

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."
-- 
1.7.11.3


[-- Attachment #3 --]


help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?93748C09-084C-4B3D-9BDE-B69EFEF14EEA>