[pacman-dev] [PATCHv3 6/7] pacsearch: pattern arguments work as for pacman
Andrew Gregory
andrew.gregory.8 at gmail.com
Mon Feb 10 11:09:25 EST 2014
On 02/09/14 at 07:41pm, Pierre Neidhardt wrote:
> Previously only one pattern was allowed.
>
> $ pacsearch foo bar
> Search for packages containing 'foo bar'.
>
> $ pacman -Ss foo bar
> Search for packages containing both 'foo' and 'bar'.
>
> Note that removing the quotes from the call was not enough since
> $ pacsearch 'foo|bar'
> would then fail.
>
> Signed-off-by: Pierre Neidhardt <ambrevar at gmail.com>
> ---
> contrib/pacsearch.in | 34 +++++++++++++---------------------
> 1 file changed, 13 insertions(+), 21 deletions(-)
>
> diff --git a/contrib/pacsearch.in b/contrib/pacsearch.in
> index df0d62d..0dad366 100644
> --- a/contrib/pacsearch.in
> +++ b/contrib/pacsearch.in
> @@ -92,48 +92,38 @@ sub print_pkg {
> print "$MAGENTA";
> }
> print "$v[0]/$RESET$BOLD$v[1] $GREEN$v[2]$BLUE$v[3]$CYAN$v[4]$RESET\n";
> - print "$v[5]\n";
> + print "$v[5]";
> }
>
> my %allpkgs = ();
> my @pkglist = ();
>
> -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]);
> -}
> -
> -foreach $_ (@syncpkgs) {
> +open (my $syncout, '-|', 'pacman', '-Ss', @ARGV) or exit;
If we can't run pacman we need to print an error message and exit
non-zero.
> +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 = /^(.*?)\/(.*?) (.*?)( \(.*?\))?( \[.*\])?\n(.*)$/s;
> + my @pkgfields = /^(.*?)\/(.*?) (.*?)( \(.*?\))?( \[.*\])?$/s;
> + my $desc = readline($syncout);
This still needs to be moved after the match check. If we can't parse
the previous line we have no way of knowing that the next one is
actually a description.
> # 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);
>
> -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) {
> +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 = /^(.*?)\/(.*?) (.*?)( \(.*?\))?( \[.*\])?\n(.*)$/s;
> + 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
> @@ -141,9 +131,11 @@ foreach $_ (@querypkgs) {
> # 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);
> }
> }
> +close ($queryout);
>
> foreach (@pkglist) {
> print_pkg (@{$_});
> --
> 1.8.5.4
>
>
--
apg
More information about the pacman-dev
mailing list