pkgcommands.pp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. unit pkgcommands;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,pkghandler;
  6. implementation
  7. uses
  8. zipper,
  9. pkgmessages,
  10. pkgglobals,
  11. pkgoptions,
  12. pkgdownload,
  13. pkgrepos,
  14. fprepos;
  15. type
  16. { TCommandAddConfig }
  17. TCommandAddConfig = Class(TPackagehandler)
  18. Public
  19. Function Execute(const Args:TActionArgs):boolean;override;
  20. end;
  21. { TCommandUpdate }
  22. TCommandUpdate = Class(TPackagehandler)
  23. Public
  24. Function Execute(const Args:TActionArgs):boolean;override;
  25. end;
  26. { TCommandAllAvail }
  27. TCommandAllAvail = Class(TPackagehandler)
  28. Public
  29. Function Execute(const Args:TActionArgs):boolean;override;
  30. end;
  31. { TCommandAvail }
  32. TCommandAvail = Class(TPackagehandler)
  33. Public
  34. Function Execute(const Args:TActionArgs):boolean;override;
  35. end;
  36. { TCommandScanPackages }
  37. TCommandScanPackages = Class(TPackagehandler)
  38. Public
  39. Function Execute(const Args:TActionArgs):boolean;override;
  40. end;
  41. { TCommandDownload }
  42. TCommandDownload = Class(TPackagehandler)
  43. Public
  44. Function Execute(const Args:TActionArgs):boolean;override;
  45. end;
  46. { TCommandUnzip }
  47. TCommandUnzip = Class(TPackagehandler)
  48. Public
  49. Function Execute(const Args:TActionArgs):boolean;override;
  50. end;
  51. { TCommandCompile }
  52. TCommandCompile = Class(TPackagehandler)
  53. Public
  54. Function Execute(const Args:TActionArgs):boolean;override;
  55. end;
  56. { TCommandBuild }
  57. TCommandBuild = Class(TPackagehandler)
  58. Public
  59. Function Execute(const Args:TActionArgs):boolean;override;
  60. end;
  61. { TCommandInstall }
  62. TCommandInstall = Class(TPackagehandler)
  63. Public
  64. Function Execute(const Args:TActionArgs):boolean;override;
  65. end;
  66. { TCommandArchive }
  67. TCommandArchive = Class(TPackagehandler)
  68. Public
  69. Function Execute(const Args:TActionArgs):boolean;override;
  70. end;
  71. { TCommandInstallDependencies }
  72. TCommandInstallDependencies = Class(TPackagehandler)
  73. Public
  74. Function Execute(const Args:TActionArgs):boolean;override;
  75. end;
  76. function TCommandAddConfig.Execute(const Args:TActionArgs):boolean;
  77. begin
  78. {
  79. Log(vInfo,SLogGeneratingCompilerConfig,[S]);
  80. Options.InitCompilerDefaults(Args[2]);
  81. Options.SaveCompilerToFile(S);
  82. }
  83. Result:=true;
  84. end;
  85. function TCommandUpdate.Execute(const Args:TActionArgs):boolean;
  86. begin
  87. Log(vCommands,SLogDownloading,[Options.RemotePackagesFile,Options.LocalPackagesFile]);
  88. DownloadFile(Options.RemotePackagesFile,Options.LocalPackagesFile);
  89. // Read the repository again
  90. LoadLocalRepository;
  91. LoadLocalStatus;
  92. Result:=true;
  93. end;
  94. function TCommandAllAvail.Execute(const Args:TActionArgs):boolean;
  95. begin
  96. ListLocalRepository(true);
  97. Result:=true;
  98. end;
  99. function TCommandAvail.Execute(const Args:TActionArgs):boolean;
  100. begin
  101. ListLocalRepository(false);
  102. Result:=true;
  103. end;
  104. function TCommandScanPackages.Execute(const Args:TActionArgs):boolean;
  105. begin
  106. RebuildRemoteRepository;
  107. ListRemoteRepository;
  108. SaveRemoteRepository;
  109. Result:=true;
  110. end;
  111. function TCommandDownload.Execute(const Args:TActionArgs):boolean;
  112. begin
  113. if not assigned(CurrentPackage) then
  114. Error(SErrNoPackageSpecified);
  115. if not FileExists(PackageLocalArchive) then
  116. ExecuteAction(CurrentPackage,'downloadpackage',Args);
  117. Result:=true;
  118. end;
  119. function TCommandUnzip.Execute(const Args:TActionArgs):boolean;
  120. Var
  121. BuildDir : string;
  122. ArchiveFile : String;
  123. begin
  124. BuildDir:=PackageBuildPath;
  125. ArchiveFile:=PackageLocalArchive;
  126. if not assigned(CurrentPackage) then
  127. Error(SErrNoPackageSpecified);
  128. if not FileExists(ArchiveFile) then
  129. ExecuteAction(CurrentPackage,'downloadpackage');
  130. { Create builddir, remove it first if needed }
  131. if DirectoryExists(BuildDir) then
  132. DeleteDir(BuildDir);
  133. ForceDirectories(BuildDir);
  134. SetCurrentDir(BuildDir);
  135. { Unzip Archive }
  136. With TUnZipper.Create do
  137. try
  138. Log(vCommands,SLogUnzippping,[ArchiveFile]);
  139. OutputPath:=PackageBuildPath;
  140. UnZipAllFiles(ArchiveFile);
  141. Finally
  142. Free;
  143. end;
  144. Result:=true;
  145. end;
  146. function TCommandCompile.Execute(const Args:TActionArgs):boolean;
  147. begin
  148. if assigned(CurrentPackage) then
  149. begin
  150. ExecuteAction(CurrentPackage,'installdependencies',Args);
  151. ExecuteAction(CurrentPackage,'unzip',Args);
  152. end;
  153. ExecuteAction(CurrentPackage,'fpmakecompile',Args);
  154. Result:=true;
  155. end;
  156. function TCommandBuild.Execute(const Args:TActionArgs):boolean;
  157. begin
  158. if assigned(CurrentPackage) then
  159. begin
  160. ExecuteAction(CurrentPackage,'installdependencies',Args);
  161. ExecuteAction(CurrentPackage,'unzip',Args);
  162. end;
  163. ExecuteAction(CurrentPackage,'fpmakebuild',Args);
  164. Result:=true;
  165. end;
  166. function TCommandInstall.Execute(const Args:TActionArgs):boolean;
  167. begin
  168. if assigned(CurrentPackage) then
  169. ExecuteAction(CurrentPackage,'build',Args);
  170. ExecuteAction(CurrentPackage,'fpmakeinstall',Args);
  171. // Update local status file
  172. if assigned(CurrentPackage) then
  173. begin
  174. CurrentPackage.InstalledVersion.Assign(CurrentPackage.Version);
  175. SaveLocalStatus;
  176. end;
  177. Result:=true;
  178. end;
  179. function TCommandArchive.Execute(const Args:TActionArgs):boolean;
  180. begin
  181. ExecuteAction(CurrentPackage,'fpmakearchive',Args);
  182. Result:=true;
  183. end;
  184. function TCommandInstallDependencies.Execute(const Args:TActionArgs):boolean;
  185. var
  186. i : Integer;
  187. D : TFPDependency;
  188. DepPackage : TFPPackage;
  189. L : TStringList;
  190. status : string;
  191. begin
  192. if not assigned(CurrentPackage) then
  193. Error(SErrNoPackageSpecified);
  194. // List dependencies
  195. L:=TStringList.Create;
  196. for i:=0 to CurrentPackage.Dependencies.Count-1 do
  197. begin
  198. D:=CurrentPackage.Dependencies[i];
  199. DepPackage:=CurrentRepository.PackageByName(D.PackageName);
  200. // Need installation?
  201. if (DepPackage.InstalledVersion.Empty) or
  202. (DepPackage.InstalledVersion.CompareVersion(D.MinVersion)<0) then
  203. begin
  204. if DepPackage.Version.CompareVersion(D.MinVersion)<0 then
  205. status:='Not Available!'
  206. else
  207. status:='Updating';
  208. L.Add(DepPackage.Name);
  209. end
  210. else
  211. status:='OK';
  212. Log(vDebug,'Dependency on package %s %s, installed %s, available %s (%s)',
  213. [D.PackageName,D.MinVersion.AsString,DepPackage.InstalledVersion.AsString,DepPackage.Version.AsString,status]);
  214. end;
  215. // Install needed updates
  216. for i:=0 to L.Count-1 do
  217. begin
  218. DepPackage:=CurrentRepository.PackageByName(L[i]);
  219. if DepPackage.Version.CompareVersion(D.MinVersion)<0 then
  220. Error(SErrNoPackageAvailable,[D.PackageName,D.MinVersion.AsString]);
  221. ExecuteAction(DepPackage,'install');
  222. end;
  223. FreeAndNil(L);
  224. Result:=true;
  225. end;
  226. initialization
  227. RegisterPkgHandler('update',TCommandUpdate);
  228. RegisterPkgHandler('allavail',TCommandAllAvail);
  229. RegisterPkgHandler('avail',TCommandAvail);
  230. RegisterPkgHandler('scan',TCommandScanPackages);
  231. RegisterPkgHandler('download',TCommandDownload);
  232. RegisterPkgHandler('unzip',TCommandUnzip);
  233. RegisterPkgHandler('compile',TCommandCompile);
  234. RegisterPkgHandler('build',TCommandBuild);
  235. RegisterPkgHandler('install',TCommandInstall);
  236. RegisterPkgHandler('archive',TCommandArchive);
  237. RegisterPkgHandler('installdependencies',TCommandInstallDependencies);
  238. end.