1 diff -ur rpm.org/configure.ac rpm/configure.ac
2 --- rpm.org/configure.ac 2007-10-02 14:48:58.200734000 +0200
3 +++ rpm/configure.ac 2007-10-02 14:49:18.697896240 +0200
6 AC_MSG_HEADER([INSTALLATION PARAMETERS])
8 +dnl enable generating autorequires containing packages names
10 +AC_ARG_ENABLE([adding-packages-names-in-autogenerated-dependancies],
11 + [ --enable-adding-packages-names-in-autogenerated-dependancies Add packages names for autogenerated dependancies to requires],
12 + AC_MSG_RESULT([Using packages names in autogerated requires is enabled])
13 + AC_DEFINE_UNQUOTED([AUTODEP_PKGNAMES], [1], ["Generating autorequires containing packages names."]))
16 dnl # figure out what root's primary group is
17 AC_MSG_CHECKING([root's primary group])
18 AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <stdio.h>
19 diff -ur rpm.org/lib/rpmfc.c rpm/lib/rpmfc.c
20 --- rpm.org/lib/rpmfc.c 2007-10-02 14:48:58.244068000 +0200
21 +++ rpm/lib/rpmfc.c 2007-10-02 14:52:24.222380740 +0200
23 #define _RPMDS_INTERNAL
35 +static regex_t * rpmfcExpandRegexps(const char * str,int *count){
38 + ARGV_t patterns=NULL;
39 + regex_t *compiled=NULL;
41 + s=rpmExpand(str,NULL);
43 + poptParseArgvString(s,count,(const char ***)&patterns);
46 + if (patterns==NULL){
55 + compiled=malloc(sizeof(regex_t)*(*count));
57 + for(i=0;i<*count;i++){
58 + r=regcomp(&compiled[j],patterns[i],REG_NOSUB);
61 + rpmMessage(RPMMESS_NORMAL,
62 + _("Compilation of regular expresion '%s'"
63 + " (expanded from '%s') failed. Skipping it.\n"),
67 + patterns=_free(patterns);
69 + compiled=_free(compiled);
77 +static int rpmfcMatchRegexps(regex_t *regexps, int count, const char *str, char deptype)
80 + for(j = 0; j < count; j++) {
81 + rpmMessage(RPMMESS_DEBUG,
82 + _("Checking %c: '%s' against _noauto expr. #%i\n"), deptype, str, j);
83 + if (!regexec(®exps[j], str, 0, NULL, 0)) {
84 + rpmMessage(RPMMESS_NORMAL,
85 + _("Skipping %c: '%s' as it matches _noauto expr. #%i\n"), deptype, str, j);
92 +static regex_t * rpmfcFreeRegexps(regex_t *regexps,int count){
96 + for(i=0;i<count;i++)
97 + regfree(®exps[i]);
98 + return _free(regexps);
102 * Run per-interpreter dependency helper.
103 * @param fc file classifier
104 * @param deptype 'P' == Provides:, 'R' == Requires:, helper
105 * @param nsdep class name for interpreter (e.g. "perl")
106 + * @param noauto _noauto* regexps
107 + * @param noauto_c # of _noauto* regexps
108 * @return 0 on success
110 -static int rpmfcHelper(rpmfc fc, unsigned char deptype, const char * nsdep)
111 +static int rpmfcHelper(rpmfc fc, unsigned char deptype, const char * nsdep,
112 + regex_t * noauto, int noauto_c)
113 /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
114 /*@modifies fc, rpmGlobalMacroContext, fileSystem, internalState @*/
120 + if(rpmfcMatchRegexps(noauto, noauto_c, N, deptype))
123 /* Add tracking dependency for versioned Provides: */
124 if (!fc->tracked && deptype == 'P' && *EVR != '\0') {
129 - if (is_executable) {
130 + if (is_executable && fc->findreq && !rpmfcMatchRegexps(fc->noautoreq, fc->noautoreq_c, s, 'R')) {
131 /* Add to package requires. */
132 ds = rpmdsSingle(RPMTAG_REQUIRENAME, s, "", RPMSENSE_FIND_REQUIRES);
133 xx = rpmdsMerge(&fc->requires, ds);
134 @@ -747,49 +820,61 @@
136 if (fc->fcolor->vals[fc->ix] & RPMFC_PERL) {
137 if (strncmp(fn, "/usr/share/doc/", sizeof("/usr/share/doc/")-1)) {
138 - if (fc->fcolor->vals[fc->ix] & RPMFC_MODULE)
139 - xx = rpmfcHelper(fc, 'P', "perl");
140 - if (is_executable || (fc->fcolor->vals[fc->ix] & RPMFC_MODULE))
141 - xx = rpmfcHelper(fc, 'R', "perl");
142 + if (fc->findprov && fc->fcolor->vals[fc->ix] & RPMFC_MODULE)
143 + xx = rpmfcHelper(fc, 'P', "perl", fc->noautoprov, fc->noautoprov_c);
144 + if (fc->findreq && is_executable || (fc->fcolor->vals[fc->ix] & RPMFC_MODULE))
145 + xx = rpmfcHelper(fc, 'R', "perl", fc->noautoreq, fc->noautoreq_c);
148 if (fc->fcolor->vals[fc->ix] & RPMFC_PYTHON) {
149 - xx = rpmfcHelper(fc, 'P', "python");
151 + xx = rpmfcHelper(fc, 'P', "python", fc->noautoprov, fc->noautoprov_c);
155 - xx = rpmfcHelper(fc, 'R', "python");
157 + xx = rpmfcHelper(fc, 'R', "python", fc->noautoreq, fc->noautoreq_c);
159 if (fc->fcolor->vals[fc->ix] & RPMFC_LIBTOOL) {
160 - xx = rpmfcHelper(fc, 'P', "libtool");
162 + xx = rpmfcHelper(fc, 'P', "libtool", fc->noautoprov, fc->noautoprov_c);
166 - xx = rpmfcHelper(fc, 'R', "libtool");
168 + xx = rpmfcHelper(fc, 'R', "libtool", fc->noautoreq, fc->noautoreq_c);
170 if (fc->fcolor->vals[fc->ix] & RPMFC_PKGCONFIG) {
171 - xx = rpmfcHelper(fc, 'P', "pkgconfig");
173 + xx = rpmfcHelper(fc, 'P', "pkgconfig", fc->noautoprov, fc->noautoprov_c);
177 - xx = rpmfcHelper(fc, 'R', "pkgconfig");
179 + xx = rpmfcHelper(fc, 'R', "pkgconfig", fc->noautoreq, fc->noautoreq_c);
181 if (fc->fcolor->vals[fc->ix] & RPMFC_BOURNE) {
183 - xx = rpmfcHelper(fc, 'P', "executable");
185 + xx = rpmfcHelper(fc, 'P', "executable", fc->noautoprov, fc->noautoprov_c);
188 - xx = rpmfcHelper(fc, 'R', "executable");
190 + xx = rpmfcHelper(fc, 'R', "executable", fc->noautoreq, fc->noautoreq_c);
192 if (fc->fcolor->vals[fc->ix] & RPMFC_PHP) {
193 - xx = rpmfcHelper(fc, 'P', "php");
195 + xx = rpmfcHelper(fc, 'P', "php", fc->noautoprov, fc->noautoprov_c);
196 /* not only executable, files run by httpd usually are not */
197 - xx = rpmfcHelper(fc, 'R', "php");
199 + xx = rpmfcHelper(fc, 'R', "php", fc->noautoreq, fc->noautoreq_c);
201 if (fc->fcolor->vals[fc->ix] & RPMFC_MONO) {
202 - xx = rpmfcHelper(fc, 'P', "mono");
204 + xx = rpmfcHelper(fc, 'P', "mono", fc->noautoprov, fc->noautoprov_c);
206 - xx = rpmfcHelper(fc, 'R', "mono");
208 + xx = rpmfcHelper(fc, 'R', "mono", fc->noautoreq, fc->noautoreq_c);
212 @@ -816,20 +901,26 @@
215 case RPMTAG_PROVIDENAME:
216 + if (fc->findprov && !rpmfcMatchRegexps(fc->noautoprov, fc->noautoprov_c, ds->N[0], 'P')) {
217 /* Add to package provides. */
218 rc = rpmdsMerge(&fc->provides, ds);
220 /* Add to file dependencies. */
222 rc = rpmfcSaveArg(&fc->ddict, rpmfcFileDep(buf, fc->ix, ds));
226 case RPMTAG_REQUIRENAME:
227 + if (fc->findreq && !rpmfcMatchRegexps(fc->noautoreq, fc->noautoreq_c, ds->N[0], 'R')) {
228 /* Add to package requires. */
229 rc = rpmdsMerge(&fc->requires, ds);
231 /* Add to file dependencies. */
233 rc = rpmfcSaveArg(&fc->ddict, rpmfcFileDep(buf, fc->ix, ds));
239 @@ -870,6 +961,109 @@
243 +static int rpmfcFindRequiredPackages(rpmfc fc)
252 + unsigned char deptype;
260 + const char * hname;
261 + rpmdbMatchIterator it;
263 + regex_t *noautoreqdep;
264 + int noautoreqdep_c;
266 + noautoreqdep=rpmfcExpandRegexps("%{__noautoreqdep}", &noautoreqdep_c);
268 + ts = rpmtsCreate(); /* XXX ts created in main() should be used */
270 + rpmMessage(RPMMESS_NORMAL, _("Searching for required packages....\n"));
272 + nddict = argvCount(fc->ddict);
274 + for (i = 0; i < nddict; i++) {
277 + /* Parse out (file#,deptype,N,EVR,Flags) */
278 + ix = strtol(s, &se, 10);
279 + assert(se != NULL);
283 + while (*se && *se != ' ')
287 + while (*se && *se != ' ')
290 + Flags = strtol(se, NULL, 16);
292 + if (deptype!='R') continue;
294 + rpmMessage(RPMMESS_DEBUG, _("#%i requires: %s,%s,%i\n"),ix,N,EVR,Flags);
295 + if (EVR && EVR[0]) {
296 + rpmMessage(RPMMESS_DEBUG, _("skipping #%i require\n"));
299 + for(j=0;j<noautoreqdep_c;j++)
300 + if (!regexec(&noautoreqdep[j],N,0,NULL,0)) {
301 + rpmMessage(RPMMESS_NORMAL,
302 + _("skipping %s requirement processing"
303 + " (matches noautoreqdep pattern #%i)\n"),N,j);
306 + if (j<noautoreqdep_c) continue;
308 + rpmMessage(RPMMESS_DEBUG, _("skipping #%i require (is file requirement)\n"));
311 + it=rpmtsInitIterator(ts, RPMTAG_PROVIDENAME, N, 0);
313 + rpmMessage(RPMMESS_DEBUG, _("%s -> not found\n"),N);
316 + rpmMessage(RPMMESS_DEBUG, _("Iterator: %p\n"),it);
317 + if (rpmdbGetIteratorCount(it)>1) {
318 + rpmMessage(RPMMESS_DEBUG, _("%s -> multiple (skipping)\n"),N);
319 + rpmdbFreeIterator(it);
322 + hdr=rpmdbNextIterator(it);
324 + r=headerGetEntry(hdr,RPMTAG_NAME,NULL,(void **)&hname, NULL);
326 + if (!strcmp(hname,N)) {
327 + rpmMessage(RPMMESS_DEBUG, _("%s -> %s (skipping)\n"),N,hname);
328 + rpmdbFreeIterator(it);
332 + rpmMessage(RPMMESS_DEBUG, "%s -> %s\n",N,hname);
334 + ds = rpmdsSingle(RPMTAG_REQUIRENAME, hname, "", RPMSENSE_FIND_REQUIRES);
335 + xx = rpmdsMerge(&fc->requires, ds);
336 + ds = rpmdsFree(ds);
338 + rpmdbFreeIterator(it);
341 + noautoreqdep = rpmfcFreeRegexps(noautoreqdep, noautoreqdep_c);
342 + ts = rpmtsFree(ts);
346 int rpmfcApply(rpmfc fc)
349 @@ -888,6 +1082,26 @@
354 + regex_t *noautoprovfiles = NULL;
355 + int noautoprovfiles_c;
356 + regex_t *noautoreqfiles = NULL;
357 + int noautoreqfiles_c;
358 + const char *buildroot;
361 + fc->noautoprov = NULL;
362 + fc->noautoreq = NULL;
364 + buildroot = rpmExpand("%{buildroot}",NULL);
365 + buildroot_l = strlen(buildroot);
367 + noautoprovfiles = rpmfcExpandRegexps("%{__noautoprovfiles}", &noautoprovfiles_c);
368 + noautoreqfiles = rpmfcExpandRegexps("%{__noautoreqfiles}", &noautoreqfiles_c);
369 + fc->noautoprov = rpmfcExpandRegexps("%{__noautoprov}", &fc->noautoprov_c);
370 + fc->noautoreq = rpmfcExpandRegexps("%{__noautoreq}", &fc->noautoreq_c);
371 + rpmMessage(RPMMESS_DEBUG, _("%i _noautoprov patterns.\n"), fc->noautoprov_c);
372 + rpmMessage(RPMMESS_DEBUG, _("%i _noautoreq patterns.\n"), fc->noautoreq_c);
374 /* Make sure something didn't go wrong previously! */
375 assert(fc->fn != NULL);
376 @@ -911,9 +1125,43 @@
377 for (fcat = rpmfcApplyTable; fcat->func != NULL; fcat++) {
378 if (!(fc->fcolor->vals[fc->ix] & fcat->colormask))
379 /*@innercontinue@*/ continue;
382 + if (strncmp(fc->fn[fc->ix],buildroot,buildroot_l)==0) {/* sanity check */
383 + for(j = 0; j < noautoprovfiles_c; j++) {
384 + if (!regexec(&noautoprovfiles[j],
385 + fc->fn[fc->ix] + buildroot_l, 0, NULL, 0)) {
386 + rpmMessage(RPMMESS_NORMAL,
387 + _("skipping %s provides detection"
388 + " (matches noautoprovfiles pattern #%i)\n"),
389 + fc->fn[fc->ix], j);
394 + for(j = 0; j < noautoreqfiles_c; j++) {
395 + if (!regexec(&noautoreqfiles[j],
396 + fc->fn[fc->ix] + buildroot_l, 0, NULL, 0)) {
397 + rpmMessage(RPMMESS_NORMAL,
398 + _("skipping %s requires detection"
399 + " (matches noautoreqfiles pattern #%i)\n"),
400 + fc->fn[fc->ix], j);
407 xx = (*fcat->func) (fc);
410 + noautoprovfiles = rpmfcFreeRegexps(noautoprovfiles, noautoprovfiles_c);
411 + noautoreqfiles = rpmfcFreeRegexps(noautoreqfiles, noautoreqfiles_c);
412 + fc->noautoprov = rpmfcFreeRegexps(fc->noautoprov, fc->noautoprov_c);
413 + fc->noautoreq = rpmfcFreeRegexps(fc->noautoreq, fc->noautoreq_c);
414 +#ifdef AUTODEP_PKGNAMES /* define to use package names in R */
415 + rpmfcFindRequiredPackages(fc);
419 /* Generate per-file indices into package dependencies. */
420 diff -ur rpm.org/lib/rpmfc.c.orig rpm/lib/rpmfc.c.orig
421 --- rpm.org/lib/rpmfc.c.orig 2007-09-22 22:37:16.000000000 +0200
422 +++ rpm/lib/rpmfc.c.orig 2007-10-02 14:48:58.244068387 +0200
425 if (fc->fcolor->vals[fc->ix] & RPMFC_PHP) {
426 xx = rpmfcHelper(fc, 'P', "php");
428 + /* not only executable, files run by httpd usually are not */
429 xx = rpmfcHelper(fc, 'R', "php");
431 if (fc->fcolor->vals[fc->ix] & RPMFC_MONO) {
432 diff -ur rpm.org/lib/rpmfc.h rpm/lib/rpmfc.h
433 --- rpm.org/lib/rpmfc.h 2007-07-14 05:22:44.000000000 +0200
434 +++ rpm/lib/rpmfc.h 2007-10-02 14:49:18.731230377 +0200
436 StringBuf sb_python;/*!< concatenated list of python colored files. */
437 StringBuf sb_php; /*!< concatenated list of php colored files. */
439 + int findprov, findreq;
440 + regex_t *noautoprov;
442 + regex_t *noautoreq;
447 --- rpm/lib/rpmfc.h.org 2007-10-02 15:05:48.028299804 +0200
448 +++ rpm/lib/rpmfc.h 2007-10-02 15:06:03.052024633 +0200
452 #if defined(_RPMFC_INTERNAL)
454 +#if defined(WITH_PCRE) && defined(HAVE_PCREPOSIX_H)
455 +#include <pcreposix.h>