pkguninstalledsrcsrepo.pp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. unit pkgUninstalledSrcsRepo;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes,
  6. SysUtils,
  7. fpmkunit,
  8. pkgoptions,
  9. pkgFppkg,
  10. pkgglobals,
  11. pkgmessages,
  12. fprepos,
  13. pkgrepos,
  14. pkghandler,
  15. pkgPackagesStructure;
  16. type
  17. { TFppkgUninstalledSourceRepositoryOptionSection }
  18. TFppkgUninstalledSourceRepositoryOptionSection = class(TFppkgRepositoryOptionSection)
  19. protected
  20. class function GetKey: string; override;
  21. public
  22. function GetRepositoryType: TFPRepositoryType; override;
  23. end;
  24. { TFPUninstalledSourcesAvailablePackagesStructure }
  25. TFPUninstalledSourcesAvailablePackagesStructure = class(TFPCustomFileSystemPackagesStructure)
  26. public
  27. class function GetRepositoryOptionSectionClass: TFppkgRepositoryOptionSectionClass; override;
  28. procedure InitializeWithOptions(ARepoOptionSection: TFppkgRepositoryOptionSection; AnOptions: TFppkgOptions; ACompilerOptions: TCompilerOptions); override;
  29. function AddPackagesToRepository(ARepository: TFPRepository): Boolean; override;
  30. function GetBuildPathDirectory(APackage: TFPPackage): string; override;
  31. end;
  32. { TFppkgUninstalledRepositoryOptionSection }
  33. TFppkgUninstalledRepositoryOptionSection = class(TFppkgRepositoryOptionSection)
  34. private
  35. FSourceRepositoryName: string;
  36. protected
  37. class function GetKey: string; override;
  38. public
  39. procedure AddKeyValue(const AKey, AValue: string); override;
  40. procedure LogValues(ALogLevel: TLogLevel); override;
  41. function GetRepositoryType: TFPRepositoryType; override;
  42. procedure SaveToStrings(AStrings: TStrings); override;
  43. property SourceRepositoryName: string read FSourceRepositoryName write FSourceRepositoryName;
  44. end;
  45. { TFPUninstalledSourcesPackagesStructure }
  46. TFPUninstalledSourcesPackagesStructure = class(TFPCustomFileSystemPackagesStructure)
  47. private
  48. FSourceRepositoryName: string;
  49. FLinkedRepositoryName: string;
  50. public
  51. class function GetRepositoryOptionSectionClass: TFppkgRepositoryOptionSectionClass; override;
  52. procedure InitializeWithOptions(ARepoOptionSection: TFppkgRepositoryOptionSection; AnOptions: TFppkgOptions; ACompilerOptions: TCompilerOptions); override;
  53. function AddPackagesToRepository(ARepository: TFPRepository): Boolean; override;
  54. function IsInstallationNeeded(APackage: TFPPackage): TFPInstallationNeeded; override;
  55. function GetBaseInstallDir: string; override;
  56. function GetConfigFileForPackage(APackage: TFPPackage): string; override;
  57. property SourceRepositoryName: string read FSourceRepositoryName write FSourceRepositoryName;
  58. end;
  59. implementation
  60. const
  61. KeySourceRepository = 'SourceRepository';
  62. SLogSourceRepository = ' SourceRepository:%s';
  63. KeySrcRepositorySection = 'UninstalledSourceRepository';
  64. KeyUninstalledRepository = 'UninstalledRepository';
  65. KeyRepositorySection = 'Repository';
  66. { TFPUninstalledSourcesPackagesStructure }
  67. class function TFPUninstalledSourcesPackagesStructure.GetRepositoryOptionSectionClass: TFppkgRepositoryOptionSectionClass;
  68. begin
  69. Result := TFppkgUninstalledRepositoryOptionSection;
  70. end;
  71. procedure TFPUninstalledSourcesPackagesStructure.InitializeWithOptions(
  72. ARepoOptionSection: TFppkgRepositoryOptionSection; AnOptions: TFppkgOptions;
  73. ACompilerOptions: TCompilerOptions);
  74. var
  75. RepoOptionSection: TFppkgUninstalledRepositoryOptionSection;
  76. begin
  77. inherited InitializeWithOptions(ARepoOptionSection, AnOptions, ACompilerOptions);
  78. RepoOptionSection := ARepoOptionSection as TFppkgUninstalledRepositoryOptionSection;
  79. path := RepoOptionSection.Path;
  80. SourceRepositoryName := RepoOptionSection.SourceRepositoryName;
  81. FLinkedRepositoryName := RepoOptionSection.RepositoryName;
  82. end;
  83. function TFPUninstalledSourcesPackagesStructure.AddPackagesToRepository(ARepository: TFPRepository): Boolean;
  84. var
  85. SRD : TSearchRec;
  86. SRF : TSearchRec;
  87. P : TFPPackage;
  88. UD : String;
  89. begin
  90. Result:=false;
  91. log(llDebug,SLogFindInstalledPackages,[Path]);
  92. if FindFirst(Path+AllFiles,faDirectory,SRD)=0 then
  93. begin
  94. repeat
  95. // Try new .fpm-file
  96. UD:=Path+SRD.Name+PathDelim;
  97. if FindFirst(UD+'*'+FpmkExt,faAnyFile,SRF)=0 then
  98. begin
  99. repeat
  100. AddPackageToRepository(ARepository, ChangeFileExt(SRF.Name,''), UD+SRF.Name);
  101. until FindNext(SRF)<>0;
  102. end;
  103. FindClose(SRF);
  104. until FindNext(SRD)<>0;
  105. end;
  106. FindClose(SRD);
  107. Result:=true;
  108. end;
  109. function TFPUninstalledSourcesPackagesStructure.IsInstallationNeeded(APackage: TFPPackage): TFPInstallationNeeded;
  110. begin
  111. if (APackage.Repository.RepositoryName=SourceRepositoryName) or
  112. (Assigned(APackage.Repository.DefaultPackagesStructure) and (APackage.Repository.DefaultPackagesStructure.InstallRepositoryName=FLinkedRepositoryName)) then
  113. Result := fpinNoInstallationNeeded
  114. else
  115. Result := fpinInstallationImpossible;
  116. end;
  117. function TFPUninstalledSourcesPackagesStructure.GetBaseInstallDir: string;
  118. begin
  119. Result := Path;
  120. end;
  121. function TFPUninstalledSourcesPackagesStructure.GetConfigFileForPackage(APackage: TFPPackage): string;
  122. begin
  123. if APackage.SourcePath<>'' then
  124. Result := IncludeTrailingPathDelimiter(APackage.SourcePath)
  125. else
  126. Result := IncludeTrailingPathDelimiter(GetBaseInstallDir)+APackage.Name+PathDelim;
  127. Result := Result +APackage.Name+'-'+FCompilerOptions.CompilerTarget+FpmkExt;
  128. end;
  129. { TFppkgUninstalledRepositoryOptionSection }
  130. class function TFppkgUninstalledRepositoryOptionSection.GetKey: string;
  131. begin
  132. Result := KeyUninstalledRepository;
  133. end;
  134. procedure TFppkgUninstalledRepositoryOptionSection.AddKeyValue(const AKey, AValue: string);
  135. begin
  136. if SameText(AKey,KeySourceRepository) then
  137. SourceRepositoryName := AValue
  138. else
  139. inherited AddKeyValue(AKey, AValue);
  140. end;
  141. procedure TFppkgUninstalledRepositoryOptionSection.LogValues(ALogLevel: TLogLevel);
  142. begin
  143. inherited LogValues(ALogLevel);
  144. log(ALogLevel,SLogSourceRepository,[FSourceRepositoryName]);
  145. end;
  146. function TFppkgUninstalledRepositoryOptionSection.GetRepositoryType: TFPRepositoryType;
  147. begin
  148. Result := fprtInstalled;
  149. end;
  150. procedure TFppkgUninstalledRepositoryOptionSection.SaveToStrings(AStrings: TStrings);
  151. begin
  152. inherited SaveToStrings(AStrings);
  153. if SourceRepositoryName<>'' then
  154. AStrings.Add(KeySourceRepository+'='+SourceRepositoryName);
  155. end;
  156. { TFppkgUninstalledSourceRepositoryOptionSection }
  157. class function TFppkgUninstalledSourceRepositoryOptionSection.GetKey: string;
  158. begin
  159. Result := KeySrcRepositorySection;
  160. end;
  161. function TFppkgUninstalledSourceRepositoryOptionSection.GetRepositoryType: TFPRepositoryType;
  162. begin
  163. Result := fprtAvailable;
  164. end;
  165. { TFPUninstalledSourcesPackagesStructure }
  166. class function TFPUninstalledSourcesAvailablePackagesStructure.GetRepositoryOptionSectionClass: TFppkgRepositoryOptionSectionClass;
  167. begin
  168. Result := TFppkgUninstalledSourceRepositoryOptionSection;
  169. end;
  170. procedure TFPUninstalledSourcesAvailablePackagesStructure.InitializeWithOptions(
  171. ARepoOptionSection: TFppkgRepositoryOptionSection; AnOptions: TFppkgOptions;
  172. ACompilerOptions: TCompilerOptions);
  173. begin
  174. inherited InitializeWithOptions(ARepoOptionSection, AnOptions, ACompilerOptions);
  175. path := TFppkgUninstalledSourceRepositoryOptionSection(ARepoOptionSection).Path;
  176. end;
  177. function TFPUninstalledSourcesAvailablePackagesStructure.AddPackagesToRepository(ARepository: TFPRepository): Boolean;
  178. var
  179. SR : TSearchRec;
  180. AManifestFile, AFPMakeFile: String;
  181. i: Integer;
  182. TempPackagesStructure: TFPTemporaryDirectoryPackagesStructure;
  183. TempRepo: TFPRepository;
  184. PackageName: string;
  185. PackageManager: TpkgFppkg;
  186. begin
  187. Result:=false;
  188. TempPackagesStructure := TFPTemporaryDirectoryPackagesStructure.Create(Owner);
  189. TempPackagesStructure.InitializeWithOptions(nil, FOptions, FCompilerOptions);
  190. TempRepo := TFPRepository.Create(Owner);
  191. TempRepo.RepositoryName := 'TempScanUninstPackages';
  192. TempRepo.Description := 'Temp list of packages during scanning of source-packages';
  193. TempRepo.RepositoryType := fprtAvailable;
  194. TempRepo.DefaultPackagesStructure := TempPackagesStructure;
  195. TempPackagesStructure.AddPackagesToRepository(TempRepo);
  196. if Owner is TPkgFppkg then
  197. PackageManager := TPkgfppkg(owner)
  198. else
  199. PackageManager := GFPpkg;
  200. if Assigned(PackageManager) then
  201. PackageManager.RepositoryList.Add(TempRepo);
  202. try
  203. log(llDebug,SLogFindInstalledPackages,[Path]);
  204. if FindFirst(Path+AllFiles,faDirectory,SR)=0 then
  205. begin
  206. repeat
  207. if ((SR.Attr and faDirectory)=faDirectory) and (SR.Name<>'.') and (SR.Name<>'..') then
  208. begin
  209. AFPMakeFile := Path+SR.Name+PathDelim+FPMakePPFile;
  210. if FileExistsLog(AFPMakeFile) then
  211. begin
  212. AManifestFile := Path+SR.Name+PathDelim+ManifestFile;
  213. if not FileExists(AManifestFile) or (FileAge(AManifestFile) < FileAge(AFPMakeFile)) then
  214. begin
  215. // (Re-)create manifest
  216. if assigned(PackageManager) then
  217. begin
  218. try
  219. TempPackagesStructure.SetTempPath(Path+SR.Name);
  220. PackageName := SR.Name + '_create_manifest';
  221. TempPackagesStructure.TempPackageName := PackageName;
  222. pkghandler.ExecuteAction(PackageName,'fpmakemanifest',PackageManager);
  223. except
  224. on E: Exception do
  225. begin
  226. log(llWarning, SLogFailedToCreateManifest ,[AFPMakeFile, E.Message]);
  227. Continue;
  228. end;
  229. end;
  230. end
  231. else
  232. begin
  233. log(llError, SLogFailedToCreateManifest ,[AFPMakeFile, 'No packagemanager available']);
  234. end;
  235. end;
  236. ARepository.AddPackagesFromManifestFile(AManifestFile);
  237. for i := 0 to ARepository.PackageCount -1 do
  238. if ARepository.Packages[i].SourcePath = '' then
  239. ARepository.Packages[i].SourcePath := SR.Name;
  240. end
  241. end;
  242. until FindNext(SR)<>0;
  243. end;
  244. FindClose(SR);
  245. finally
  246. if Assigned(PackageManager) then
  247. PackageManager.RepositoryList.Remove(TempRepo);
  248. TempRepo.Free;
  249. TempPackagesStructure.Free;
  250. end;
  251. for i := 0 to ARepository.PackageCount -1 do
  252. ARepository.Packages[i].PackagesStructure := Self;
  253. Result:=true;
  254. end;
  255. function TFPUninstalledSourcesAvailablePackagesStructure.GetBuildPathDirectory(APackage: TFPPackage): string;
  256. begin
  257. if APackage.SourcePath<>'' then
  258. Result := Path+APackage.SourcePath
  259. else
  260. Result := Path+APackage.Name
  261. end;
  262. initialization
  263. TFPCustomPackagesStructure.RegisterPackagesStructureClass(TFPUninstalledSourcesAvailablePackagesStructure);
  264. TFPCustomPackagesStructure.RegisterPackagesStructureClass(TFPUninstalledSourcesPackagesStructure);
  265. end.