diff options
Diffstat (limited to 'sbofind')
-rwxr-xr-x | sbofind | 179 |
1 files changed, 0 insertions, 179 deletions
diff --git a/sbofind b/sbofind deleted file mode 100755 index 8ea7934..0000000 --- a/sbofind +++ /dev/null @@ -1,179 +0,0 @@ -#!/usr/bin/perl -# -# vim: ts=4:noet -# -# sbofind -# script to locate something in a local SlackBuilds tree. -# -use 5.16.0; -use strict; -use warnings FATAL => 'all'; -use SBO::Lib qw/ slackbuilds_or_fetch slurp script_error open_read get_build_queue %config $slackbuilds_txt $repo_path show_version in indent get_from_info /; -use File::Basename; -use Getopt::Long qw(:config bundling); - -my $self = basename($0); - -sub show_usage { - print <<"EOF"; -Usage: $self (search_term) - -Options: - -h|--help: - this screen. - -v|--verison: - version information. - -e|--exact: - only exact matching. - -t|--no-tags: - exclude tags from search. - -i|--info: - show the .info for each found item. - -r|--readme: - show the README for each found item. - -q|--queue: - show the build queue for each found item. - -Example: - $self libsexy - -EOF - return 1; -} - -my ($help, $vers, $search_exact, $exclude_tags, $show_info, $show_readme, $show_queue); - -GetOptions( - 'help|h' => \$help, - 'version|v' => \$vers, - 'exact|e' => \$search_exact, - 'no-tags|t' => \$exclude_tags, - 'info|i' => \$show_info, - 'readme|r' => \$show_readme, - 'queue|q' => \$show_queue, -); - -if ($help) { show_usage(); exit 0 } -if ($vers) { show_version(); exit 0 } - -if (!@ARGV) { show_usage(); exit 1 } -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 { - script_error 'perform_search requires an argument.' unless @_ == 1; - my $search_arg = shift; - my $search_tag_re = $search_exact ? qr/^(\S+).*(:\s|,)\b\Q$search_arg\E\b(,|$)/i : qr/^(\S+):\s.*\Q$search_arg\E/i; - my $search_name_re = $search_exact ? qr/^\Q$search_arg\E$/i : qr/.*\Q$search_arg\E.*/i; - - # first get a bunch of names from the TAGS.txt if it's available - my $tags_file = "$config{SBO_HOME}/repo/TAGS.txt"; - my @names; - if (!$exclude_tags && -f $tags_file) { - _race::cond('$tags_file may be deleted after -f check'); - my ($t_fh, $t_exit) = open_read "$config{SBO_HOME}/repo/TAGS.txt"; - unless ($t_exit) { - while (my $line = <$t_fh>) { - if ($line =~ $search_tag_re) { - push @names, $1; - } - } - } - } - - my $loc_regex = qr/LOCATION:\s+\.?(.*)$/; - my ($fh, $exit) = open_read $slackbuilds_txt; - if ($exit) { - warn $fh; - exit $exit; - } - my (%local, @findings); - FIRST: while (my $line = <$fh>) { - if ($line =~ /NAME:\s+(.*)$/) { - my $name = $1; - - # Try to match either one of the names from TAGS.txt or the search string - - my $names = @names; - # Whenever we find an element equal to $name, throw it away (and - # replace with last element rather than shifting stuff around) - for (reverse @names) { $_ = pop @names if $_ eq $name; } - - # next if $name didn't match either one of @names or $search_name_re - if ($names == @names and $name !~ $search_name_re) { next FIRST; } - - # We only reach this point if $name matched one of @names, or if - # $search_name_re matched - - # If the name matches a local override, use its location - 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; - next FIRST; - } - - # Otherwise the location should be in the next line - LOCATION: { - my $loc_line = <$fh>; - if (my ($location) = $loc_line =~ $loc_regex) { - push @findings, {name => $name, location => $repo_path . $location}; - next FIRST; - } else { - redo LOCATION; # But if it isn't, we try again... - } - } - } - } - if ($config{LOCAL_OVERRIDES} ne 'FALSE') { - opendir(my $dh, $config{LOCAL_OVERRIDES}); - while (my $dir = readdir($dh)) { - next if $local{$dir}; - if ($dir =~ $search_name_re or in($dir, @names)) { - 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 { - script_error 'get_file_contents requires an argument.' unless @_ == 1; - my $file = shift; - my $contents = slurp($file); - return "Unable to open $file.\n" unless defined $contents; - return "\n" . indent 6, $contents; -} - -# get build queue and return it as a single line. -sub show_build_queue { - script_error('show_build_queue requires an argument.') unless @_ == 1; - my $queue = get_build_queue([shift], {}); - return join(" ", @$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 $version = get_from_info(LOCATION => $location, GET => 'VERSION')->[0]; - my $sbo = "SBo: "; $sbo = "Local: " if $hash->{local}; - say "$sbo $name $version"; - 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; |