[pacman-dev] [PATCHv3 7/7] pacsearch: factored -Ss and -Qs parts into one single function

Pierre Neidhardt ambrevar at gmail.com
Sun Feb 9 13:41:45 EST 2014


Signed-off-by: Pierre Neidhardt <ambrevar at gmail.com>
---
 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



More information about the pacman-dev mailing list