pkgpackagesstructure.pp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. unit pkgPackagesStructure;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes,
  6. SysUtils,
  7. fprepos,
  8. fpxmlrep,
  9. pkgoptions;
  10. type
  11. { TFPRemotePackagesStructure }
  12. TFPRemotePackagesStructure = class(TFPCustomPackagesStructure)
  13. public
  14. class function GetRepositoryOptionSectionClass: TFppkgRepositoryOptionSectionClass; override;
  15. function UnzipBeforeUse: Boolean; override;
  16. function AddPackagesToRepository(ARepository: TFPRepository): Boolean; override;
  17. end;
  18. { TFPCustomFileSystemPackagesStructure }
  19. TFPCustomFileSystemPackagesStructure = class(TFPCustomPackagesStructure)
  20. private
  21. FPath: string;
  22. protected
  23. function GetPath: string; virtual;
  24. procedure SetPath(AValue: string); virtual;
  25. procedure AddPackageToRepository(ARepository: TFPRepository; APackageName: string; APackageFilename: string);
  26. public
  27. property Path: string read GetPath write SetPath;
  28. end;
  29. { TFPInstalledPackagesStructure }
  30. TFPInstalledPackagesStructure = class(TFPCustomFileSystemPackagesStructure)
  31. private
  32. FPrefix: string;
  33. public
  34. class function GetRepositoryOptionSectionClass: TFppkgRepositoryOptionSectionClass; override;
  35. procedure InitializeWithOptions(ARepoOptionSection: TFppkgRepositoryOptionSection; AnOptions: TFppkgOptions; ACompilerOptions: TCompilerOptions); override;
  36. function AddPackagesToRepository(ARepository: TFPRepository): Boolean; override;
  37. function GetUnitDirectory(APackage: TFPPackage): string; override;
  38. function GetPrefix: string; override;
  39. function GetBaseInstallDir: string; override;
  40. // The prefix is used on installing packages
  41. property Prefix: string read FPrefix write FPrefix;
  42. end;
  43. { TFPCurrentDirectoryPackagesStructure }
  44. TFPCurrentDirectoryPackagesStructure = class(TFPCustomFileSystemPackagesStructure)
  45. protected
  46. procedure SetPath(AValue: string); override;
  47. public
  48. function AddPackagesToRepository(ARepository: TFPRepository): Boolean; override;
  49. function GetBuildPathDirectory(APackage: TFPPackage): string; override;
  50. end;
  51. { TFPArchiveFilenamePackagesStructure }
  52. TFPArchiveFilenamePackagesStructure = class(TFPCustomPackagesStructure)
  53. private
  54. FArchiveFileName: string;
  55. public
  56. function AddPackagesToRepository(ARepository: TFPRepository): Boolean; override;
  57. function UnzipBeforeUse: Boolean; override;
  58. property ArchiveFileName: string read FArchiveFileName write FArchiveFileName;
  59. end;
  60. { TFPOriginalSourcePackagesStructure }
  61. TFPOriginalSourcePackagesStructure = class(TFPCustomPackagesStructure)
  62. private
  63. FOriginalRepository: TFPRepository;
  64. public
  65. constructor Create(AOwner: TComponent; OriginalRepository: TFPRepository);
  66. function AddPackagesToRepository(ARepository: TFPRepository): Boolean; override;
  67. function GetBuildPathDirectory(APackage: TFPPackage): string; override;
  68. end;
  69. { TFPTemporaryDirectoryPackagesStructure }
  70. TFPTemporaryDirectoryPackagesStructure = class(TFPCustomFileSystemPackagesStructure)
  71. private
  72. FPackage: TFPPackage;
  73. function GetTempPackageName: string;
  74. procedure SetTempPackageName(AValue: string);
  75. public
  76. function AddPackagesToRepository(ARepository: TFPRepository): Boolean; override;
  77. function GetBuildPathDirectory(APackage: TFPPackage): string; override;
  78. procedure SetTempPath(APath: string);
  79. property TempPackageName: string read GetTempPackageName write SetTempPackageName;
  80. end;
  81. implementation
  82. uses
  83. fpmkunit,
  84. pkgmessages,
  85. pkgrepos,
  86. pkgglobals;
  87. { TFPArchiveFilenamePackagesStructure }
  88. function TFPArchiveFilenamePackagesStructure.AddPackagesToRepository(ARepository: TFPRepository): Boolean;
  89. var
  90. Package: TFPPackage;
  91. begin
  92. Result := True;
  93. Package := ARepository.AddPackage(CmdLinePackageName);
  94. Package.LocalFileName := FArchiveFileName;
  95. Package.PackagesStructure := Self;
  96. end;
  97. function TFPArchiveFilenamePackagesStructure.UnzipBeforeUse: Boolean;
  98. begin
  99. Result := True;
  100. end;
  101. { TFPCustomFileSystemPackagesStructure }
  102. function TFPCustomFileSystemPackagesStructure.GetPath: string;
  103. begin
  104. Result := FPath;
  105. end;
  106. procedure TFPCustomFileSystemPackagesStructure.SetPath(AValue: string);
  107. begin
  108. FPath := AValue;
  109. end;
  110. procedure TFPCustomFileSystemPackagesStructure.AddPackageToRepository(ARepository: TFPRepository; APackageName: string; APackageFilename: string);
  111. var
  112. P: TFPPackage;
  113. begin
  114. P:=ARepository.AddPackage(APackageName);
  115. try
  116. P.LoadUnitConfigFromFile(APackageFilename);
  117. P.PackagesStructure:=Self;
  118. log(llDebug,SLogFoundPackageInFile,[P.Name, APackageFilename]);
  119. if P.IsFPMakeAddIn then
  120. AddFPMakeAddIn(P);
  121. except
  122. on E: Exception do
  123. begin
  124. log(llWarning,SLogFailedLoadingPackage,[APackageName, APackageFilename, E.Message]);
  125. P.Free;
  126. end;
  127. end;
  128. end;
  129. { TFPTemporaryDirectoryPackagesStructure }
  130. function TFPTemporaryDirectoryPackagesStructure.GetTempPackageName: string;
  131. begin
  132. Result := FPackage.Name;
  133. end;
  134. procedure TFPTemporaryDirectoryPackagesStructure.SetTempPackageName(AValue: string);
  135. begin
  136. FPackage.Name := AValue;
  137. end;
  138. function TFPTemporaryDirectoryPackagesStructure.AddPackagesToRepository(ARepository: TFPRepository): Boolean;
  139. begin
  140. Result := True;
  141. FPackage := ARepository.AddPackage('');
  142. FPackage.PackagesStructure := Self;
  143. end;
  144. function TFPTemporaryDirectoryPackagesStructure.GetBuildPathDirectory(APackage: TFPPackage): string;
  145. begin
  146. Result := FPath;
  147. end;
  148. procedure TFPTemporaryDirectoryPackagesStructure.SetTempPath(APath: string);
  149. begin
  150. FPath := APath;
  151. end;
  152. { TFPOriginalSourcePackagesStructure }
  153. constructor TFPOriginalSourcePackagesStructure.Create(AOwner: TComponent;
  154. OriginalRepository: TFPRepository);
  155. begin
  156. inherited Create(Owner);
  157. FOriginalRepository := OriginalRepository;
  158. end;
  159. function TFPOriginalSourcePackagesStructure.AddPackagesToRepository(
  160. ARepository: TFPRepository): Boolean;
  161. var
  162. i: Integer;
  163. OrgPackage: TFPPackage;
  164. P: TFPPackage;
  165. begin
  166. Result := True;
  167. for i := 0 to FOriginalRepository.PackageCount -1 do
  168. begin
  169. OrgPackage := FOriginalRepository.Packages[i];
  170. if (OrgPackage.SourcePath<>'') and DirectoryExists(OrgPackage.SourcePath) then
  171. begin
  172. P:=ARepository.AddPackage(OrgPackage.Name);
  173. P.PackagesStructure:=Self;
  174. P.Assign(OrgPackage);
  175. end;
  176. end;
  177. end;
  178. function TFPOriginalSourcePackagesStructure.GetBuildPathDirectory(
  179. APackage: TFPPackage): string;
  180. begin
  181. Result:=APackage.SourcePath;
  182. end;
  183. { TFPCurrentDirectoryPackagesStructure }
  184. procedure TFPCurrentDirectoryPackagesStructure.SetPath(AValue: string);
  185. begin
  186. if AValue = '' then
  187. AValue := GetCurrentDir;
  188. inherited SetPath(AValue);
  189. end;
  190. function TFPCurrentDirectoryPackagesStructure.AddPackagesToRepository(
  191. ARepository: TFPRepository): Boolean;
  192. var
  193. Package: TFPPackage;
  194. begin
  195. Result := True;
  196. Package := ARepository.AddPackage(CurrentDirPackageName);
  197. Package.PackagesStructure := Self;
  198. end;
  199. function TFPCurrentDirectoryPackagesStructure.GetBuildPathDirectory(APackage: TFPPackage): string;
  200. begin
  201. Result := FPath;
  202. end;
  203. { TFPRemotePackagesStructure }
  204. class function TFPRemotePackagesStructure.GetRepositoryOptionSectionClass: TFppkgRepositoryOptionSectionClass;
  205. begin
  206. Result := nil;
  207. end;
  208. function TFPRemotePackagesStructure.UnzipBeforeUse: Boolean;
  209. begin
  210. Result := True;
  211. end;
  212. function TFPRemotePackagesStructure.AddPackagesToRepository(ARepository: TFPRepository): Boolean;
  213. var
  214. S : String;
  215. X : TFPXMLRepositoryHandler;
  216. i: Integer;
  217. begin
  218. Result := True;
  219. // Repository
  220. S:=FOptions.GlobalSection.LocalPackagesFile;
  221. log(llDebug,SLogLoadingPackagesFile,[S]);
  222. if not FileExists(S) then
  223. exit;
  224. try
  225. X:=TFPXMLRepositoryHandler.Create;
  226. With X do
  227. try
  228. LoadFromXml(ARepository,S);
  229. finally
  230. Free;
  231. end;
  232. for i := 0 to ARepository.PackageCount -1 do
  233. ARepository.Packages[i].PackagesStructure := Self;
  234. except
  235. on E : Exception do
  236. begin
  237. Log(llError,E.Message);
  238. Error(SErrCorruptPackagesFile,[S]);
  239. end;
  240. end;
  241. end;
  242. { TFPInstalledPackagesStructure }
  243. class function TFPInstalledPackagesStructure.GetRepositoryOptionSectionClass: TFppkgRepositoryOptionSectionClass;
  244. begin
  245. Result := TFppkgRepositoryOptionSection;
  246. end;
  247. procedure TFPInstalledPackagesStructure.InitializeWithOptions(
  248. ARepoOptionSection: TFppkgRepositoryOptionSection; AnOptions: TFppkgOptions;
  249. ACompilerOptions: TCompilerOptions);
  250. var
  251. RepoOptSection: TFppkgRepositoryOptionSection;
  252. begin
  253. inherited InitializeWithOptions(ARepoOptionSection, AnOptions, ACompilerOptions);
  254. RepoOptSection := ARepoOptionSection as TFppkgRepositoryOptionSection;
  255. Prefix := RepoOptSection.Prefix;
  256. InstallRepositoryName := RepoOptSection.InstallRepositoryName;
  257. Path := RepoOptSection.Path;
  258. end;
  259. function TFPInstalledPackagesStructure.AddPackagesToRepository(ARepository: TFPRepository): Boolean;
  260. procedure LoadPackagefpcFromFile(APackage:TFPPackage;const AFileName: String);
  261. Var
  262. L : TStrings;
  263. V : String;
  264. begin
  265. L:=TStringList.Create;
  266. Try
  267. ReadIniFile(AFileName,L);
  268. V:=L.Values['version'];
  269. APackage.Version.AsString:=V;
  270. Finally
  271. L.Free;
  272. end;
  273. end;
  274. var
  275. SR : TSearchRec;
  276. P : TFPPackage;
  277. UF,UD : String;
  278. FpmkDir : String;
  279. UnitDir: String;
  280. begin
  281. Result:=false;
  282. FpmkDir:=IncludeTrailingPathDelimiter(FPath)+'fpmkinst'+PathDelim+FCompilerOptions.CompilerTarget+PathDelim;
  283. DirectoryExistsLog(FpmkDir);
  284. if FindFirst(IncludeTrailingPathDelimiter(FpmkDir)+'*'+FpmkExt,faDirectory,SR)=0 then
  285. begin
  286. log(llDebug,SLogFindInstalledPackages,[FpmkDir]);
  287. repeat
  288. if ((SR.Attr and faDirectory)=0) then
  289. begin
  290. // Try new .fpm-file
  291. AddPackageToRepository(ARepository, ChangeFileExt(SR.Name,''), FpmkDir+SR.Name);
  292. end;
  293. until FindNext(SR)<>0;
  294. end;
  295. FindClose(SR);
  296. // Search for non-fpmkunit packages
  297. UnitDir:=IncludeTrailingPathDelimiter(FPath)+'units'+PathDelim+FCompilerOptions.CompilerTarget+PathDelim;
  298. DirectoryExistsLog(UnitDir);
  299. if FindFirst(IncludeTrailingPathDelimiter(UnitDir)+AllFiles,faDirectory,SR)=0 then
  300. begin
  301. log(llDebug,SLogFindInstalledPackages,[UnitDir]);
  302. repeat
  303. if ((SR.Attr and faDirectory)=faDirectory) and (SR.Name<>'.') and (SR.Name<>'..') then
  304. begin
  305. UD:=IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(UnitDir)+SR.Name);
  306. // Try new fpunits.cfg
  307. UF:=UD+UnitConfigFileName;
  308. if FileExists(UF) then
  309. begin
  310. if not Assigned(ARepository.FindPackage(SR.Name)) then
  311. begin
  312. AddPackageToRepository(ARepository, SR.Name, UF);
  313. end;
  314. end
  315. else
  316. begin
  317. // Try Old style Package.fpc
  318. UF:=UD+'Package.fpc';
  319. if FileExists(UF) then
  320. begin
  321. if not Assigned(ARepository.FindPackage(SR.Name)) then
  322. begin
  323. P:=ARepository.AddPackage(SR.Name);
  324. P.PackagesStructure:=Self;
  325. LoadPackagefpcFromFile(P,UF);
  326. log(llDebug,SLogFoundPackageInFile,[P.Name, UF]);
  327. end;
  328. end;
  329. end;
  330. end;
  331. until FindNext(SR)<>0;
  332. end;
  333. FindClose(SR);
  334. Result:=true;
  335. end;
  336. function TFPInstalledPackagesStructure.GetUnitDirectory(APackage: TFPPackage): string;
  337. begin
  338. Result:=IncludeTrailingPathDelimiter(FPath)+'units'+PathDelim+FCompilerOptions.CompilerTarget+PathDelim+APackage.Name+PathDelim;
  339. end;
  340. function TFPInstalledPackagesStructure.GetPrefix: string;
  341. begin
  342. Result:=IncludeTrailingPathDelimiter(FPrefix);
  343. end;
  344. function TFPInstalledPackagesStructure.GetBaseInstallDir: string;
  345. begin
  346. Result:=FPath;
  347. end;
  348. initialization
  349. TFPCustomPackagesStructure.RegisterPackagesStructureClass(TFPRemotePackagesStructure);
  350. TFPCustomPackagesStructure.RegisterPackagesStructureClass(TFPInstalledPackagesStructure);
  351. end.