ADD: RPM - dependencies information

This commit is contained in:
Alexander Koblov 2024-11-24 14:29:53 +03:00
commit 6ec5f573b9
3 changed files with 41 additions and 8 deletions

View file

@ -47,6 +47,7 @@ type
changevol_proc : TChangeVolProc;
//- RPM tags -------------------------------------------
info : RPM_InfoRec;
deps : RPM_DepsRec;
datasig : RPM_DataSig;
end;{ArchiveRec}
@ -117,7 +118,7 @@ begin
else begin
if not RPM_ReadSignature(arec^.handle_file, r_lead.signature_type, signature) then fgError := True
else
if not RPM_ReadHeader(arec^.handle_file, False, arec^.header, arec^.info) then fgError := True
if not RPM_ReadHeader(arec^.handle_file, False, arec^.header, arec^.info, arec^.deps) then fgError := True
else
arec^.arch_len := FileSize(arec^.handle_file) - FilePos(arec^.handle_file);
if not fgError then begin
@ -164,8 +165,8 @@ begin
end;
HDR_INFO: begin
copy_str2buf(TStrBuf(FileName), 'INFO.TXT');
PackSize := 0;
UnpSize := 0;
PackSize := -1;
UnpSize := -1;
end;
else
Result := E_END_ARCHIVE;
@ -184,6 +185,7 @@ function ProcessFile(hArcData: TArcHandle; Operation: Integer; DestPath: PChar;
var
rpm_file : file;
rpm_name : String;
index : Integer;
buf : Pointer;
buf_size : LongWord;
fsize : LongWord;
@ -285,6 +287,15 @@ begin
Line('SOURCE RPM: ' + sourcerpm);
Line('DESCRIPTION: ');
Line(description);
if Length(arec^.deps.names) > 0 then
begin
Line(EmptyStr);
Line('REQUIRES: ');
for index:= 0 to High(arec^.deps.names) do
begin
Line(' ' + arec^.deps.names[index]);
end;
end;
end;
end;
if faborted then Result:=E_EABORTED

View file

@ -14,7 +14,7 @@ unit rpm_def;
interface
uses
Classes;
Classes, SysUtils;
{$ifdef ver90}
type longword=longint;
@ -79,6 +79,8 @@ const
RPMTAG_ARCHIVESIZE = 1046;
RPMTAG_REQUIRENAME = 1049;
type
RPM_DataSig = array[0..5] of char;
@ -128,6 +130,10 @@ type
sourcerpm : AnsiString; // RPMTAG_SOURCERPM
end;{RPM_Info}
RPM_DepsRec = record
names: TStringArray;
end;
implementation
end.

View file

@ -26,9 +26,9 @@ type
function RPM_ReadLead(var f : file; var lead : RPM_Lead) : Boolean;
function RPM_ReadSignature(var f : file; sig_type : Word; var signature : RPM_Header) : Boolean;
function RPM_ReadHeader(var f : file; align_data : Boolean; var header : RPM_Header; var info : RPM_InfoRec) : Boolean;
function RPM_ReadHeader(var f : file; align_data : Boolean; var header : RPM_Header; var info : RPM_InfoRec; var deps : RPM_DepsRec) : Boolean;
function RPM_ReadEntry(var f : file; data_start : LongInt; var entry : RPM_EntryInfo) : Boolean;
function RPM_ProcessEntry(var f : file; data_start : LongInt; var entry : RPM_EntryInfo; var info : RPM_InfoRec) : Boolean;
function RPM_ProcessEntry(var f : file; data_start : LongInt; var entry : RPM_EntryInfo; var info : RPM_InfoRec; var deps : RPM_DepsRec) : Boolean;
procedure swap_value(var value; size : Integer);
procedure copy_str2buf(var buf : TStrBuf; s : AnsiString);
@ -126,7 +126,7 @@ begin
for i_entry := 0 to count - 1 do begin
if not RPM_ReadEntry(f, start, entry) then Exit
else
if not RPM_ProcessEntry(f, start, entry, info) then Exit;
if not RPM_ProcessEntry(f, start, entry, info, deps) then Exit;
end;
end;
start := start + LongInt(header.data_size);
@ -158,6 +158,7 @@ end;
function RPM_ReadSignature;
var
info : RPM_InfoRec;
deps : RPM_DepsRec;
begin
Result := False;
case sig_type of
@ -166,7 +167,7 @@ begin
RPMSIG_MD5_PGP : ; //
RPMSIG_HEADERSIG : // New header signature
begin
if RPM_ReadHeader(f, True, signature, info) then Result := True;
if RPM_ReadHeader(f, True, signature, info, deps) then Result := True;
end;
end;{case signature type}
end;
@ -176,6 +177,7 @@ var s:string;
i,l:integer;
ch,ch2:char;
begin
s := '';
instr:=instr+' '; {Avoid overflow}
l:=length(instr)-1;
for i:=1 to l do begin
@ -193,6 +195,8 @@ function RPM_ProcessEntry;
var
save_pos : Integer;
fgError : Boolean;
i : Integer;
s : String;
begin
result:=true;
if entry.tag = RPMTAG_FILENAMES then exit;
@ -262,6 +266,18 @@ begin
RPMTAG_SOURCERPM :
if entry.etype = 6 then fgError := not read_string(f, info.sourcerpm);
RPMTAG_REQUIRENAME:
if entry.etype = 8 then
begin
SetLength(deps.names, entry.Count);
for i := 0 to entry.Count - 1 do
begin
read_string(f, s);
deps.names[i] := s;
end;
end;
end;{case}
end