Posted to tcl by dbohdan at Sun Nov 08 14:16:37 GMT 2020view pretty
#! /usr/bin/env tclsh
#
# A database of Ubuntu packages I use.
# $ apt install $(./packages [tag ...])
# Requires: Tcl 8.6 or later.
#
# Copyright (c) 2020 D. Bohdan.
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
set packages {
apache2-utils benchmark network
asciidoc converter markup
audacious audio player
audacity audio editor
autoconf dev
autogen dev
automake dev
bat text viewer
bless GUI editor hex
borgbackup backup
bsdgames game rot13 toy
build-essential C dev
calibre ebook reader
cloc dev
cmake C dev
cmark converter markup
cpulimit hardware
critcl Tcl
curl client network
dos2unix converter text
dosbox emulator
doublecmd-qt file-manager
entr automation
ethtool network hardware
exiftool image metadata
expect Tcl
fdupes duplicate
feh image viewer
ffmpeg converter multitool video
findimagedupes duplicate
flac audio codec
fonts-open-sans font
fortune-mod toy
gdb debugging dev
geeqie image viewer
genisoimage filesystem ISO
gifsicle image optimizer
gimp editor image
git dev
gnupg2 cryptography
gparted disk
graphicsmagick automation converter editor image multitool
gsmartcontrol disk
gxkb GUI keyboard
hardinfo GUI hardware system-info
hddtemp hardware monitoring
htop monitoring
hwinfo hardware system-info
icewm window-manager
id3 audio editor metadata
id3v2 audio editor metadata
imagemagick automation converter editor image multitool
iotop disk monitoring
jq interpreter JSON
keepassx GUI password
lftp client FTP
libaugeas-dev dev
liblz4-tool compression
lm-sensors monitoring
lrzip compression
lxd container
lz4 compression
lzop compression
magic-wormhole network
mc file-manager
meld comparison GUI text
mercurial dev
minify converter CSS
mosh network remote
mpv player video
neovim editor text
netcat multitool network
netpbm automation converter editor image multitool
nfs-common NFS
nmap network security
optipng image optimizer
opus-tools audio codec
pcmanfm-qt file-manager GUI
pep8 dev Python
pkg-config dev
pngcrush image optimizer
pngquant image optimizer
postfix email server
postgresql database
pv monitoring
pwgen password
pylint dev Python
python3-dev dev Python
python3-more-itertools dev Python
python3-pip dev Python
python3-psutil dev Python
python3-pytest dev Python
python3-venv dev Python
python3-wheel dev Python
qdirstat system-info
qterminal terminal-emulator
rar compression
rclone multitool network
redis-server database
remmina GUI remote
remmina-plugin-vnc GUI remote VNC
rename file
rlwrap TUI
scrot GUI image screenshot
sed interpreter text
shellcheck dev
slugify converter text
smartmontools disk hardware system-info
smbclient client network
sqlite3 database
squashfs-tools filesystem
tcl dev Tcl
tcl-dev dev Tcl
tcl-doc dev Tcl
tcl-itcl4 dev Tcl
tcl-thread dev Tcl
tcl-tls dev Tcl
tcl-vfs dev Tcl
tcl8.6-tdbc-postgres dev Tcl
tcl8.6-tdbc-sqlite3 dev Tcl
tclcurl dev Tcl
tcllib dev Tcl
tcllib-critcl dev Tcl
tclx8.4 dev Tcl
tclx8.4-doc dev Tcl
tdom dev Tcl
tesseract-ocr converter image OCR text
testdisk disk hardware
thunderbird client email
tidy converter HTML optimizer
tk dev Tcl
tk-doc dev Tcl
tk-table dev Tcl
tklib dev Tcl
transmission network Torrent
tree file
ttf-mscorefonts-installer font
udiskie disk GUI
unicode-screensaver screensaver
uptimed monitoring
upx-ucl compression dev
valgrind debugging dev
vim editor text
webp codec image metadata
whois network
wine emulation
workrave ergonomics GUI
xclip GUI
xdotool automation GUI
xkbset GUI keyboard
xml2 converter XML
xscreensaver screensaver
xscreensaver-data-extra screensaver
xscreensaver-screensaver-bsod screensaver
xsensors GUI hardware monitoring
yacc dev
zfsutils-linux disk filesystem
zpaq backup compression
zstd compression
zzuf debugging dev
}
proc main {packages argv} {
if {$argv in {-h -help --help -? /?}} {
set me [file tail [info script]]
puts stderr "usage: $me"
puts stderr " $me \"tags\""
puts stderr " $me tag \[tag ...\]"
exit 0
}
lassign [parse-pkg-list $packages] all byTag
puts [switch -- $argv {
{} { lindex $all }
tags { lsort -nocase [dict keys $byTag] }
default { pkgs-with-tags $byTag $argv }
}]
}
proc parse-pkg-list packages {
set lines [split [string trim $packages] \n]
foreach line $lines {
set pkg [lindex $line 0]
foreach tag [lrange $line 1 end] {
dict lappend byTag [string tolower $tag] $pkg
}
lappend all $pkg
}
list $all $byTag
}
proc pkgs-with-tags {byTag tags} {
set found [pkgs-with-tag $byTag [lindex $tags 0]]
foreach tag [lrange $tags 1 end] {
set found [intersection $found [pkgs-with-tag $byTag $tag]]
}
return $found
}
proc pkgs-with-tag {byTag tag} {
set tag [string tolower $tag]
if {![dict exists $byTag $tag]} {
return {}
}
dict get $byTag $tag
}
proc intersection {a b} {
set inters {}
foreach x $a {
if {$x in $b} {
lappend inters $x
}
}
return $inters
}
main $packages $argv