pkgcommands.pp 9.7 KB

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