Signed-off-by: Pierre Neidhardt <[email protected]>
---
 contrib/pacsearch.in | 65 +++++++++++++++++++++++-----------------------------
 1 file changed, 29 insertions(+), 36 deletions(-)

diff --git a/contrib/pacsearch.in b/contrib/pacsearch.in
index 0dad366..bcfedf0 100644
--- a/contrib/pacsearch.in
+++ b/contrib/pacsearch.in
@@ -98,44 +98,37 @@ sub print_pkg {
 my %allpkgs = ();
 my @pkglist = ();
 
-open (my $syncout, '-|', 'pacman', '-Ss', @ARGV) or exit;
-while ( readline($syncout) ) {
-       # We grab the following fields: repo, name, ver, group, installed, and
-       # desc. We grab leading space for 'group' and 'installed' so that we do 
not
-       # need to test if non-empty when printing.
-       my @pkgfields = /^(.*?)\/(.*?) (.*?)( \(.*?\))?( \[.*\])?$/s;
-       my $desc = readline($syncout);
-       # skip any non-matching line
-       next if not defined $pkgfields[1];
-       # since 'group' and 'installed' are optional, we should fill it in if 
necessary
-       $pkgfields[3] = "" if not defined $pkgfields[3];
-       $pkgfields[4] = "" if not defined $pkgfields[4];
-       $pkgfields[5] = $desc;
-       # Add each sync pkg by name/ver to a hash table.
-       # Any value is good since we only check for existence.
-       $allpkgs{$pkgfields[1] . $pkgfields[2]} = 1;
-       push (@pkglist, \@pkgfields);
-}
-close ($syncout);
-
-open (my $queryout, '-|', 'pacman', '-Qs', @ARGV) or exit;
-while ( readline($queryout) ) {
-       # We grab the same field as before, even the "installed" which is always
-       # empty for local searches. This allows us to reserve a cell in 
@pkgfields.
-       my @pkgfields = /^(.*?)\/(.*?) (.*?)( \(.*?\))?( \[.*\])?$/s;
-       my $desc = readline($queryout);
-       # skip any non-matching line
-       next if not defined $pkgfields[1];
-       # check if the package was listed in the sync out
-       if (not exists $allpkgs{$pkgfields[1] . $pkgfields[2]}) {
-               # since 'group' is optional, we should fill it in if necessary
-               $pkgfields[3] = "" if not defined $pkgfields[3];
-               $pkgfields[4] = " [$LC_INSTALLED]";
-               $pkgfields[5] = $desc;
-               push (@pkglist, \@pkgfields);
+sub list_pkg {
+       my $db = shift;
+       my $installstr = shift;
+       open (my $out, '-|', 'pacman', $db , @ARGV) or exit;
+       while ( readline($out) ) {
+               # We grab the following fields: repo, name, ver, group, 
installed, and
+               # desc. We grab leading space for 'group' and 'installed' so 
that we do
+               # not need to test if non-empty when printing.
+               my @pkgfields = /^(.*?)\/(.*?) (.*?)( \(.*?\))?( \[.*\])?$/s;
+               my $desc = readline($out);
+               # skip any non-matching line
+               next if not defined $pkgfields[1];
+               my $pkgid = $pkgfields[1] . $pkgfields[2];
+               # if -Qs, check if the package was listed during list_pkg -Ss
+               if ( $db eq "-Ss" || not exists $allpkgs{$pkgid}) {
+                       # since 'group' and 'installed' are optional, we should 
fill it in
+                       # if necessary
+                       $pkgfields[3] = "" if not defined $pkgfields[3];
+                       $pkgfields[4] = $installstr if not defined 
$pkgfields[4];
+                       $pkgfields[5] = $desc;
+                       # Add each sync pkg by name/ver to a hash table.
+                       # Any value is good since we only check for existence.
+                       $allpkgs{$pkgid} = 1;
+                       push (@pkglist, \@pkgfields);
+               }
        }
+       close ($out);
 }
-close ($queryout);
+
+list_pkg ('-Ss', "");
+list_pkg ('-Qs', " [$LC_INSTALLED]");
 
 foreach (@pkglist) {
        print_pkg (@{$_});
-- 
1.8.5.4


Reply via email to