mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-29 17:45:04 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			135 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
| {$mode objfpc}
 | |
| {$h+}
 | |
| program vers;
 | |
| 
 | |
| uses Classes,sysutils,process,DOM,xmlread,custapp,IniFiles;
 | |
| 
 | |
| Type
 | |
|  { TVersion }
 | |
|  TVersion = Class(TCollectionItem)
 | |
|  private
 | |
|    FAuthor: String;
 | |
|    FDate: string;
 | |
|    FLogMessage: String;
 | |
|    FRevision: Integer;
 | |
|  Public
 | |
|    Property Revision : Integer read FRevision;
 | |
|    Property LogMessage : String Read FLogMessage;
 | |
|    Property Date : string Read FDate;
 | |
|    Property Author : String Read FAuthor;
 | |
|  end;
 | |
|  
 | |
|  { TVersions }
 | |
| 
 | |
|  TVersions = Class(TCollection)
 | |
|  private
 | |
|    function GetVersion(Index : INteger): TVersion;
 | |
|    procedure SetVersion(Index : INteger; const AValue: TVersion);
 | |
|  Protected
 | |
|    procedure ConvertLogEntry(E : TDomElement);
 | |
|  public
 | |
|    Procedure LoadFromXML(Doc : TXMlDocument);
 | |
|    property Versions[Index : INteger] : TVersion Read GetVersion Write SetVersion; Default;
 | |
|  end;
 | |
| 
 | |
|  AppError = Class(Exception); 
 | |
| 
 | |
| Resourcestring
 | |
|   SErrInValidSVNLog = 'INvalid SVN log';
 | |
| 
 | |
| { TVersions }
 | |
| 
 | |
| function TVersions.GetVersion(Index : INteger): TVersion;
 | |
| begin
 | |
|   Result:=Items[Index] as Tversion;
 | |
| end;
 | |
| 
 | |
| procedure TVersions.SetVersion(Index : INteger; const AValue: TVersion);
 | |
| begin
 | |
|   Items[Index]:=AValue;
 | |
| end;
 | |
| 
 | |
| procedure TVersions.ConvertLogEntry(E : TDomElement);
 | |
| 
 | |
|   Function GetNodeText(N : TDomNode) : String;
 | |
|   
 | |
|   begin
 | |
|     N:=N.FirstChild;
 | |
|     If N<>Nil then
 | |
|       Result:=N.NodeValue;
 | |
|   end;
 | |
| 
 | |
| Var
 | |
|   N : TDomNode;
 | |
|   V : TVersion;
 | |
| 
 | |
| begin
 | |
|   V:=Add as TVersion;
 | |
|   V.FRevision:=StrToIntDef(E['revision'],-1);
 | |
|   N:=E.FirstChild;
 | |
|   While (N<>Nil) do
 | |
|     begin
 | |
|     If (N.NodeType=ELEMENT_NODE) then
 | |
|       begin
 | |
|       if (N.NodeName='author') then
 | |
|         V.FAuthor:=GetNodeText(N)
 | |
|       else If (N.NodeName='date') then
 | |
|         V.FDate:=GetNodeText(N)
 | |
|       else If (N.NodeName='msg') then
 | |
|         V.FLogMessage:=GetNodeText(N);
 | |
|       end;
 | |
|     N:=N.NextSibling;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| procedure TVersions.LoadFromXML(Doc: TXMlDocument);
 | |
| 
 | |
| var
 | |
|   L : TDomNode;
 | |
|   E : TDomElement;
 | |
| 
 | |
| begin
 | |
|   L:=Doc.FirstChild;
 | |
|   While (L<>Nil) and not ((L.NodeType=ELEMENT_NODE) and (L.NodeName='log')) do
 | |
|     L:=L.NextSibling;
 | |
|   if (L=Nil) then
 | |
|     Raise AppError.Create(SErrInValidSVNLog);
 | |
|   L:=L.FirstChild;
 | |
|   While (L<>Nil) do
 | |
|     begin
 | |
|     If (L.NodeType=ELEMENT_NODE) and (L.NodeName='logentry') then
 | |
|       E:=TDomElement(L);
 | |
|     ConvertLogEntry(E);
 | |
|     L:=L.NextSibling;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Var
 | |
|   Doc : TXMLDocument;
 | |
|   F : TFileStream;
 | |
|   I : Integer;
 | |
| 
 | |
| begin
 | |
|   With TVersions.Create(TVersion) do 
 | |
|     Try
 | |
|       F:=TFileStream.Create('test.xml',fmOpenRead);
 | |
|       Try
 | |
|         ReadXMLFile(Doc,F);
 | |
|         Writeln('Got ',Count,' revisions');
 | |
|         LoadFromXml(Doc);
 | |
|         For I:=0 to count-1 do
 | |
|           begin
 | |
|           Writeln('Revision ',I,' : ');
 | |
|           Writeln('Revision : ',Versions[i].Revision);
 | |
|           Writeln('Author   : ',Versions[i].Author);
 | |
|           Writeln('Date     : ',Versions[i].Date);
 | |
|           Writeln('Message  : ',Versions[i].LogMessage); 
 | |
|           end;
 | |
|       finally
 | |
|         F.Free;
 | |
|       end;  
 | |
|     Finally
 | |
|       Free;
 | |
|     end;
 | |
| end.
 | 
