mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-12 23:49:45 +02: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.
|