pkgcommands.pp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  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. { TCommandShowAll }
  27. TCommandShowAll = Class(TPackagehandler)
  28. Public
  29. Function Execute(const Args:TActionArgs):boolean;override;
  30. end;
  31. { TCommandShowAvail }
  32. TCommandShowAvail = 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. { TCommandClean }
  67. TCommandClean = Class(TPackagehandler)
  68. Public
  69. Function Execute(const Args:TActionArgs):boolean;override;
  70. end;
  71. { TCommandArchive }
  72. TCommandArchive = Class(TPackagehandler)
  73. Public
  74. Function Execute(const Args:TActionArgs):boolean;override;
  75. end;
  76. { TCommandInstallDependencies }
  77. TCommandInstallDependencies = Class(TPackagehandler)
  78. Public
  79. Function Execute(const Args:TActionArgs):boolean;override;
  80. end;
  81. function TCommandAddConfig.Execute(const Args:TActionArgs):boolean;
  82. begin
  83. {
  84. Log(vlInfo,SLogGeneratingCompilerConfig,[S]);
  85. Options.InitCompilerDefaults(Args[2]);
  86. Options.SaveCompilerToFile(S);
  87. }
  88. Result:=true;
  89. end;
  90. function TCommandUpdate.Execute(const Args:TActionArgs):boolean;
  91. var
  92. PackagesURL : String;
  93. begin
  94. // Download mirrors.xml
  95. Log(vlCommands,SLogDownloading,[GlobalOptions.RemoteMirrorsURL,GlobalOptions.LocalMirrorsFile]);
  96. DownloadFile(GlobalOptions.RemoteMirrorsURL,GlobalOptions.LocalMirrorsFile);
  97. LoadLocalMirrors;
  98. // Download packages.xml
  99. PackagesURL:=GetRemoteRepositoryURL(PackagesFileName);
  100. Log(vlCommands,SLogDownloading,[PackagesURL,GlobalOptions.LocalPackagesFile]);
  101. DownloadFile(PackagesURL,GlobalOptions.LocalPackagesFile);
  102. // Read the repository again
  103. LoadLocalRepository;
  104. // no need to log errors again
  105. FindInstalledPackages(CompilerOptions,False);
  106. Result:=true;
  107. end;
  108. function TCommandShowAll.Execute(const Args:TActionArgs):boolean;
  109. begin
  110. ListLocalRepository(true);
  111. Result:=true;
  112. end;
  113. function TCommandShowAvail.Execute(const Args:TActionArgs):boolean;
  114. begin
  115. ListLocalRepository(false);
  116. Result:=true;
  117. end;
  118. function TCommandScanPackages.Execute(const Args:TActionArgs):boolean;
  119. begin
  120. RebuildRemoteRepository;
  121. ListRemoteRepository;
  122. SaveRemoteRepository;
  123. Result:=true;
  124. end;
  125. function TCommandDownload.Execute(const Args:TActionArgs):boolean;
  126. begin
  127. if not assigned(CurrentPackage) then
  128. Error(SErrNoPackageSpecified);
  129. if not FileExists(PackageLocalArchive) then
  130. ExecuteAction(CurrentPackage,'downloadpackage',Args);
  131. Result:=true;
  132. end;
  133. function TCommandUnzip.Execute(const Args:TActionArgs):boolean;
  134. Var
  135. BuildDir : string;
  136. ArchiveFile : String;
  137. begin
  138. BuildDir:=PackageBuildPath;
  139. ArchiveFile:=PackageLocalArchive;
  140. if not assigned(CurrentPackage) then
  141. Error(SErrNoPackageSpecified);
  142. if not FileExists(ArchiveFile) then
  143. ExecuteAction(CurrentPackage,'downloadpackage');
  144. { Create builddir, remove it first if needed }
  145. if DirectoryExists(BuildDir) then
  146. DeleteDir(BuildDir);
  147. ForceDirectories(BuildDir);
  148. SetCurrentDir(BuildDir);
  149. { Unzip Archive }
  150. With TUnZipper.Create do
  151. try
  152. Log(vlCommands,SLogUnzippping,[ArchiveFile]);
  153. OutputPath:=PackageBuildPath;
  154. UnZipAllFiles(ArchiveFile);
  155. Finally
  156. Free;
  157. end;
  158. Result:=true;
  159. end;
  160. function TCommandCompile.Execute(const Args:TActionArgs):boolean;
  161. begin
  162. if assigned(CurrentPackage) then
  163. begin
  164. // For local files we need the information inside the zip to get the
  165. // dependencies
  166. if CurrentPackage.IsLocalPackage then
  167. begin
  168. ExecuteAction(CurrentPackage,'unzip',Args);
  169. ExecuteAction(CurrentPackage,'installdependencies',Args);
  170. end
  171. else
  172. begin
  173. ExecuteAction(CurrentPackage,'installdependencies',Args);
  174. ExecuteAction(CurrentPackage,'unzip',Args);
  175. end;
  176. end;
  177. ExecuteAction(CurrentPackage,'fpmakecompile',Args);
  178. Result:=true;
  179. end;
  180. function TCommandBuild.Execute(const Args:TActionArgs):boolean;
  181. begin
  182. if assigned(CurrentPackage) then
  183. begin
  184. // For local files we need the information inside the zip to get the
  185. // dependencies
  186. if CurrentPackage.IsLocalPackage then
  187. begin
  188. ExecuteAction(CurrentPackage,'unzip',Args);
  189. ExecuteAction(CurrentPackage,'installdependencies',Args);
  190. end
  191. else
  192. begin
  193. ExecuteAction(CurrentPackage,'installdependencies',Args);
  194. ExecuteAction(CurrentPackage,'unzip',Args);
  195. end;
  196. end;
  197. ExecuteAction(CurrentPackage,'fpmakebuild',Args);
  198. Result:=true;
  199. end;
  200. function TCommandInstall.Execute(const Args:TActionArgs):boolean;
  201. begin
  202. if assigned(CurrentPackage) then
  203. ExecuteAction(CurrentPackage,'build',Args);
  204. ExecuteAction(CurrentPackage,'fpmakeinstall',Args);
  205. // Update local status file
  206. if assigned(CurrentPackage) then
  207. CurrentPackage.InstalledVersion.Assign(CurrentPackage.Version);
  208. Result:=true;
  209. end;
  210. function TCommandClean.Execute(const Args:TActionArgs):boolean;
  211. begin
  212. ExecuteAction(CurrentPackage,'fpmakeclean',Args);
  213. Result:=true;
  214. end;
  215. function TCommandArchive.Execute(const Args:TActionArgs):boolean;
  216. begin
  217. ExecuteAction(CurrentPackage,'fpmakearchive',Args);
  218. Result:=true;
  219. end;
  220. function TCommandInstallDependencies.Execute(const Args:TActionArgs):boolean;
  221. var
  222. i : Integer;
  223. MissingDependency,
  224. D : TFPDependency;
  225. P,
  226. DepPackage : TFPPackage;
  227. L : TStringList;
  228. status : string;
  229. begin
  230. if not assigned(CurrentPackage) then
  231. Error(SErrNoPackageSpecified);
  232. // Load dependencies for local packages
  233. if CurrentPackage.IsLocalPackage then
  234. begin
  235. ExecuteAction(CurrentPackage,'fpmakemanifest',Args);
  236. P:=LoadPackageManifest(ManifestFileName);
  237. // Update CurrentPackage
  238. CurrentPackage.Assign(P);
  239. CurrentPackage.IsLocalPackage:=true;
  240. end;
  241. // Find and List dependencies
  242. MissingDependency:=nil;
  243. L:=TStringList.Create;
  244. for i:=0 to CurrentPackage.Dependencies.Count-1 do
  245. begin
  246. D:=CurrentPackage.Dependencies[i];
  247. if (CompilerOptions.CompilerOS in D.OSes) and
  248. (CompilerOptions.CompilerCPU in D.CPUs) then
  249. begin
  250. DepPackage:=CurrentRepository.PackageByName(D.PackageName);
  251. // Need installation?
  252. if (DepPackage.InstalledVersion.Empty) or
  253. (DepPackage.InstalledVersion.CompareVersion(D.MinVersion)<0) then
  254. begin
  255. if DepPackage.Version.CompareVersion(D.MinVersion)<0 then
  256. begin
  257. status:='Not Available!';
  258. MissingDependency:=D;
  259. end
  260. else
  261. begin
  262. status:='Updating';
  263. L.Add(DepPackage.Name);
  264. end;
  265. end
  266. else
  267. status:='OK';
  268. Log(vlInfo,SLogPackageDependency,
  269. [D.PackageName,D.MinVersion.AsString,DepPackage.InstalledVersion.AsString,DepPackage.Version.AsString,status]);
  270. end
  271. else
  272. Log(vlDebug,SDbgPackageDependencyOtherTarget,[D.PackageName,MakeTargetString(CompilerOptions.CompilerCPU,CompilerOptions.CompilerOS)]);
  273. end;
  274. // Give error on first missing dependency
  275. if assigned(MissingDependency) then
  276. Error(SErrNoPackageAvailable,[MissingDependency.PackageName,MissingDependency.MinVersion.AsString]);
  277. // Install needed updates
  278. for i:=0 to L.Count-1 do
  279. begin
  280. DepPackage:=CurrentRepository.PackageByName(L[i]);
  281. ExecuteAction(DepPackage,'install');
  282. end;
  283. FreeAndNil(L);
  284. Result:=true;
  285. end;
  286. initialization
  287. RegisterPkgHandler('update',TCommandUpdate);
  288. RegisterPkgHandler('showall',TCommandShowAll);
  289. RegisterPkgHandler('showavail',TCommandShowAvail);
  290. RegisterPkgHandler('scan',TCommandScanPackages);
  291. RegisterPkgHandler('download',TCommandDownload);
  292. RegisterPkgHandler('unzip',TCommandUnzip);
  293. RegisterPkgHandler('compile',TCommandCompile);
  294. RegisterPkgHandler('build',TCommandBuild);
  295. RegisterPkgHandler('install',TCommandInstall);
  296. RegisterPkgHandler('clean',TCommandClean);
  297. RegisterPkgHandler('archive',TCommandArchive);
  298. RegisterPkgHandler('installdependencies',TCommandInstallDependencies);
  299. end.