diff options
author | Pascal Rigaux <pixel@mandriva.com> | 2007-08-12 20:44:55 +0000 |
---|---|---|
committer | Pascal Rigaux <pixel@mandriva.com> | 2007-08-12 20:44:55 +0000 |
commit | 2a90cb014e855a07d89bbc22b1e2ac83f7b03669 (patch) | |
tree | 57ff14d2dc37e9601235d2f196132715ce2e9e9c | |
parent | 79115dcc188f4436614d2932707eda6bf2739c18 (diff) | |
download | perl-URPM-2a90cb014e855a07d89bbc22b1e2ac83f7b03669.tar perl-URPM-2a90cb014e855a07d89bbc22b1e2ac83f7b03669.tar.gz perl-URPM-2a90cb014e855a07d89bbc22b1e2ac83f7b03669.tar.bz2 perl-URPM-2a90cb014e855a07d89bbc22b1e2ac83f7b03669.tar.xz perl-URPM-2a90cb014e855a07d89bbc22b1e2ac83f7b03669.zip |
- fix dropping tags from rpm header.
it hasn't work since MDK8.1 and rpm 4.0.
it may break urpmi!! but potentially allows a much smaller hdlist.cz :)
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | URPM.xs | 89 |
2 files changed, 66 insertions, 27 deletions
@@ -1,3 +1,7 @@ +- fix dropping tags from rpm header. + it hasn't work since MDK8.1 and rpm 4.0. + it may break urpmi!! but potentially allows a much smaller hdlist.cz :) + Version 1.74 - 12 August 2007, by Pascal "Pixel" Rigaux - sort choices per media, then per version @@ -1084,6 +1084,67 @@ parse_line(AV *depslist, HV *provides, URPM__Package pkg, char *buff, SV *urpm, } } +static void pack_rpm_header(Header *h) { + Header packed = headerNew(); + HeaderIterator hi; + int type, c, tag; + void *p; + + for (hi = headerInitIterator(*h); + headerNextIterator(hi, &tag, &type, (void *) &p, &c); + p = headerFreeData(p, type)) + { + // fprintf(stderr, "adding %s %d\n", tagname(tag), c); + headerAddEntry(packed, tag, type, p, c); + } + + headerFreeIterator(hi); + headerFree(*h); + + *h = packed; +} + +static void drop_tags(Header *h) { + headerRemoveEntry(*h, RPMTAG_FILEUSERNAME); /* user ownership is correct */ + headerRemoveEntry(*h, RPMTAG_FILEGROUPNAME); /* group ownership is correct */ + headerRemoveEntry(*h, RPMTAG_FILEMTIMES); /* correct time without it */ + headerRemoveEntry(*h, RPMTAG_FILEINODES); /* hardlinks work without it */ + headerRemoveEntry(*h, RPMTAG_FILEDEVICES); /* it is the same number for every file */ + headerRemoveEntry(*h, RPMTAG_FILESIZES); /* ? */ + headerRemoveEntry(*h, RPMTAG_FILERDEVS); /* it seems unused. always empty */ + headerRemoveEntry(*h, RPMTAG_FILEVERIFYFLAGS); /* only used for -V */ + headerRemoveEntry(*h, RPMTAG_FILEDIGESTALGOS); /* only used for -V */ + headerRemoveEntry(*h, RPMTAG_FILEDIGESTS); /* only used for -V */ + /* keep RPMTAG_FILEFLAGS for %config (rpmnew) to work */ + /* keep RPMTAG_FILELANGS for %lang (_install_langs) to work */ + /* keep RPMTAG_FILELINKTOS for checking conflicts between symlinks */ + /* keep RPMTAG_FILEMODES otherwise it segfaults with excludepath */ + + /* keep RPMTAG_POSTIN RPMTAG_POSTUN RPMTAG_PREIN RPMTAG_PREUN */ + /* keep RPMTAG_TRIGGERSCRIPTS RPMTAG_TRIGGERVERSION RPMTAG_TRIGGERFLAGS RPMTAG_TRIGGERNAME */ + /* small enough, and only in some packages. not needed per se */ + + headerRemoveEntry(*h, RPMTAG_ICON); + headerRemoveEntry(*h, RPMTAG_GIF); + headerRemoveEntry(*h, RPMTAG_EXCLUDE); + headerRemoveEntry(*h, RPMTAG_EXCLUSIVE); + headerRemoveEntry(*h, RPMTAG_COOKIE); + headerRemoveEntry(*h, RPMTAG_VERIFYSCRIPT); + + /* always the same for our packages */ + headerRemoveEntry(*h, RPMTAG_VENDOR); + headerRemoveEntry(*h, RPMTAG_DISTRIBUTION); + + /* keep RPMTAG_SIGSIZE, useful to tell the size of the rpm file (+440) */ + + headerRemoveEntry(*h, RPMTAG_DSAHEADER); + headerRemoveEntry(*h, RPMTAG_SHA1HEADER); + headerRemoveEntry(*h, RPMTAG_SIGMD5); + headerRemoveEntry(*h, RPMTAG_SIGGPG); + + pack_rpm_header(h); +} + static int update_header(char *filename, URPM__Package pkg, int keep_all_tags, int vsflags) { int d = open(filename, O_RDONLY); @@ -1117,33 +1178,7 @@ update_header(char *filename, URPM__Package pkg, int keep_all_tags, int vsflags) pkg->h = header; pkg->flag &= ~FLAG_NO_HEADER_FREE; - if (!keep_all_tags) { - headerRemoveEntry(pkg->h, RPMTAG_POSTIN); - headerRemoveEntry(pkg->h, RPMTAG_POSTUN); - headerRemoveEntry(pkg->h, RPMTAG_PREIN); - headerRemoveEntry(pkg->h, RPMTAG_PREUN); - headerRemoveEntry(pkg->h, RPMTAG_FILEUSERNAME); - headerRemoveEntry(pkg->h, RPMTAG_FILEGROUPNAME); - headerRemoveEntry(pkg->h, RPMTAG_FILEVERIFYFLAGS); - headerRemoveEntry(pkg->h, RPMTAG_FILERDEVS); - headerRemoveEntry(pkg->h, RPMTAG_FILEMTIMES); - headerRemoveEntry(pkg->h, RPMTAG_FILEDEVICES); - headerRemoveEntry(pkg->h, RPMTAG_FILEINODES); - headerRemoveEntry(pkg->h, RPMTAG_TRIGGERSCRIPTS); - headerRemoveEntry(pkg->h, RPMTAG_TRIGGERVERSION); - headerRemoveEntry(pkg->h, RPMTAG_TRIGGERFLAGS); - headerRemoveEntry(pkg->h, RPMTAG_TRIGGERNAME); - headerRemoveEntry(pkg->h, RPMTAG_CHANGELOGTIME); - headerRemoveEntry(pkg->h, RPMTAG_CHANGELOGNAME); - headerRemoveEntry(pkg->h, RPMTAG_CHANGELOGTEXT); - headerRemoveEntry(pkg->h, RPMTAG_ICON); - headerRemoveEntry(pkg->h, RPMTAG_GIF); - headerRemoveEntry(pkg->h, RPMTAG_VENDOR); - headerRemoveEntry(pkg->h, RPMTAG_EXCLUDE); - headerRemoveEntry(pkg->h, RPMTAG_EXCLUSIVE); - headerRemoveEntry(pkg->h, RPMTAG_DISTRIBUTION); - headerRemoveEntry(pkg->h, RPMTAG_VERIFYSCRIPT); - } + if (!keep_all_tags) drop_tags(&pkg->h); return 1; } rpmtsFree(ts); |