diff options
Diffstat (limited to 'xs1.xs')
-rw-r--r-- | xs1.xs | 61 |
1 files changed, 61 insertions, 0 deletions
@@ -0,0 +1,61 @@ +static void +update_provides(const URPM__Package pkg, HV *provides) { + if (pkg->h) { + int len; + struct rpmtd_s td, td_flags; + unsigned int i; + + /* examine requires for files which need to be marked in provides */ + if (headerGet(pkg->h, RPMTAG_REQUIRENAME, &td, HEADERGET_DEFAULT)) { + for (i = 0; i < rpmtdCount(&td); ++i) { + const char *s = rpmtdNextString(&td); + len = strlen(s); + if (s[0] == '/') (void)hv_fetch(provides, s, len, 1); + } + } + + /* update all provides */ + if (headerGet(pkg->h, RPMTAG_PROVIDENAME, &td, HEADERGET_DEFAULT)) { + char **list = td.data; + rpmsenseFlags *flags = NULL; + if (headerGet(pkg->h, RPMTAG_PROVIDEFLAGS, &td_flags, HEADERGET_DEFAULT)) + flags = td_flags.data; + for (i = 0; i < rpmtdCount(&td); ++i) { + len = strlen(list[i]); + if (!strncmp(list[i], "rpmlib(", 7)) continue; + update_hash_entry(provides, list[i], len, 1, flags && flags[i] & (RPMSENSE_PREREQ|RPMSENSE_SCRIPT_PREUN|RPMSENSE_SCRIPT_PRE|RPMSENSE_SCRIPT_POSTUN|RPMSENSE_SCRIPT_POST|RPMSENSE_LESS|RPMSENSE_EQUAL|RPMSENSE_GREATER), + pkg); + } + } + } else { + char *ps, *s, *es; + + if ((s = pkg->requires) != NULL && *s != 0) { + ps = strchr(s, '@'); + /* examine requires for files which need to be marked in provides */ + while(ps != NULL) { + if (s[0] == '/') { + *ps = 0; es = strchr(s, '['); if (!es) es = strchr(s, ' '); *ps = '@'; + (void)hv_fetch(provides, s, es != NULL ? es-s : ps-s, 1); + } + s = ps + 1; ps = strchr(s, '@'); + } + if (s[0] == '/') { + es = strchr(s, '['); if (!es) es = strchr(s, ' '); + (void)hv_fetch(provides, s, es != NULL ? (U32)(es-s) : strlen(s), 1); + } + } + + /* update all provides */ + if ((s = pkg->provides) != NULL && *s != 0) { + ps = strchr(s, '@'); + while(ps != NULL) { + *ps = 0; es = strchr(s, '['); if (!es) es = strchr(s, ' '); *ps = '@'; + update_hash_entry(provides, s, es != NULL ? es-s : ps-s, 1, es != NULL, pkg); + s = ps + 1; ps = strchr(s, '@'); + } + es = strchr(s, '['); if (!es) es = strchr(s, ' '); + update_hash_entry(provides, s, es != NULL ? es-s : 0, 1, es != NULL, pkg); + } + } + |