diff options
Diffstat (limited to 'contrib/pacsearch.in')
-rwxr-xr-x | contrib/pacsearch.in | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/contrib/pacsearch.in b/contrib/pacsearch.in new file mode 100755 index 00000000..dd848a73 --- /dev/null +++ b/contrib/pacsearch.in @@ -0,0 +1,136 @@ +#!/usr/bin/perl +# pacsearch - Adds color and install information to a 'pacman -Ss' search +# +# Copyright (C) 2008-2011 Dan McGee <dan@archlinux.org> +# +# Based off original shell script version: +# Copyright (C) 2006-2007 Dan McGee <dan@archlinux.org> +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +#TODO: colors flag on commandline + +use strict; +use warnings; + +my $progname = "pacsearch"; +my $version = "2.0"; + +if ($#ARGV lt 0 || $ARGV[0] eq "--help" || $ARGV[0] eq "-h") { + print "$progname - Add color and install information to a pacman -Ss search\n"; + print "Usage: $progname <pattern>\n"; + print "Example: $progname ^gnome\n"; + if ($#ARGV lt 0) { + exit 1; + } + exit 0; +} + +if ($ARGV[0] eq "--version" || $ARGV[0] eq "-v") { + print "$progname version $version\n"; + print "Copyright (C) 2006-2011 Dan McGee\n"; + exit 0; +} + +# define our colors to use when printing +my $CLR1 = "\e[0;34m"; +my $CLR2 = "\e[0;32m"; +my $CLR3 = "\e[0;35m"; +my $CLR4 = "\e[0;36m"; +my $CLR5 = "\e[0;31m"; +my $CLR6 = "\e[0;33m"; +my $CLR7 = "\e[1;36m"; +my $INST = "\e[1;31m"; +my $BASE = "\e[0m"; + +# color a "repo/pkgname pkgver" line based on the repository name +sub to_color { + my $line = shift; + # get the installed text colored first + $line =~ s/(\[.*\]$)/$INST$1$BASE/; + # and now the repo and dealings + $line =~ s/(^core\/.*)/$CLR1$1$BASE/; + $line =~ s/(^extra\/.*)/$CLR2$1$BASE/; + $line =~ s/(^community\/.*)/$CLR3$1$BASE/; + $line =~ s/(^testing\/.*)/$CLR4$1$BASE/; + $line =~ s/(^community-testing\/.*)/$CLR5$1$BASE/; + $line =~ s/(^multilib\/.*)/$CLR6$1$BASE/; + $line =~ s/(^local\/.*)/$CLR7$1$BASE/; + # any other unknown repository + $line =~ s/(^[\w-]*\/.*)/$CLR6$1$BASE/; + return $line; +} + +my %allpkgs = (); + +my $syncout = `pacman -Ss '@ARGV'`; +# split each sync search entry into its own array entry +my @syncpkgs = split(/\n^(?=\w)/m, $syncout); +# remove the extra \n from the last desc entry +if ($#syncpkgs >= 0) { + chomp($syncpkgs[$#syncpkgs]); +} + +# counter var for packages, used here and in the query loop too +my $cnt = 0; +foreach $_ (@syncpkgs) { + # we grab 4 fields here: repo, name/ver, installed, and desc + my @pkgfields = /^(.*?)\/(.*?) ?(\[.*\])?\n(.*)$/s; + if(not @pkgfields) { + # skip any non-matching line and just print it for the user + print $_, "\n"; + next; + } + # since installed is optional, we should fill it in if necessary + $pkgfields[2] = "" if not defined $pkgfields[2]; + # add a fifth field that indicates original order + push (@pkgfields, $cnt++); + # add each sync pkg by name/ver to a hash table for quick lookup + $allpkgs{$pkgfields[1]} = [ @pkgfields ]; +} + +my $queryout = `pacman -Qs '@ARGV'`; +# split each querysearch entry into its own array entry +my @querypkgs = split(/\n^(?=\w)/m, $queryout); +# remove the extra \n from the last desc entry +if ($#querypkgs >= 0) { + chomp ($querypkgs[$#querypkgs]); +} + +foreach $_ (@querypkgs) { + # we grab 4 fields here: repo, name/ver, installed, and desc + my @pkgfields = /^(.*?)\/(.*?) ?(\[.*\])?\n(.*)$/s; + # since installed is optional, we should fill it in if necessary + $pkgfields[2] = "" if not defined $pkgfields[2]; + # check if the package was listed in the sync out + if (not exists $allpkgs{$pkgfields[1]}) { + $pkgfields[2] = "[installed]"; + # add a fifth field that indicates original order (after sync) + push (@pkgfields, $cnt++); + # add our local-only package to the hash + $allpkgs{$pkgfields[1]} = [ @pkgfields ]; + } +} + +# sort by original order (the fifth field) and print +foreach $_ ( sort{ @{$allpkgs{$a}}[4] <=> @{$allpkgs{$b}}[4] } keys %allpkgs) { + my @v = @{$allpkgs{$_}}; + my $line = "$v[0]/$v[1] $v[2]"; + $line = to_color($line); + # print colorized "repo/pkgname pkgver" string with possible installed text + print "$line\n"; + print "$v[3]\n"; +} + +#vim: set noet: |