#!/usr/bin/env perl # # vim: set ts=4:noet # # sbofind # script to locate something in a local SlackBuilds tree. # # authors: Jacob Pipkin # Luke Williams # license: WTFPL use 5.16.0; use strict; use warnings FATAL => 'all'; use SBO::Lib; use File::Basename; use Getopt::Long qw(:config bundling); my $self = basename ($0); sub show_usage () { print < \$help, 'version|v' => \$vers, 'info|i' => \$show_info, 'readme|r' => \$show_readme, 'queue|q' => \$show_queue, ); show_usage and exit 0 if $help; show_version and exit 0 if $vers; show_usage and exit 1 unless exists $ARGV[0]; my $search = $ARGV[0]; # if we can't find SLACKBUILDS.TXT in $config{HOME}, prompt to fetch the tree slackbuilds_or_fetch; # find anything with $search in its name sub perform_search ($) { exists $_[0] or script_error 'perform_search requires an argument.'; my $search = shift; my (@findings, $name, $found); my $name_regex = qr/NAME:\s+(.*\Q$search\E.*)$/i; my $loc_regex = qr/LOCATION:\s+(.*)$/; my $fh = open_read "$config{SBO_HOME}/SLACKBUILDS.TXT"; FIRST: while (my $line = <$fh>) { unless ($found) { $found++, next FIRST if $name = ($line =~ $name_regex)[0]; } else { if (my ($location) = ($line =~ $loc_regex)[0]) { $found = 0; $location =~ s#^\.##; push @findings, {$name => $config{SBO_HOME} . $location}; } } } return \@findings; } # pull the contents of a file into a variable and format it for output sub get_file_contents ($) { exists $_[0] or script_error 'get_file_contents requires an argument'; -f $_[0] or return "$_[0] doesn't exist.\n"; my $fh = open_read shift; my $contents = do {local $/; <$fh>}; for ($contents) { s/\n/\n /g; s/\n $//g; } return $contents; } # get build queue and return it as a single line. sub show_build_queue ($) { exists $_[0] or script_error 'show_build_queue requires an argument.'; my $queue = get_build_queue([shift], {}); return join(" ", @$queue); } my $findings = perform_search $search; # pretty formatting if (exists $$findings[0]) { my @listing = ("\n"); for my $hash (@$findings) { while (my ($key, $val) = each %$hash) { say "SBo: $key"; say "Path: $val"; say "info: ". get_file_contents "$val/$key.info" if $show_info; say "README: ". get_file_contents "$val/README" if $show_readme; say "Queue: ". show_build_queue "$key" if $show_queue; say ''; } } } else { say "Nothing found for search term: $search"; } exit 0;