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