Mit dem Patch können jetzt auch Lokale Pakete wieder installiert werden Achtung, braucht immernoch das "kriminelle" ExtractString ;) -- Alexander Siol alex@xxxxxxxxxx dunklermeuchler@xxxxxxxxx
diff --git a/trunk/src/modules/pas/lpt/lpt.pas b/trunk/src/modules/pas/lpt/lpt.pas index e3f613d..a42125a 100644 --- a/trunk/src/modules/pas/lpt/lpt.pas +++ b/trunk/src/modules/pas/lpt/lpt.pas @@ -9,6 +9,8 @@ begin WriteLn(' scan: Lädt die Paketlisten von den Servern'); WriteLn(' list: Zeigt alle installierten Pakete an'); WriteLn(' get: Installiert das angegebene Paket'); + WriteLn(' install: Installiert das angegebene Paket aus lokaler Datei'); + WriteLn(' Achtung, Datei als letzten Parameter angeben!'); end; procedure Scan; @@ -162,6 +164,14 @@ begin end; end; +procedure Install(pkgfile: String; pkgname: String; reinstall: boolean); +var + repo: TRepository; +begin + AddRepository(pkgname, pkgfile, 'singlefile'); + Get(pkgname, reinstall); +end; + procedure List; var srec: SearchRec; @@ -266,6 +276,20 @@ begin WriteLn('Falsche Parameterzahl'); PrintUsage; end; + end else if system.ParamStr(1) = 'install' then begin + if system.ParamCount = 3 then begin + Install(system.ParamStr(3), system.ParamStr(2), false); + end else begin + WriteLn('Falsche Parameterzahl'); + PrintUsage; + end; + end else if system.ParamStr(1) = 'reinstall' then begin + if system.ParamCount = 3 then begin + Install(system.ParamStr(3), system.ParamStr(2), true); + end else begin + WriteLn('Falsche Parameterzahl'); + PrintUsage; + end; end else if system.ParamStr(1) = 'cfg-addbin' then begin if system.ParamCount = 3 then begin CfgAddbin(system.ParamStr(2), system.ParamStr(3)); diff --git a/trunk/src/modules/pas/lpt/repositories.pas b/trunk/src/modules/pas/lpt/repositories.pas index c68ec66..a68908d 100644 --- a/trunk/src/modules/pas/lpt/repositories.pas +++ b/trunk/src/modules/pas/lpt/repositories.pas @@ -2,7 +2,7 @@ unit repositories; {$MODE ObjFPC} interface -uses sysutils, classes, helpers, baserepository, httprepository; +uses sysutils, classes, helpers, baserepository, httprepository, sfrepository; procedure ReadPkgsrc(filename: String); procedure AddRepository(name, url, repostype: String); @@ -20,6 +20,8 @@ var begin if repostype = 'http' then begin repo := THTTPRepository.create(repos); + end else if repostype = 'singlefile' then begin + repo := TSFRepository.create(repos); end else begin WriteLn('ACHTUNG - Repository unbekannten Typs erzeugen geht nicht!'); WriteLn('Angefordert: ' + repostype); diff --git a/trunk/src/modules/pas/lpt/sfrepository.pas b/trunk/src/modules/pas/lpt/sfrepository.pas new file mode 100644 index 0000000..571e578 --- /dev/null +++ b/trunk/src/modules/pas/lpt/sfrepository.pas @@ -0,0 +1,106 @@ +unit sfrepository; +{$MODE ObjFPC} + +interface +uses sysutils, classes, tar, packages, helpers, baserepository; + +type + TSFRepository = class(TRepository) + public + constructor create(parent : TCollection); + function Download(version: TPackageVersion): TTarArchive; override; + function PrepareLists: boolean; override; + function FetchLists(pkgset: TPackageSet): boolean; override; + end; + +implementation + +constructor TSFRepository.create(parent : TCollection); +begin + inherited; + repostype := 'singlefile'; +end; + +function TSFRepository.Download(version: TPackageVersion): TTarArchive; +var + tar: TTarArchive; +begin + (* Einzelpakete enthalten nur sich selbst. Nur als Tar öffnen reicht. *) + tar := TTarArchive.create(self.url); + exit(tar); +end; + +function TSFRepository.PrepareLists: boolean; +begin + (* Einzelpakete haben keine Listen. *) + exit(true); +end; + +function TSFRepository.FetchLists(pkgset: TPackageSet): boolean; +var + package: TTarArchive; + line: String; + i: integer; + size: integer; + + package_file_string: String; + pkg_name, pkg_version, pkg_section, pkg_arch: String; + + pkg: TPackage; + section: TPackageSection; + version: TPackageVersion; +begin + package := TTarArchive.create(self.url); + while package.hasNext do begin + line := package.nextFilename; + size := package.nextSize; + i := Pos('packageinfo', line); + if i > 0 then begin + (* Metadaten laden *) + package_file_string := package.ExtractString(); + + (* Newline-getrennte Infos auslesen. *) + (* In Reihenfolge: Name, Version, Sektion, Architektur *) + i := Pos(#10, package_file_string); + pkg_name := Copy(package_file_string, 1, i - 1); + package_file_string := + Copy(package_file_string, i + 1, Length(package_file_string)); + + i := Pos(#10, package_file_string); + pkg_version := Copy(package_file_string, 1, i - 1); + package_file_string := + Copy(package_file_string, i + 1, Length(package_file_string)); + + i := Pos(#10, package_file_string); + pkg_section := Copy(package_file_string, 1, i - 1); + package_file_string := + Copy(package_file_string, i + 1, Length(package_file_string)); + + i := Pos(#10, package_file_string); + pkg_arch := Copy(package_file_string, 1, i - 1); + package_file_string := + Copy(package_file_string, i + 1, Length(package_file_string)); + + (* Prüfen ob Metadaten zu Paket passen *) + if (line = 'packages/'+pkg_name+'/'+pkg_version+'/packageinfo-'+pkg_section) then begin + pkg := pkgset.add(pkg_name); + pkg.desc := 'Keine (lokale Datei)'; + section := pkg.add(pkg_section); + version := section.add(pkg_version); + version.pkg := pkg; + version.section := section; + version.repository := self.name; + break; + end else begin + WriteLn('Metadaten passen nicht zu Paket!'); + end; + end else begin + package.skipFile(); + end; + end; + package.destroy(); + exit(true); +end; + +begin +end.
Attachment:
signature.asc
Description: Digital signature