vers.pp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. {$mode objfpc}
  2. {$h+}
  3. program vers;
  4. uses Classes,sysutils,process,DOM,xmlread,custapp,IniFiles;
  5. Type
  6. { TVersion }
  7. TVersion = Class(TCollectionItem)
  8. private
  9. FAuthor: String;
  10. FDate: string;
  11. FLogMessage: String;
  12. FRevision: Integer;
  13. Public
  14. Property Revision : Integer read FRevision;
  15. Property LogMessage : String Read FLogMessage;
  16. Property Date : string Read FDate;
  17. Property Author : String Read FAuthor;
  18. end;
  19. { TVersions }
  20. TVersions = Class(TCollection)
  21. private
  22. function GetVersion(Index : INteger): TVersion;
  23. procedure SetVersion(Index : INteger; const AValue: TVersion);
  24. Protected
  25. procedure ConvertLogEntry(E : TDomElement);
  26. public
  27. Procedure LoadFromXML(Doc : TXMlDocument);
  28. property Versions[Index : INteger] : TVersion Read GetVersion Write SetVersion; Default;
  29. end;
  30. AppError = Class(Exception);
  31. Resourcestring
  32. SErrInValidSVNLog = 'INvalid SVN log';
  33. { TVersions }
  34. function TVersions.GetVersion(Index : INteger): TVersion;
  35. begin
  36. Result:=Items[Index] as Tversion;
  37. end;
  38. procedure TVersions.SetVersion(Index : INteger; const AValue: TVersion);
  39. begin
  40. Items[Index]:=AValue;
  41. end;
  42. procedure TVersions.ConvertLogEntry(E : TDomElement);
  43. Function GetNodeText(N : TDomNode) : String;
  44. begin
  45. N:=N.FirstChild;
  46. If N<>Nil then
  47. Result:=N.NodeValue;
  48. end;
  49. Var
  50. N : TDomNode;
  51. V : TVersion;
  52. begin
  53. V:=Add as TVersion;
  54. V.FRevision:=StrToIntDef(E['revision'],-1);
  55. N:=E.FirstChild;
  56. While (N<>Nil) do
  57. begin
  58. If (N.NodeType=ELEMENT_NODE) then
  59. begin
  60. if (N.NodeName='author') then
  61. V.FAuthor:=GetNodeText(N)
  62. else If (N.NodeName='date') then
  63. V.FDate:=GetNodeText(N)
  64. else If (N.NodeName='msg') then
  65. V.FLogMessage:=GetNodeText(N);
  66. end;
  67. N:=N.NextSibling;
  68. end;
  69. end;
  70. procedure TVersions.LoadFromXML(Doc: TXMlDocument);
  71. var
  72. L : TDomNode;
  73. E : TDomElement;
  74. begin
  75. L:=Doc.FirstChild;
  76. While (L<>Nil) and not ((L.NodeType=ELEMENT_NODE) and (L.NodeName='log')) do
  77. L:=L.NextSibling;
  78. if (L=Nil) then
  79. Raise AppError.Create(SErrInValidSVNLog);
  80. L:=L.FirstChild;
  81. While (L<>Nil) do
  82. begin
  83. If (L.NodeType=ELEMENT_NODE) and (L.NodeName='logentry') then
  84. E:=TDomElement(L);
  85. ConvertLogEntry(E);
  86. L:=L.NextSibling;
  87. end;
  88. end;
  89. Var
  90. Doc : TXMLDocument;
  91. F : TFileStream;
  92. I : Integer;
  93. begin
  94. With TVersions.Create(TVersion) do
  95. Try
  96. F:=TFileStream.Create('test.xml',fmOpenRead);
  97. Try
  98. ReadXMLFile(Doc,F);
  99. Writeln('Got ',Count,' revisions');
  100. LoadFromXml(Doc);
  101. For I:=0 to count-1 do
  102. begin
  103. Writeln('Revision ',I,' : ');
  104. Writeln('Revision : ',Versions[i].Revision);
  105. Writeln('Author : ',Versions[i].Author);
  106. Writeln('Date : ',Versions[i].Date);
  107. Writeln('Message : ',Versions[i].LogMessage);
  108. end;
  109. finally
  110. F.Free;
  111. end;
  112. Finally
  113. Free;
  114. end;
  115. end.