[Lxr-commits] CVS: lxr search,1.24,1.25
Brought to you by:
ajlittoz
From: Dave B. <bro...@us...> - 2004-07-26 20:47:52
|
Update of /cvsroot/lxr/lxr In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28509 Modified Files: search Log Message: combine file name search and freetext search Index: search =================================================================== RCS file: /cvsroot/lxr/lxr/search,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- search 21 Jul 2004 20:44:30 -0000 1.24 +++ search 26 Jul 2004 20:47:43 -0000 1.25 @@ -51,8 +51,30 @@ return $ret; } +sub filename_matches { + my ($filetext, $advanced, $casesensitive, $file) = @_; + if ($advanced) { + if ($casesensitive) { + if ($file =~ /$filetext/) { + return 1; + } + } elsif ($file =~ /$filetext/i) { + return 1; + } + } else { + if ($casesensitive) { + if (index($file, $filetext) != -1) { + return 1; + } + } elsif (index(lc($file), lc($filetext)) != -1) { + return 1; + } + } + return 0; +} + sub glimpsesearch { - my ($searchtext) = @_; + my ($searchtext, $filetext, $advanced, $casesensitive) = @_; $ENV{'PATH'} = '/bin:/usr/local/bin:/usr/bin:/usr/sbin'; unless (open(GLIMPSE, "-|")) { @@ -69,7 +91,7 @@ while (<GLIMPSE>) { $numlines++; push(@glimpselines, $_); - if ($numlines > $maxhits) { + if ($numlines >= $maxhits) { last; } } @@ -91,6 +113,8 @@ $glimpseline =~ s/$sourceroot//; my ($file, $line, $text) = $glimpseline =~ /(.*?):\s*(\d+)\s*:(.*)/; + next if $filetext and !filename_matches($filetext, $advanced, $casesensitive, $file); + $text =~ s/&/&/g; $text =~ s/</</g; $text =~ s/>/>/g; @@ -114,7 +138,7 @@ } sub swishsearch { - my ($searchtext) = @_; + my ($searchtext, $filetext, $advanced, $casesensitive) = @_; if (!-e $config->swishdir . "/" . $release . ".index") { print @@ -126,7 +150,7 @@ unless (open(SWISH, "-|")) { open(STDERR, ">&STDOUT"); exec($config->swishbin, "-f", $config->swishdir . "/" . $release . ".index", - "-m", $maxhits, "-w", "'" . $searchtext . "'"); + "-w", "'" . $searchtext . "'"); print(STDERR "Couldn't exec " . $config->swishbin . ": $!\n"); kill(9, $$); @@ -138,10 +162,16 @@ my @ret; if ($retval == 0) { + my $numlines = 0; foreach my $hit (@result) { next if $hit =~ /^err:/; # skip; only 'no results' errors happen with return value 0 + my ($score, $file) = $hit =~ /^(\d+) \/(.+) "(.+)" \d+/; + next if $filetext and !filename_matches($filetext, $advanced, $casesensitive, $file); push @ret, [ $file, $score ]; + $numlines++; + + last if ($numlines >= $maxhits); } return @ret; } else { @@ -159,13 +189,22 @@ foreach (@results) { - # glimpse and swish-e provide different data for each result - my (@params) = @$_; - - if ($config->glimpsebin) { - my $file = $params[0]; - my $line = $params[1]; - my $text = $params[2]; + # filename, glimpse and swish-e searches provide different data for each result + if (!ref) { + my $file = $_; + $ret .= expandtemplate( + $templ, + ( + score => sub { return '' }, + text => sub { return '' }, + fileref => sub { fileref("$file", "find-file", "/$file") }, + ) + ); + } elsif ($config->glimpsebin) { + my (@params) = @$_; + my $file = $params[0]; + my $line = $params[1]; + my $text = $params[2]; $ret .= expandtemplate( $templ, ( @@ -174,8 +213,9 @@ ) ); } else { - my $file = $params[0]; - my $score = $params[1]; + my (@params) = @$_; + my $file = $params[0]; + my $score = $params[1]; $ret .= expandtemplate( $templ, ( @@ -203,17 +243,53 @@ die "'htmlsearch' template not configured"; } - my $searchtext = $HTTP->{'param'}->{'string'}; + my $searchtext = $HTTP->{'param'}->{'string'}; + my $filetext = $HTTP->{'param'}->{'filestring'}; + my $advanced = $HTTP->{'param'}->{'advanced'}; + my $casesensitive = $HTTP->{'param'}->{'casesensitive'}; my @results; if ($searchtext ne "") { if ($config->glimpsebin) { - @results = glimpsesearch($searchtext); + @results = glimpsesearch($searchtext, $filetext, $advanced, $casesensitive); } elsif ($config->swishbin and $config->swishdir) { - @results = swishsearch($searchtext); + @results = swishsearch($searchtext, $filetext, $advanced, $casesensitive); } else { warning("No freetext search engine configured."); } + } elsif ($filetext ne "") { + my $FILELISTING; + if ($config->swishdir and $config->swishbin) { + unless ($FILELISTING = new IO::File($config->swishdir . "/$release.filenames")) { + &warning( + "Version '$release' has not been indexed and is unavailable for searching<br>Could not open " + . $config->swishdir + . "/$release.filenames."); + return; + } + } elsif ($config->glimpsedir and $config->glimpsebin) { + unless ($FILELISTING = + new IO::File($config->glimpsedir . "/" . $release . "/.glimpse_filenames")) + { + &warning( + "Version '$release' has not been indexed and is unavailable for searching<br>Could not open " + . $config->glimpsedir + . "/$release/.glimpse_filenames."); + return; + } + } else { + warning( + "Freetext search engine required for file search, and no freetext search engine is configured" + ); + return; + } + my $sourceroot = $config->sourceroot . '/' . $release . '/'; + while (<$FILELISTING>) { + chomp; + s/^$sourceroot//; + push @results, $_ if filename_matches($filetext, $advanced, $casesensitive, $_); + } + close($FILELISTING); } print expandtemplate( @@ -222,7 +298,10 @@ variables => sub { varinputs(@_) }, searchtext => sub { return $searchtext }, searchtext_escaped => sub { $_ = $searchtext; s/\"/"/g; return $_; }, - maxhits_message => sub { + filetext_escaped => sub { $_ = $filetext; s/\"/"/g; return $_; }, + advancedchecked => sub { return $advanced ? "checked" : "" }, + casesensitivechecked => sub { return $casesensitive ? "checked" : "" }, + maxhits_message => sub { return @results == $maxhits ? "<b>Too many hits, displaying first $maxhits</b><br>" : ""; |