pkghandler.pp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. {$mode objfpc}
  2. {$h+}
  3. unit pkghandler;
  4. interface
  5. uses
  6. Classes,SysUtils,
  7. pkgglobals,
  8. pkgoptions,
  9. fprepos;
  10. type
  11. { TPackageHandler }
  12. TPackageHandler = Class(TComponent)
  13. private
  14. FPackageName : string;
  15. Protected
  16. Procedure Log(Level: TLogLevel;Msg : String);
  17. Procedure Log(Level: TLogLevel;Fmt : String; const Args : array of const);
  18. Procedure Error(Msg : String);
  19. Procedure Error(Fmt : String; const Args : array of const);
  20. Function ExecuteProcess(Const Prog,Args:String):Integer;
  21. Procedure SetCurrentDir(Const ADir:String);
  22. Public
  23. Constructor Create(AOwner:TComponent;const APackageName:string); virtual;
  24. function PackageLogPrefix:String;
  25. procedure ExecuteAction(const APackageName,AAction:string);
  26. procedure Execute; virtual; abstract;
  27. Property PackageName:string Read FPackageName;
  28. end;
  29. TPackageHandlerClass = class of TPackageHandler;
  30. EPackageHandler = Class(Exception);
  31. // Actions/PkgHandler
  32. procedure RegisterPkgHandler(const AAction:string;pkghandlerclass:TPackageHandlerClass);
  33. function GetPkgHandler(const AAction:string):TPackageHandlerClass;
  34. procedure ExecuteAction(const APackageName,AAction:string);
  35. function PackageBuildPath(APackage:TFPPackage):String;
  36. function PackageRemoteArchive(APackage:TFPPackage): String;
  37. function PackageLocalArchive(APackage:TFPPackage): String;
  38. function PackageManifestFile(APackage:TFPPackage): String;
  39. Implementation
  40. uses
  41. typinfo,
  42. contnrs,
  43. uriparser,
  44. pkgrepos,
  45. pkgmessages;
  46. var
  47. PkgHandlerList : TFPHashList;
  48. ExecutedActions : TFPHashList;
  49. procedure RegisterPkgHandler(const AAction:string;pkghandlerclass:TPackageHandlerClass);
  50. begin
  51. if PkgHandlerList.Find(AAction)<>nil then
  52. begin
  53. Raise EPackageHandler.CreateFmt(SErrActionAlreadyRegistered,[AAction]);
  54. exit;
  55. end;
  56. PkgHandlerList.Add(AAction,pkghandlerclass);
  57. end;
  58. function GetPkgHandler(const AAction:string):TPackageHandlerClass;
  59. begin
  60. result:=TPackageHandlerClass(PkgHandlerList.Find(AAction));
  61. if result=nil then
  62. Raise EPackageHandler.CreateFmt(SErrActionNotFound,[AAction]);
  63. end;
  64. procedure ExecuteAction(const APackageName,AAction:string);
  65. var
  66. pkghandlerclass : TPackageHandlerClass;
  67. FullActionName : string;
  68. begin
  69. // Check if we have already executed or are executing the action
  70. FullActionName:=APackageName+AAction;
  71. if ExecutedActions.Find(FullActionName)<>nil then
  72. begin
  73. Log(vlDebug,'Already executed or executing action '+FullActionName);
  74. exit;
  75. end;
  76. ExecutedActions.Add(FullActionName,Pointer(PtrUInt(1)));
  77. // Create action handler class
  78. pkghandlerclass:=GetPkgHandler(AAction);
  79. With pkghandlerclass.Create(nil,APackageName) do
  80. try
  81. Log(vlDebug,SLogRunAction+' start',[AAction]);
  82. Execute;
  83. Log(vlDebug,SLogRunAction+' end',[AAction]);
  84. finally
  85. Free;
  86. end;
  87. end;
  88. function PackageBuildPath(APackage:TFPPackage):String;
  89. begin
  90. if APackage.Name=CurrentDirPackageName then
  91. Result:='.'
  92. else if APackage.Name=CmdLinePackageName then
  93. Result:=GlobalOptions.BuildDir+ChangeFileExt(ExtractFileName(APackage.LocalFileName),'')
  94. else
  95. Result:=GlobalOptions.BuildDir+APackage.Name;
  96. end;
  97. function PackageRemoteArchive(APackage:TFPPackage): String;
  98. begin
  99. if APackage.Name=CurrentDirPackageName then
  100. Error(SErrNoPackageSpecified)
  101. else if APackage.Name=CmdLinePackageName then
  102. Error(SErrPackageIsLocal);
  103. if APackage.DownloadURL<>'' then
  104. Result:=APackage.DownloadURL
  105. else
  106. Result:=GetRemoteRepositoryURL(APackage.FileName);
  107. end;
  108. function PackageLocalArchive(APackage:TFPPackage): String;
  109. begin
  110. if APackage.Name=CurrentDirPackageName then
  111. Error(SErrNoPackageSpecified)
  112. else if APackage.Name=CmdLinePackageName then
  113. Result:=APackage.LocalFileName
  114. else
  115. Result:=GlobalOptions.ArchivesDir+APackage.FileName;
  116. end;
  117. function PackageManifestFile(APackage:TFPPackage): String;
  118. begin
  119. Result:=ManifestFileName;
  120. end;
  121. { TPackageHandler }
  122. constructor TPackageHandler.Create(AOwner:TComponent;const APackageName:string);
  123. begin
  124. inherited Create(AOwner);
  125. FPackageName:=APackageName;
  126. end;
  127. Function TPackageHandler.ExecuteProcess(Const Prog,Args:String):Integer;
  128. begin
  129. Log(vlCommands,SLogExecute,[Prog,Args]);
  130. Result:=SysUtils.ExecuteProcess(Prog,Args);
  131. end;
  132. Procedure TPackageHandler.SetCurrentDir(Const ADir:String);
  133. begin
  134. Log(vlCommands,SLogChangeDir,[ADir]);
  135. if not SysUtils.SetCurrentDir(ADir) then
  136. Error(SErrChangeDirFailed,[ADir]);
  137. end;
  138. function TPackageHandler.PackageLogPrefix:String;
  139. begin
  140. if PackageName<>'' then
  141. Result:='['+PackageName+'] '
  142. else
  143. Result:='';
  144. end;
  145. procedure TPackageHandler.ExecuteAction(const APackageName,AAction:string);
  146. begin
  147. // Needed to override TComponent.ExecuteAction method
  148. pkghandler.ExecuteAction(APackageName,AAction);
  149. end;
  150. Procedure TPackageHandler.Log(Level:TLogLevel; Msg:String);
  151. begin
  152. pkgglobals.Log(Level,PackageLogPrefix+Msg);
  153. end;
  154. Procedure TPackageHandler.Log(Level:TLogLevel; Fmt:String; const Args:array of const);
  155. begin
  156. pkgglobals.Log(Level,PackageLogPrefix+Fmt,Args);
  157. end;
  158. Procedure TPackageHandler.Error(Msg:String);
  159. begin
  160. pkgglobals.Error(PackageLogPrefix+Msg);
  161. end;
  162. Procedure TPackageHandler.Error(Fmt:String; const Args:array of const);
  163. begin
  164. pkgglobals.Error(PackageLogPrefix+Fmt,Args);
  165. end;
  166. initialization
  167. PkgHandlerList:=TFPHashList.Create;
  168. ExecutedActions:=TFPHashList.Create;
  169. finalization
  170. FreeAndNil(PkgHandlerList);
  171. FreeAndNil(ExecutedActions);
  172. end.