Program checkcvs; { $Id$ This file is part of the Free Pascal run time library. Copyright (c) 1999-2000 by the Free Pascal development team. A simple filter program which displays what happened on CVS today. Without parameters it shows the newest CVS log entry. If you specify a nummeric parameter smaller than 365, CheckCvs searches for ALL entries n days back. Great to quickly check what changed after an update etc. Todo : add getopts and some switches to increase configurability. See the file COPYING.FPC, included in this distribution, for details about the copyright. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. **********************************************************************} Uses Dos; Const bufferlimit=10000; Type Array12type = ARRAY [1..12] Of longint; Const MonthCumm : Array12type = (0,31,59,90,120,151,181,212,243,273,304,334); Function LeapYr( Year : longint) : boolean; Begin LeapYr := (Year Mod 4 = 0) And ((Year Mod 100 <> 0) Or (Year Mod 400 = 0)); End; Function DayNr( Day,Month,Year: longint) : longint; {Modified version. A daynr function that returns daynr since 1-1-1980. Leapyears ok till 2100.} Var i : longint; Begin i := MonthCumm[Month]+Day; If (Month > 2) And LeapYr( Year ) Then INC( i ); INC(I,(Year-1980)*365 + (Year-1976) SHR 2); { - (Year -2000) DIV 100; makes it ok till 2400} DayNr := i; End ; {TrimLeft isn't overloaded for pascal string yet.} Procedure LTrim(Var P : String;Ch:Char); Var I,J : longint; Begin I := Length(P); { Keeping length in local data eases optimalisations} If (I>0) Then Begin J := 1; while (P[J]=Ch) AND (J<=I) Do INC(J); If J>1 Then Delete(P,1,J-1); End; End; Var NewestBuffer : PChar; {Buffer containing the "newest" data} BufferIndex : Longint; {Bytes in buffer} NewestDate : Longint; {Newest date (the one in NewestBuffer)} CheckMode : boolean; {Do we search newest, or all msgs since days ago} Procedure CheckAfile(Name:String;Firstday:longint); {Outputs filename and relevant CVSLOG entries for all files that have log entries newer than FirstDay.} Var F : Text; Lines : longint; Found : boolean; S,S2,S3 : String; ValidLogEntry : boolean; Day,Month,Year : longint; PosDate : longint; FirstLogEntry : boolean; Procedure AppendLine (S : String); Begin If CheckMode Then Begin If (Length(S)<>0) AND ((Length(S)+BufferIndex+2)0 Then Begin Delete(S,1,Lines); LTrim(S,' '); Year := ReadTwo(1)*100+ReadTwo(3); Month := ReadTwo(6); Day := ReadTwo(9); PosDate := DayNr(Day,Month,Year); If CheckMode Then Begin If PosDate>=NewestDate Then Begin NewestDate:=PosDate; BufferIndex:=0; ValidLogEntry := TRUE; AppendLine('File: '+Name); AppendLine(S2); End; End Else If (PosDate>=FirstDay) Then Begin ValidLogEntry := TRUE; If FirstLogEntry Then Begin FirstLogEntry := FALSE; AppendLine('File: '+Name); End; AppendLine(S2); End; End; End Else If ValidLogEntry And (S[1]<>'}') Then AppendLine(S); Until EOF(F) Or (S[1]='}'); Close(F); End; Var year, month, mday, wday: word; TheDay,Days : longint; D : SearchRec; Procedure SearchExtension(Pattern:String); Begin FindFirst(Pattern,Anyfile-Directory,D); while DosError = 0 Do Begin CheckAFile(D.Name,TheDay); FindNext(D); End; FindClose(D); End; Begin GetMem(NewestBuffer,bufferlimit); BufferIndex:=0; NewestDate:=0; GetDate(year, month, mday, wday); {GetDate} TheDay := DayNr(MDay,Month,Year); {Convert to something linear} If ParamCount<>0 Then {If parameter is nummeric, subtract} Begin CheckMode:=FALSE; Val(ParamStr(1),Days,Year); If (Year=0) And (Days<365) Then { n days from current date} dec(TheDay,Days); End Else CheckMode:=True; SearchExtension('*.pp'); {Scan files in simple FindFirst loop} SearchExtension('*.pas'); SearchExtension('*.inc'); If CheckMode AND (BufferIndex<>0) THEN Begin For Days:=0 TO BufferIndex-1 Do Write(NewestBuffer[Days]); End; FreeMem(NewestBuffer,bufferlimit); End. { $Log$ Revision 1.1 2000-07-13 10:16:21 michael + Initial import Revision 1.4 2000/07/04 19:05:54 peter * be optimistic: version 1.00 for some utils Revision 1.3 2000/02/20 13:05:41 marco * No parameters show last modification in dir + small bugfix Revision 1.2 2000/01/16 13:24:48 marco * some ugly comments fixed. Revision 1.1 2000/01/14 22:05:47 marco * Some fixes, rename .pas to .pp, ptop'ed Revision 1.1 2000/01/14 12:02:04 marco * Initial version }