summaryrefslogtreecommitdiffstats
path: root/contrib/pacsearch
blob: 3cf8b9250da1872e854c33cbb73562971829fa77 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/perl
# pacsearch - Adds color and install information to a 'pacman -Ss' search
#
# Copyright (C) 2008 Dan McGee <dpmcgee@gmail.com>
#
# Based off original shell script version:
# Copyright (C) 2006-2007 Dan McGee <dpmcgee@gmail.com>
#
# 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-2008 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";
my $INSTMARK = $INST."***";

# color a "repo/pkgname pkgver" line based on the respository name
sub to_color {
	my $line = shift;
	$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/(^unstable\/.*)/$CLR5$1$BASE/;
	$line =~ s/(^custom\/.*)/$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 3 fields here: repo, name/ver, and desc
	my @pkgfields = /^(.*?)\/(.*?)\n(.*)$/s;
	# add a fourth field that will indicate install status
	push (@pkgfields, "");
	# 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 3 fields here: repo, name/ver, and desc
	my @pkgfields = /^(.*?)\/(.*?)\n(.*)$/s;
	# check if the package was listed in the sync out
	# if it is we want to mark it with a *** marker
	if (exists $allpkgs{$pkgfields[1]}) {
		# mark it in our fourth field as installed
		@{ $allpkgs{$pkgfields[1]} }[3] = $INSTMARK;
	} else {
		# add a fourth field that will indicate install status
		push (@pkgfields, $INSTMARK);
		# 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]";
	$line = to_color($line);
	# print install marker + colorized "repo/pkgname pkgver" string
	print "$v[3]$line\n";
	print "$v[2]\n";
}

#vim: set noet: