[pacman-contrib] [PATCH] Migrate pacsearch

Johannes Löthberg johannes at kyriasis.com
Wed Oct 12 09:21:37 UTC 2016


Signed-off-by: Johannes Löthberg <johannes at kyriasis.com>
---
 src/Makefile.am     |  23 ++++++----
 src/pacsearch.pl.in | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 140 insertions(+), 8 deletions(-)
 create mode 100644 src/pacsearch.pl.in

diff --git a/src/Makefile.am b/src/Makefile.am
index 6c08885..1849d7a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -26,9 +26,12 @@ BASHSCRIPTS = \
 	rankmirrors \
 	updpkgsums
 
+PERLSCRIPTS = \
+	pacsearch
+
 OURSCRIPTS = \
 	$(BASHSCRIPTS) \
-	$(OTHERSCRIPTS)
+	$(PERLSCRIPTS)
 
 EXTRA_DIST = \
 	checkupdates.sh.in \
@@ -38,7 +41,9 @@ EXTRA_DIST = \
 	paclog-pkglist.sh.in \
 	pacscripts.sh.in \
 	rankmirrors.sh.in \
-	updpkgsums.sh.in
+	updpkgsums.sh.in \
+	\
+	pacsearch.pl.in
 
 # Files that should be removed, but which Automake does not know.
 MOSTLYCLEANFILES = $(OURSCRIPTS) *.tmp
@@ -58,18 +63,18 @@ edit = sed \
 	-e 's|@SCRIPTNAME[@]|$@|g' \
 	-e '1s|!/bin/bash|!$(BASH_SHELL)|g'
 
-$(OTHERSCRIPTS): Makefile
-	$(AM_V_at)$(RM) $@ $@.tmp
-	$(AM_V_GEN)$(edit) $(srcdir)/$@.in >$@.tmp
-	$(AM_V_at)chmod +x,a-w $@.tmp
-	$(AM_V_at)mv $@.tmp $@
-
 $(BASHSCRIPTS): Makefile
 	$(AM_V_at)$(RM) $@
 	$(AM_V_GEN)test -f $(srcdir)/$@.sh.in && m4 -P -I $(srcdir) $(srcdir)/$@.sh.in | $(edit) >$@
 	$(AM_V_at)chmod +x,a-w $@
 	@$(BASH_SHELL) -O extglob -n $@
 
+$(PERLSCRIPTS): Makefile
+	$(AM_V_at)$(RM) $@ $@.tmp
+	$(AM_V_GEN)$(edit) $(srcdir)/$@.pl.in >$@.tmp
+	$(AM_V_at)chmod +x,a-w $@.tmp
+	$(AM_V_at)mv $@.tmp $@
+
 $(OURFILES): Makefile
 	$(AM_V_at)$(RM) $@ $@.tmp
 	$(AM_V_GEN)$(edit) $(srcdir)/$@.in >$@.tmp
@@ -87,4 +92,6 @@ pacscripts: $(srcdir)/pacscripts.sh.in
 rankmirrors: $(srcdir)/rankmirrors.sh.in
 updpkgsums: $(srcdir)/updpkgsums.sh.in
 
+pacsearch: $(srcdir)/pacsearch.pl.in
+
 # vim:set noet:
diff --git a/src/pacsearch.pl.in b/src/pacsearch.pl.in
new file mode 100644
index 0000000..a89328d
--- /dev/null
+++ b/src/pacsearch.pl.in
@@ -0,0 +1,125 @@
+#!/usr/bin/perl
+# pacsearch - Perform a pacman search using both the local and the sync databases
+#
+# Copyright (C) 2008-2014 Dan McGee <dan at archlinux.org>
+#
+# Based off original shell script version:
+# Copyright (C) 2006-2007 Dan McGee <dan at 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/>.
+
+use strict;
+use warnings;
+use Term::ANSIColor;
+
+my $myname = 'pacsearch';
+my $myver = '@PACKAGE_VERSION@';
+
+sub usage {
+	print "$myname (pacman) v$myver\n\n";
+	print "Perform a pacman search using both the local and the sync databases.\n\n";
+	print "Usage: $myname [-n] <pattern>\n\n";
+	print "Options:\n";
+	print "	 -n, --nocolor: turn off coloring\n\n";
+	print "Example: $myname ^gnome\n";
+}
+
+sub version {
+	printf "%s %s\n", $myname, $myver;
+	print "Copyright (C) 2008-2014 Dan McGee <dan\@archlinux.org>\n\n";
+	print "Based off original shell script version:\n";
+	print "Copyright (C) 2006-2007 Dan McGee <dan\@archlinux.org>\n";
+}
+
+if ($#ARGV lt 0 || $ARGV[0] eq "--help" || $ARGV[0] eq "-h") {
+	usage;
+	if ($#ARGV lt 0) {
+		exit 1;
+	}
+	exit 0;
+}
+
+if ($ARGV[0] eq "--version" || $ARGV[0] eq "-V") {
+	version;
+	exit 0;
+}
+
+# define formatting variables
+my($BLUE, $CYAN, $GREEN, $MAGENTA, $RED, $YELLOW, $BOLD, $RESET);
+if ($ARGV[0] eq "--nocolor" || $ARGV[0] eq "-n") {
+	shift;
+	$BLUE = "";
+	$CYAN = "";
+	$GREEN = "";
+	$MAGENTA = "";
+	$RED = "";
+	$YELLOW = "";
+	$BOLD = "";
+	$RESET = "";
+} else {
+	$BLUE = color('blue');
+	$CYAN = color('cyan');
+	$GREEN = color('green');
+	$MAGENTA = color('magenta');
+	$RED = color('red');
+	$YELLOW = color('yellow');
+	$BOLD = color('bold');
+	$RESET = color('reset');
+}
+
+# localization
+my $LC_INSTALLED = `gettext pacman installed`;
+
+# Print a "repo/pkgname pkgver (groups) [installed]" line.
+# We stick to pacman colors.
+sub print_pkg {
+	my @v = @_;
+	print "$RESET$BOLD";
+	if ( "$v[0]" eq "local" ) {
+		print "$RED";
+	} else {
+		print "$MAGENTA";
+	}
+	print "$v[0]/$RESET$BOLD$v[1] $GREEN$v[2]$BLUE$v[3]$CYAN$v[4]$RESET\n";
+	print "$v[5]";
+}
+
+sub list_pkg {
+	my $db = shift;
+	open (my $out, '-|', 'pacman', $db, '--', @ARGV) or exit 1;
+	my @pkglist = ();
+	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);
+		# 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;
+		push (@pkglist, \@pkgfields);
+	}
+	close ($out);
+	return @pkglist;
+}
+
+my @sync = list_pkg('-Ss', @ARGV);
+my %allpkgs = map {$_->[1] . $_->[2] => 1} @sync;
+my @query = grep { not $allpkgs{$_->[1] . $_->[2]}} list_pkg('-Qs', @ARGV);
+$_->[4] = " [$LC_INSTALLED]" foreach @query;
+print_pkg (@{$_}) foreach (@sync, @query);
+
+#vim: set noet:
-- 
2.10.0


More information about the pacman-contrib mailing list