[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