1999-07-23 18:39:31 +00:00
|
|
|
#!/usr/bonsaitools/bin/perl -w
|
1998-06-16 21:43:24 +00:00
|
|
|
# -*- Mode: perl; indent-tabs-mode: nil -*-
|
|
|
|
#
|
|
|
|
# The contents of this file are subject to the Netscape Public License
|
|
|
|
# Version 1.0 (the "License"); you may not use this file except in
|
|
|
|
# compliance with the License. You may obtain a copy of the License at
|
|
|
|
# http://www.mozilla.org/NPL/
|
|
|
|
#
|
|
|
|
# Software distributed under the License is distributed on an "AS IS"
|
|
|
|
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
|
|
|
# License for the specific language governing rights and limitations
|
|
|
|
# under the License.
|
|
|
|
#
|
|
|
|
# The Original Code is the Bonsai CVS tool.
|
|
|
|
#
|
|
|
|
# The Initial Developer of the Original Code is Netscape Communications
|
|
|
|
# Corporation. Portions created by Netscape are Copyright (C) 1998
|
|
|
|
# Netscape Communications Corporation. All Rights Reserved.
|
|
|
|
|
|
|
|
# Query the CVS database.
|
|
|
|
#
|
|
|
|
|
1999-07-23 18:39:31 +00:00
|
|
|
require 'CGI.pl';
|
1998-06-16 21:43:24 +00:00
|
|
|
|
1999-07-23 18:39:31 +00:00
|
|
|
use vars qw(@LegalDirs);
|
1998-06-16 21:43:24 +00:00
|
|
|
|
1999-07-23 18:39:31 +00:00
|
|
|
$|=1;
|
1998-06-16 21:43:24 +00:00
|
|
|
|
|
|
|
print "Content-type: text/html\n\n";
|
|
|
|
|
1999-07-23 18:39:31 +00:00
|
|
|
LoadTreeConfig();
|
|
|
|
$CVS_ROOT = $::FORM{'cvsroot'};
|
|
|
|
$CVS_ROOT = pickDefaultRepository() unless $CVS_ROOT;
|
|
|
|
$::TreeID = $::FORM{'module'}
|
|
|
|
if (exists($::TreeInfo{$::FORM{'module'}}{'repository'}));
|
1998-06-16 21:43:24 +00:00
|
|
|
|
1999-07-23 18:39:31 +00:00
|
|
|
PutsHeader("Bonsai - CVS Query Form", "CVS Query Form",
|
|
|
|
"$CVS_ROOT - $::TreeInfo{$::TreeID}{shortdesc}");
|
1998-06-16 21:43:24 +00:00
|
|
|
|
|
|
|
print "
|
|
|
|
<p>
|
|
|
|
<FORM METHOD=GET ACTION='cvsquery.cgi'>
|
1999-07-23 18:39:31 +00:00
|
|
|
<INPUT TYPE=HIDDEN NAME=treeid VALUE=$::TreeID>
|
1998-06-16 21:43:24 +00:00
|
|
|
<p>
|
|
|
|
<TABLE BORDER CELLPADDING=8 CELLSPACING=0>
|
|
|
|
";
|
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
# module selector
|
|
|
|
#
|
|
|
|
print "
|
|
|
|
<TR><TH ALIGN=RIGHT>Module:</TH>
|
|
|
|
<TD>
|
|
|
|
<SELECT name='module' size=5>
|
|
|
|
";
|
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
# check to see if there are multple repositories
|
|
|
|
#
|
|
|
|
@reposList = &getRepositoryList();
|
|
|
|
$bMultiRepos = (@reposList > 1);
|
|
|
|
|
|
|
|
#
|
|
|
|
# This code sucks, I should rewrite it to be shorter
|
|
|
|
#
|
1999-07-23 18:39:31 +00:00
|
|
|
$Module = 'default';
|
|
|
|
if( $::FORM{module} eq 'all' || $::FORM{module} eq '' ){
|
1998-06-16 21:43:24 +00:00
|
|
|
print "<OPTION SELECTED VALUE='all'>All Files in the Repository\n";
|
|
|
|
if( $bMultiRepos ){
|
|
|
|
print "<OPTION VALUE='allrepositories'>All Files in all Repositories\n";
|
|
|
|
}
|
|
|
|
}
|
1999-07-23 18:39:31 +00:00
|
|
|
elsif( $::FORM{module} eq 'allrepositories' ){
|
1998-06-16 21:43:24 +00:00
|
|
|
print "<OPTION VALUE='all'>All Files in the Repository\n";
|
|
|
|
if( $bMultiRepos ){
|
|
|
|
print "<OPTION SELECTED VALUE='allrepositories'>All Files in all Repositories\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
1999-07-23 18:39:31 +00:00
|
|
|
$Module = $::FORM{module};
|
1998-06-16 21:43:24 +00:00
|
|
|
print "<OPTION VALUE='all'>All Files in the Repository\n";
|
|
|
|
if( $bMultiRepos ){
|
|
|
|
print "<OPTION VALUE='allrepositories'>All Files in all Repositories\n";
|
|
|
|
}
|
1999-07-23 18:39:31 +00:00
|
|
|
print "<OPTION SELECTED VALUE='$::FORM{module}'>$::FORM{module}\n";
|
1998-06-16 21:43:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#
|
|
|
|
# Print out all the Different Modules
|
|
|
|
#
|
1999-07-23 18:39:31 +00:00
|
|
|
LoadDirList();
|
|
|
|
for $k (sort( grep(!/\*$/, @::LegalDirs) ) ){
|
|
|
|
print "<OPTION value='$k'>$k\n" if ($k ne $Module);
|
1998-06-16 21:43:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
print "</SELECT></td>\n";
|
|
|
|
print "<td rowspan=2>";
|
|
|
|
cvsmenu();
|
|
|
|
print "</td></tr>";
|
|
|
|
|
|
|
|
#
|
|
|
|
# Branch
|
|
|
|
#
|
1999-07-23 18:39:31 +00:00
|
|
|
if( defined $::FORM{branch} ){
|
|
|
|
$b = $::FORM{branch};
|
1998-06-16 21:43:24 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
$b = "HEAD";
|
|
|
|
}
|
|
|
|
print "<tr>
|
|
|
|
<th align=right>Branch:</th>
|
|
|
|
<td> <input type=text name=branch value='$b' size=25><br>\n" .
|
|
|
|
regexpradio('branchtype') .
|
|
|
|
"<br>(leaving this field empty will show you checkins on both
|
|
|
|
<tt>HEAD</tt> and branches)
|
|
|
|
</td></tr>";
|
|
|
|
|
|
|
|
#
|
|
|
|
# Query by directory
|
|
|
|
#
|
|
|
|
print "
|
|
|
|
<tr>
|
|
|
|
<th align=right>Directory:</th>
|
|
|
|
<td colspan=2>
|
1999-07-23 18:39:31 +00:00
|
|
|
<input type=text name=dir value='$::FORM{dir}' size=45><br>
|
1998-06-16 21:43:24 +00:00
|
|
|
(you can list multiple directories)
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
";
|
|
|
|
|
|
|
|
print "
|
|
|
|
<tr>
|
|
|
|
<th align=right>File:</th>
|
|
|
|
<td colspan=2>
|
1999-07-23 18:39:31 +00:00
|
|
|
<input type=text name=file value='$::FORM{file}' size=45><br>" .
|
1998-06-16 21:43:24 +00:00
|
|
|
regexpradio('filetype') . "
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
";
|
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
# Who
|
|
|
|
#
|
|
|
|
print "
|
|
|
|
<tr>
|
|
|
|
<th align=right>Who:</th>
|
1999-07-23 18:39:31 +00:00
|
|
|
<td colspan=2> <input type=text name=who value='$::FORM{who}' size=45><br>" .
|
1998-06-16 21:43:24 +00:00
|
|
|
regexpradio('whotype') . "
|
|
|
|
</td>
|
|
|
|
</tr>";
|
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
# Log contains
|
|
|
|
#
|
|
|
|
#print "
|
|
|
|
#<br>
|
|
|
|
#<nobr><b>Log contains:</b>
|
|
|
|
#<input type=text name=logexpr size=45></nobr>(you can use <a href=cvsregexp.html>regular expressions</a>)\n";
|
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
# Sort order
|
|
|
|
#
|
|
|
|
print "
|
|
|
|
<tr>
|
|
|
|
<th align=right>Sort By:</th>
|
|
|
|
<td colspan=2>
|
|
|
|
<SELECT name='sortby'>
|
|
|
|
<OPTION" . &sortTest("Date") . ">Date
|
|
|
|
<OPTION" . &sortTest("Who") . ">Who
|
|
|
|
<OPTION" . &sortTest("File") . ">File
|
|
|
|
<OPTION" . &sortTest("Change Size") . ">Change Size
|
|
|
|
</SELECT>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
";
|
|
|
|
|
|
|
|
#
|
|
|
|
# Print the date selector
|
|
|
|
#
|
|
|
|
|
|
|
|
$CVS_REPOS_SUFFIX = $CVS_ROOT;
|
|
|
|
$CVS_REPOS_SUFFIX =~ s:/:_:g;
|
|
|
|
|
|
|
|
$startdate = fetchCachedStartDate($CVS_ROOT);
|
|
|
|
|
1999-07-23 18:39:31 +00:00
|
|
|
if (!defined($::FORM{date}) || $::FORM{date} eq "") {
|
|
|
|
$::FORM{date} = "hours";
|
1998-06-16 21:43:24 +00:00
|
|
|
}
|
|
|
|
|
1999-07-23 18:39:31 +00:00
|
|
|
$::FORM{mindate} = '' unless defined($::FORM{mindate});
|
|
|
|
$::FORM{maxdate} = '' unless defined($::FORM{maxdate});
|
|
|
|
|
1998-06-16 21:43:24 +00:00
|
|
|
print "
|
|
|
|
<tr>
|
|
|
|
<th align=right valign=top><br>Date:</th>
|
|
|
|
<td colspan=2>
|
|
|
|
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
|
|
|
|
<tr>
|
|
|
|
<td><input type=radio name=date " . &dateTest("hours") . "></td>
|
|
|
|
<td>In the last <input type=text name=hours value=2 size=4> hours</td>
|
|
|
|
</tr><tr>
|
|
|
|
<td><input type=radio name=date " . &dateTest("day") . "></td>
|
|
|
|
<td>In the last day</td>
|
|
|
|
</tr><tr>
|
|
|
|
<td><input type=radio name=date " . &dateTest("week") . "></td>
|
|
|
|
<td>In the last week</td>
|
|
|
|
</tr><tr>
|
|
|
|
<td><input type=radio name=date " . &dateTest("month") . "></td>
|
|
|
|
<td>In the last month</td>
|
|
|
|
</tr><tr>
|
|
|
|
<td><input type=radio name=date " . &dateTest("all") . "></td>
|
|
|
|
<td>Since the beginning of time (which happens to be <TT><NOBR>$startdate</NOBR></TT> currently)</td>
|
|
|
|
</tr><tr>
|
|
|
|
<td><input type=radio name=date " . &dateTest("explicit") . "></td>
|
|
|
|
<td><table BORDER=0 CELLPADDING=0 CELLPSPACING=0>
|
|
|
|
<tr>
|
|
|
|
<TD VALIGN=TOP ALIGN=RIGHT NOWRAP>
|
1999-07-23 18:39:31 +00:00
|
|
|
Between <input type=text name=mindate value='$::FORM{mindate}' size=25></td>
|
1998-06-16 21:43:24 +00:00
|
|
|
<td valign=top rowspan=2>You can use the form
|
|
|
|
<B><TT><NOBR>mm/dd/yy hh:mm:ss</NOBR></TT></B> or a Unix <TT>time_t</TT>
|
|
|
|
(seconds since the Epoch.)
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td VALIGN=TOP ALIGN=RIGHT NOWRAP>
|
1999-07-23 18:39:31 +00:00
|
|
|
and <input type=text name=maxdate '$::FORM{maxdate}' size=25></td>
|
1998-06-16 21:43:24 +00:00
|
|
|
</tr>
|
|
|
|
</table>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
</table>
|
|
|
|
</tr>
|
|
|
|
";
|
|
|
|
|
|
|
|
print "
|
|
|
|
<tr>
|
|
|
|
<th><BR></th>
|
|
|
|
<td colspan=2>
|
|
|
|
<INPUT TYPE=HIDDEN NAME=cvsroot VALUE='$CVS_ROOT'>
|
|
|
|
<INPUT TYPE=SUBMIT VALUE='Run Query'>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
</table>
|
|
|
|
</FORM>";
|
|
|
|
|
1999-07-23 18:39:31 +00:00
|
|
|
|
|
|
|
PutsTrailer();
|
|
|
|
|
1998-06-16 21:43:24 +00:00
|
|
|
sub sortTest {
|
1999-07-23 18:39:31 +00:00
|
|
|
return ""
|
|
|
|
unless (exists($::FORM{sortby}) && defined($_[0]) &&
|
|
|
|
($_[0] ne $::FORM{sortby}));
|
|
|
|
|
|
|
|
return " SELECTED";
|
1998-06-16 21:43:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
refigureStartDateIfNecessary($CVS_ROOT);
|
|
|
|
|
|
|
|
sub dateTest {
|
1999-07-23 18:39:31 +00:00
|
|
|
if( $_[0] eq $::FORM{date} ){
|
1998-06-16 21:43:24 +00:00
|
|
|
return " CHECKED value=$_[0]";
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return "value=$_[0]";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sub regexpradio {
|
1999-07-23 18:39:31 +00:00
|
|
|
my ($name) = @_;
|
|
|
|
my ($c1, $c2, $c3);
|
|
|
|
|
1998-10-08 22:01:36 +00:00
|
|
|
$c1 = $c2 = $c3 = "";
|
1999-07-23 18:39:31 +00:00
|
|
|
if( $::FORM{$name} eq 'regexp'){
|
1998-10-08 22:01:36 +00:00
|
|
|
$c2 = "checked";
|
|
|
|
}
|
1999-07-23 18:39:31 +00:00
|
|
|
elsif( $::FORM{$name} eq 'notregexp'){
|
1998-10-08 22:01:36 +00:00
|
|
|
$c3 = "checked";
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$c1 = "checked";
|
|
|
|
}
|
1998-06-16 21:43:24 +00:00
|
|
|
return "
|
|
|
|
<input type=radio name=$name value=match $c1>Exact match
|
|
|
|
|
1998-10-08 22:01:36 +00:00
|
|
|
<input type=radio name=$name value=regexp $c2><a href=cvsregexp.html>Regular expression</a>
|
|
|
|
|
|
|
|
<input type=radio name=$name value=notregexp $c3>Doesn't match <a href=cvsregexp.html>Reg Exp</a>";
|
1998-06-16 21:43:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
sub fetchCachedStartDate {
|
|
|
|
my ($repository) = @_;
|
|
|
|
open(CACHE, "<data/cachedstartdates") || return "unknown";
|
|
|
|
while (<CACHE>) {
|
|
|
|
chop();
|
|
|
|
my($rep,$date,$cachedate) = split(/\|/);
|
|
|
|
if ($rep eq $repository) {
|
|
|
|
$rememberedcachedate = $cachedate;
|
|
|
|
return $date;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return "unknown";
|
|
|
|
}
|
|
|
|
|
|
|
|
sub refigureStartDateIfNecessary {
|
|
|
|
my ($repository) = @_;
|
|
|
|
my $now = time();
|
|
|
|
if ((defined $rememberedcachedate) &&
|
|
|
|
$now - $rememberedcachedate < 24*60*60 &&
|
|
|
|
$rememberedcachedate < $now) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
1999-07-23 18:39:31 +00:00
|
|
|
ConnectToDatabase();
|
|
|
|
SendSQL("select min(when)
|
|
|
|
from checkins,repositories
|
|
|
|
where repositories.id = repositoryid and
|
|
|
|
repository = '$CVS_ROOT'");
|
1998-06-16 21:43:24 +00:00
|
|
|
|
1999-07-23 18:39:31 +00:00
|
|
|
my $startdate = FetchOneColumn();
|
1998-06-16 21:43:24 +00:00
|
|
|
if ($startdate eq "") {
|
|
|
|
$startdate = "nonexistant";
|
|
|
|
}
|
|
|
|
open(OUTCACHE, ">data/cachedstartdates.$$") || die "Can't open output date cache file";
|
|
|
|
if (open(INCACHE, "<data/cachedstartdates")) {
|
|
|
|
while (<INCACHE>) {
|
|
|
|
chop();
|
|
|
|
my($rep,$date,$cachedate) = split(/\|/);
|
|
|
|
if ($rep ne $repository) {
|
|
|
|
print OUTCACHE "$_\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
close INCACHE;
|
|
|
|
}
|
|
|
|
print OUTCACHE "$repository|$startdate|$now\n";
|
|
|
|
close OUTCACHE;
|
|
|
|
rename "data/cachedstartdates.$$", "data/cachedstartdates";
|
|
|
|
}
|