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