pkgcommands.pp 10 KB

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