pkghandler.pp 5.7 KB

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