[Lxr-commits] CVS: lxr INSTALL,1.5,1.6 genxref,1.24,1.25 search,1.7,1.8
Brought to you by:
ajlittoz
From: Malcolm B. <mb...@us...> - 2002-01-23 15:52:55
|
Update of /cvsroot/lxr/lxr In directory usw-pr-cvs1:/tmp/cvs-serv30089 Modified Files: INSTALL genxref search Log Message: Add ability to use swish-e as a free-text search engine, rather than Glimpse. Swish-e is fully free software, unlike Glimpse. Patch from Arne. Index: INSTALL =================================================================== RCS file: /cvsroot/lxr/lxr/INSTALL,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- INSTALL 2002/01/23 15:14:07 1.5 +++ INSTALL 2002/01/23 15:52:51 1.6 @@ -7,11 +7,14 @@ 2) A relational database - MySQL (http://www.mysql.com) and Postgresql (http://www.postgresql.org) are supported. + 3) Apache with mod_perl - http://www.apache.org -If you want to be able to do free text searchs of your repository as -well as browse it you will have to obtain and install glimpse from -http://glimpse.cs.arizona.edu +4) For freetext searching, either Glimpse (http://glimpse.cs.arizona.edu) or + Swish-e (http://swish-e.org). You need the development version of + swish-e (i.e. 2.1.x or later). + Swish-e is fully GPL'ed, while Glimpse is only free for + non-commercial use. Installing the database ----------------------- @@ -109,6 +112,24 @@ 'sourceroot' => 'cvs:/path/to/cvs/repository/lxr' 'sourcerootname' => 'A Friendly Name For Your Repository' + +Using Swish-e with LXR +---------------------- + +This is simple: + +1) Put the paths to swish-e and swish-search in the 'swishindex' and + 'swishsearch' variables in lxr.conf. If there is no swish-search + executable on your system, use the path to swish-e as the + 'swishsearch' value. + +2) Create a directory for the swish index files to go in, and put the + path of this directory in the 'swishdir' variable. + +3) Comment out the 'glimpsebin' variable + +Now re-run genxref and it should build the swish indexes for you and +you're done. Getting Glimpse to work with LXR -------------------------------- Index: genxref =================================================================== RCS file: /cvsroot/lxr/lxr/genxref,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- genxref 2001/09/26 14:42:57 1.24 +++ genxref 2002/01/23 15:52:51 1.25 @@ -19,6 +19,7 @@ use lib 'lib'; use Fcntl; use Getopt::Long; +use IO::Handle; use LXR::Files; use LXR::Index; @@ -78,6 +79,7 @@ foreach my $version (@versions) { genindex('/', $version); genrefs('/', $version); + gensearch($version); } @@ -109,4 +111,42 @@ &LXR::Tagger::processrefs($pathname, $release, $config, $files, $index) } +} + +sub feedswish { + my ($pathname, $release, $swish) = @_; + + print(STDERR "&&& $pathname $release \n"); + + if ($pathname =~ m|/$|) { + map { + feedswish($pathname.$_, $release, $swish) + } $files->getdir($pathname, $release); + } else { + my $contents = $files->getfile($pathname, $release); + $swish->print("Path-Name: $pathname\n", + "Content-Length: ".length($contents)."\n", + "Document-Type: TXT\n", + "\n", + $contents) + if length($contents) > 0; + } +} + +sub gensearch { + my ($release) = @_; + + if ($config->swishdir and $config->swishindex) { + my $swish = new IO::Handle; + my $pid = open($swish, "|-"); + if ($pid == 0) { + exec($config->swishindex, + "-S", "prog", "-i", "/bin/cat", "-v", "1", + "-f", $config->swishdir."/".$release.".index"); + print(STDERR "Couldn't exec ".$config->swishindex.": $!\n"); + kill(9, $$); + } + feedswish("/", $release, $swish); + $swish->close(); + } } Index: search =================================================================== RCS file: /cvsroot/lxr/lxr/search,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- search 2001/10/16 20:38:37 1.7 +++ search 2002/01/23 15:52:51 1.8 @@ -25,19 +25,122 @@ $CVSID = '$Id$ '; +use strict; use lib do { $0 =~ m{(.*)/} ? "$1/lib" : "lib" }; use LXR::Common qw(:html); use LXR::Config; -$maxhits = 1000; +my $maxhits = 1000; + + +sub glimpsesearch { + my ($searchtext) = @_; + + unless (open(GLIMPSE, "-|")) { + open(STDERR, ">&STDOUT"); + $!=''; + exec($config->glimpsebin,"-i","-H".$config->dbdir,'-y','-n',$searchtext); + print("Glimpse subprocess died unexpextedly: $!\n"); + exit; + } + + my $numlines = 0; + my @glimpselines = (); + while (<GLIMPSE>) { + $numlines++; + push(@glimpselines,$_); + if ($numlines > $maxhits) { + last; + } + } + + close(GLIMPSE); + + my $retval = $? >> 8; + + # The manpage for glimpse says that it returns 2 on syntax errors or + # inaccessible files. It seems this is not the case. + # We will have to work around it for the time being. + + if ($retval == 0) { + if (@glimpselines == 0) { + print("No matching files<br>\n"); + } else { + if ($numlines > $maxhits) { + print("<b> Too many hits, displaying first $maxhits</b><br>\n"); + } + print("<h1>$searchtext</h1>\n"); + my $sourceroot = $config->sourceroot; + foreach my $glimpseline (@glimpselines) { + + $glimpseline =~ s/$sourceroot//; + my ($file, $line, $text) = + $glimpseline =~ /(.*?):\s*(\d+)\s*:(.*)/; + $text =~ s/&/&/g; + $text =~ s/</</g; + $text =~ s/>/>/g; + + print(&fileref("$file, line $line", "find-file", + "/$file", $line), + " -- $text<br>\n"); + } + } + } elsif ($retval == 1) { + my $glimpsebin = $config->glimpsebin; + my $glimpseresponse = join("<br>",@glimpselines); + my $glimpseresponse =~ s/$glimpsebin/Reason/; + my $glimpseresponse =~ s/glimpse: error in searching index//; + print("<b>Search failed</b><br>\n$glimpseresponse"); + } else { + print("Unexpected returnvalue $retval from Glimpse\n"); + } +} + + +sub swishsearch { + my ($searchtext) = @_; + + unless (open(SWISH, "-|")) { + open(STDERR, ">&STDOUT"); + exec($config->swishsearch, + "-f", $config->swishdir."/".$release.".index", + "-m", $maxhits, "-w", $searchtext); + + print(STDERR "Couldn't exec ".$config->swishsearch.": $!\n"); + kill(9, $$); + } + + my @result = grep { not /^[\#\.]/ } <SWISH>; + close(SWISH); + my $retval = $? >> 8; + + if ($retval == 0) { + if (@result == 0) { + print("No matching files<br>\n"); + } else { + if (@result == $maxhits) { + print("<b> Too many hits, displaying first $maxhits</b><br>\n"); + } + print("<h1>$searchtext</h1>\n"); + + foreach my $hit (@result) { + my ($score, $file) = + $hit =~ /^(\d+) \/(\S+) \S+ \d+/; + + print("$score ", &fileref("$file", "find-file", "/$file"), "<br>\n"); + } + } + } + else { + print("<b>Search failed</b><br>\n@result"); + } +} + sub search { print("<p align=center>\n", - "This searchpage is powered by ", - "<a href=\"http://glimpse.cs.arizona.edu\">Glimpse</a>\n"); - - print("<form method=get action=\"search\">\n"); + "<form method=get action=\"search\">\n"); foreach ($config->allvariables) { if ($config->variable($_) ne $config->vardefault($_)) { @@ -46,6 +149,8 @@ } } + my $searchtext = $HTTP->{'param'}->{'string'}; + print("<B>Search for: </B><input type=text name=\"string\" ", "value=\"",$searchtext,"\" size=50>\n", "<input type=submit value=\"search\">\n", @@ -55,69 +160,16 @@ if ($searchtext ne "") { print("<hr>\n"); - unless (open(GLIMPSE, "-|")) { - open(STDERR, ">&STDOUT"); - $!=''; - exec($config->glimpsebin,"-i","-H".$config->dbdir,'-y','-n',$searchtext); - print("Glimpse subprocess died unexpextedly: $!\n"); - exit; - } - - $numlines = 0; - @glimpselines = (); - while (<GLIMPSE>) { - $numlines++; - push(@glimpselines,$_); - if ($numlines > $maxhits) { - last; - } + if ($config->glimpsebin) { + glimpsesearch($searchtext); } - - close(GLIMPSE); - - $retval = $? >> 8; - - # The manpage for glimpse says that it returns 2 on syntax errors or - # inaccessible files. It seems this is not the case. - # We will have to work around it for the time being. - - if ($retval == 0) { - if (@glimpselines == 0) { - print("No matching files<br>\n"); - } else { - if ($numlines > $maxhits) { - print("<b> Too many hits, displaying first $maxhits</b><br>\n"); - } - print("<h1>$searchtext</h1>\n"); - $sourceroot = $config->sourceroot; - foreach $glimpseline (@glimpselines) { - - $glimpseline =~ s/$sourceroot//; - ($file, $line, $text) = - $glimpseline =~ /(.*?):\s*(\d+)\s*:(.*)/; - $text =~ s/&/&/g; - $text =~ s/</</g; - $text =~ s/>/>/g; - - print(&fileref("$file, line $line", "find-file", - "/$file", $line), - " -- $text<br>\n"); - } - } - } elsif ($retval == 1) { - $glimpsebin = $config->glimpsebin; - $glimpseresponse = join("<br>",@glimpselines); - $glimpseresponse =~ s/$glimpsebin/Reason/; - $glimpseresponse =~ s/glimpse: error in searching index//; - print("<b>Search failed</b><br>\n$glimpseresponse"); - } else { - print("Unexpected returnvalue $retval from Glimpse\n"); + elsif ($config->swishsearch and $config->swishdir) { + swishsearch($searchtext); } } } httpinit; -$searchtext = $HTTP->{'param'}->{'string'}; &makeheader('search'); &search; |