pkgarchive.pp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. unit pkgarchive;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes,SysUtils,pkghandler;
  6. type
  7. { TUnzipArchive }
  8. TUnzipArchive = Class(TPackagehandler)
  9. Private
  10. Procedure UnzipArchive;
  11. Public
  12. Function Execute(const Args:TActionArgs):boolean;override;
  13. end;
  14. { TCreateArchive }
  15. TCreateArchive = Class(TPackagehandler)
  16. Private
  17. Procedure CreateArchive;
  18. Public
  19. Function Execute(const Args:TActionArgs):boolean;override;
  20. end;
  21. implementation
  22. uses
  23. fprepos,
  24. fpxmlrep,
  25. zipper,
  26. uriparser,
  27. pkgglobals,
  28. pkgmessages;
  29. Procedure DeleteDir(const ADir:string);
  30. const
  31. {$ifdef unix}
  32. AllFiles='*';
  33. {$else}
  34. AllFiles='*.*';
  35. {$endif}
  36. var
  37. Info : TSearchRec;
  38. begin
  39. if FindFirst(ADir+PathDelim+AllFiles,faAnyFile, Info)=0 then
  40. try
  41. repeat
  42. if (Info.Attr and faDirectory)=faDirectory then
  43. begin
  44. if (Info.Name<>'.') and (Info.Name<>'..') then
  45. DeleteDir(ADir+PathDelim+Info.Name)
  46. end
  47. else
  48. DeleteFile(ADir+PathDelim+Info.Name);
  49. until FindNext(Info)<>0;
  50. finally
  51. FindClose(Info);
  52. end;
  53. end;
  54. { TUnzipArchive }
  55. Procedure TUnzipArchive.UnzipArchive;
  56. Var
  57. BuildDir : string;
  58. ArchiveFile : String;
  59. begin
  60. ArchiveFile:=PackageLocalArchive;
  61. BuildDir:=PackageBuildPath;
  62. { Download file if it doesn't exists yet }
  63. if not FileExists(ArchiveFile) then
  64. ExecuteAction(CurrentPackage,'downloadpackage');
  65. { Create builddir, remove it first if needed }
  66. if DirectoryExists(BuildDir) then
  67. DeleteDir(BuildDir);
  68. ForceDirectories(BuildDir);
  69. SetCurrentDir(BuildDir);
  70. { Unzip Archive }
  71. With TUnZipper.Create do
  72. try
  73. Log(vCommands,SLogUnzippping,[ArchiveFile]);
  74. OutputPath:=PackageBuildPath;
  75. UnZipAllFiles(ArchiveFile);
  76. Finally
  77. Free;
  78. end;
  79. end;
  80. function TUnzipArchive.Execute(const Args:TActionArgs):boolean;
  81. begin
  82. {$warning TODO Check arguments}
  83. UnzipArchive;
  84. result:=true;
  85. end;
  86. { TCreateArchive }
  87. procedure TCreateArchive.CreateArchive;
  88. var
  89. P : TFPPackage;
  90. PS : TFPPackages;
  91. X : TFPXMLRepositoryHandler;
  92. i : integer;
  93. begin
  94. if assigned(CurrentPackage) then
  95. Error(SErrOnlyLocalDir);
  96. { Generate manifest.xml if it doesn't exists yet }
  97. if not FileExists(PackageManifestFile) then
  98. ExecuteAction(CurrentPackage,'fpmakemanifest');
  99. PS:=TFPPackages.Create(TFPPackage);
  100. X:=TFPXMLRepositoryHandler.Create;
  101. With X do
  102. try
  103. LoadFromXml(PS,PackageManifestFile);
  104. finally
  105. Free;
  106. end;
  107. for i:=0 to PS.Count-1 do
  108. begin
  109. P:=PS[i];
  110. Writeln(P.Name);
  111. Writeln(P.FileName);
  112. end;
  113. end;
  114. function TCreateArchive.Execute(const Args: TActionArgs): boolean;
  115. begin
  116. CreateArchive;
  117. Result:=true;
  118. end;
  119. initialization
  120. RegisterPkgHandler('unziparchive',TUnzipArchive);
  121. RegisterPkgHandler('createarchive',TCreateArchive);
  122. end.