#!/usr/bin/perl # # vim: set ts=4:noet # # sbofind # script to locate something in a local SlackBuilds tree. # # authors: Jacob Pipkin # Luke Williams # Andreas Guldstrand # license: WTFPL use 5.16.0; use strict; use warnings FATAL => 'all'; use SBO::Lib qw/ slackbuilds_or_fetch script_error open_read get_build_queue %config $slackbuilds_txt $repo_path show_version /; 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, $exit) = open_read $slackbuilds_txt; if ($exit) { warn $fh; exit $exit; } my %local; 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#^\.##; if ($config{LOCAL_OVERRIDES} ne 'FALSE' and -d "$config{LOCAL_OVERRIDES}/$name") { push @findings, {name => $name, location => "$config{LOCAL_OVERRIDES}/$name", local => 1 }; $local{$name} = 1; } else { push @findings, {name => $name, location => $repo_path . $location}; } } } } if ($config{LOCAL_OVERRIDES} ne 'FALSE') { opendir(my $dh, $config{LOCAL_OVERRIDES}); while (my $dir = readdir($dh)) { next if $local{$dir}; if ($dir =~ /\Q$search\E/) { push @findings, {name => $dir, location => "$config{LOCAL_OVERRIDES}/$dir", local => 1 }; } } closedir $dh; } 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, $exit) = open_read(shift); if ($exit) { warn $fh; return(); } 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(" ", reverse @$queue); } my $findings = perform_search($search); # pretty formatting if (exists $$findings[0]) { for my $hash (@$findings) { my $name = $hash->{name}; my $location = $hash->{location}; my $sbo = "SBo: "; $sbo = "Local: " if $hash->{local}; say "$sbo $name"; say "Path: $location"; say "info: ". get_file_contents("$location/$name.info") if $show_info; say "README: ". get_file_contents("$location/README") if $show_readme; say "Queue: ". show_build_queue($name) if $show_queue; say ''; } } else { say "Nothing found for search term: $search"; } exit 0;