Skip to content

Instantly share code, notes, and snippets.

@sthen
Created February 8, 2012 22:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sthen/1774426 to your computer and use it in GitHub Desktop.
Save sthen/1774426 to your computer and use it in GitHub Desktop.
#!/bin/sh
# ^^^^^^^ the sign of a high-quality 5-minute hack job :)
# visual editor to run pkg_delete or mark packages as auto/manual installed
# released to the public domain.
log() {
echo "$*" >> /tmp/vipkg.log
echo "$*"
}
TMP=$(mktemp -d /tmp/vipkg.XXXXXXXX) || exit 1
log "starting at $(date)"
pkg_info > $TMP/pkg.prev.all
pkg_info -m > $TMP/pkg.prev.man
diff -U 99999 $TMP/pkg.prev.all $TMP/pkg.prev.man |
sed -e 1,3d -e 's,^ ,+,' -e 's,^-, ,' >> $TMP/pkg.prev.merged
cat - $TMP/pkg.prev.merged > $TMP/pkg.edit <<- 'EOF'
# Remove the line for any packages you want to uninstall.
# Packages marked with + in column 1 were marked as being installed manually;
# changing this marker changes the annotation in /var/db/pkg.
#
# Fragile! Do nothing other than touching column 1 or removing the entire line.
EOF
edit="/usr/bin/vi"
[ -n "$EDITOR" ] && edit="$EDITOR"
[ -n "$VISUAL" ] && edit="$VISUAL"
$edit $TMP/pkg.edit
grep -v ^# $TMP/pkg.edit > $TMP/pkg.post.merged
diff -u0 $TMP/pkg.prev.merged $TMP/pkg.post.merged |
sed -n -e 1,3d -e 's,^\+,,p' | while read x; do
case $x in
+*) p=$(echo $x | sed s,^+,, | cut -d' ' -f1)
log "marking as manual install: $p"
PKG_PATH= sudo pkg_add $p > /dev/null ;;
*) p=$(echo $x | cut -d' ' -f1)
log "marking as auto install: $p"
PKG_PATH= sudo pkg_add -aa $p > /dev/null ;;
esac
done
sed 's,^.,,' < $TMP/pkg.post.merged | cut -d' ' -f1 > $TMP/pkg.new
cut -d' ' -f1 < $TMP/pkg.prev.all > $TMP/pkg.old
diff -u0 $TMP/pkg.old $TMP/pkg.new |
sed -e 1,3d -e s,^-,, |
grep -v ^@@ > $TMP/pkg.delete &&
sudo pkg_delete $(cat $TMP/pkg.delete)
log "ending at $(date)"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment