]> TLD Linux GIT Repositories - packages/rpm.git/blob - rpm-pld-autodep.patch
1a3ee0ecf40562c33eda38bc5041c93c353e4ecf
[packages/rpm.git] / rpm-pld-autodep.patch
1 --- rpm-4.4.8/lib/rpmfc.h.orig  2005-11-18 23:08:14.231293000 +0100
2 +++ rpm-4.4.8/lib/rpmfc.h       2005-11-18 23:55:16.694214392 +0100
3 @@ -1,6 +1,7 @@
4  #ifndef _H_RPMFC_
5  #define _H_RPMFC_
6  
7 +#include <regex.h>
8  #undef FILE_RCSID
9  #include "magic.h"
10  
11 @@ -44,6 +45,11 @@
12      StringBuf sb_python;/*!< concatenated list of python colored files. */
13      StringBuf sb_php;   /*!< concatenated list of php colored files. */
14  
15 +    int findprov, findreq;
16 +    regex_t *noautoprov;
17 +    int noautoprov_c;
18 +    regex_t *noautoreq;
19 +    int noautoreq_c;
20  };
21  
22  /**
23 --- rpm-4.5/lib/rpmfc.c~        2008-06-10 14:06:23.000000000 +0300
24 +++ rpm-4.5/lib/rpmfc.c 2008-06-10 14:21:53.097663262 +0300
25 @@ -15,6 +15,8 @@
26  #define        _RPMDS_INTERNAL
27  #include <rpmds.h>
28  #include <rpmfi.h>
29 +#include <rpmts.h>
30 +#include <rpmdb.h>
31  
32  #include "debug.h"
33  
34 @@ -309,14 +311,83 @@
35      return buf;
36  };
37  
38 +static regex_t * rpmfcExpandRegexps(const char * str,int *count){
39 +    int i,j,r;
40 +    const char *s;
41 +    ARGV_t patterns=NULL;
42 +    regex_t *compiled=NULL;
43 +
44 +    s=rpmExpand(str,NULL);
45 +    if (s) {
46 +       poptParseArgvString(s,count,(const char ***)&patterns);
47 +       s = _free(s);
48 +    }
49 +    if (patterns==NULL){
50 +               *count=0;
51 +       return NULL;
52 +    }
53 +    if (*count==0){
54 +       _free(patterns);
55 +       return NULL;
56 +    }
57 +
58 +    compiled=malloc(sizeof(regex_t)*(*count));
59 +    j=0;
60 +    for(i=0;i<*count;i++){
61 +       r=regcomp(&compiled[j],patterns[i],REG_NOSUB);
62 +       if (r==0) j++;
63 +       else {
64 +               rpmMessage(RPMMESS_NORMAL, 
65 +                       _("Compilation of regular expresion '%s'"
66 +                       " (expanded from '%s') failed. Skipping it.\n"),
67 +                       patterns[i],str);
68 +       }
69 +    }
70 +    patterns=_free(patterns);
71 +    if (j==0) {
72 +       compiled=_free(compiled);
73 +       *count=0;
74 +       return NULL;
75 +    }
76 +    *count=j;
77 +    return compiled;
78 +}
79 +
80 +static int rpmfcMatchRegexps(regex_t *regexps, int count, const char *str, char deptype)
81 +{
82 +    int j;
83 +    for(j = 0; j < count; j++) {
84 +       rpmMessage(RPMMESS_DEBUG,
85 +           _("Checking %c: '%s' against _noauto expr. #%i\n"), deptype, str, j);
86 +       if (!regexec(&regexps[j], str, 0, NULL, 0)) {
87 +           rpmMessage(RPMMESS_NORMAL,
88 +               _("Skipping %c: '%s' as it matches _noauto expr. #%i\n"), deptype, str, j);
89 +           return 1;
90 +       }
91 +    }
92 +    return 0;
93 +}
94 +
95 +static regex_t * rpmfcFreeRegexps(regex_t *regexps,int count){
96 +    int i;
97 +       
98 +    if (regexps)
99 +        for(i=0;i<count;i++)
100 +           regfree(&regexps[i]);
101 +    return _free(regexps);
102 +}
103 +
104  /**
105   * Run per-interpreter dependency helper.
106   * @param fc           file classifier
107   * @param deptype      'P' == Provides:, 'R' == Requires:, helper
108   * @param nsdep                class name for interpreter (e.g. "perl")
109 + * @param noauto       _noauto* regexps
110 + * @param noauto_c     # of _noauto* regexps
111   * @return             0 on success
112   */
113 -static int rpmfcHelper(rpmfc fc, unsigned char deptype, const char * nsdep)
114 +static int rpmfcHelper(rpmfc fc, unsigned char deptype, const char * nsdep,
115 +    regex_t * noauto, int noauto_c)
116         /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
117         /*@modifies fc, rpmGlobalMacroContext, fileSystem, internalState @*/
118  {
119 @@ -402,6 +473,8 @@
120             }
121  /*@=branchstate@*/
122  
123 +           if(rpmfcMatchRegexps(noauto, noauto_c, N, deptype))
124 +               continue;
125  
126             /* Add tracking dependency for versioned Provides: */
127             if (!fc->tracked && deptype == 'P' && *EVR != '\0') {
128 @@ -714,7 +787,7 @@
129         *se = '\0';
130         se++;
131  
132 -       if (is_executable) {
133 +       if (is_executable && fc->findreq && !rpmfcMatchRegexps(fc->noautoreq, fc->noautoreq_c, s, 'R')) {
134             /* Add to package requires. */
135             ds = rpmdsSingle(RPMTAG_REQUIRENAME, s, "", RPMSENSE_FIND_REQUIRES);
136             xx = rpmdsMerge(&fc->requires, ds);
137 @@ -808,20 +889,26 @@
138      default:
139         break;
140      case RPMTAG_PROVIDENAME:
141 +       if (fc->findprov && !rpmfcMatchRegexps(fc->noautoprov, fc->noautoprov_c, ds->N[0], 'P')) {
142         /* Add to package provides. */
143         rc = rpmdsMerge(&fc->provides, ds);
144  
145         /* Add to file dependencies. */
146         buf[0] = '\0';
147         rc = rpmfcSaveArg(&fc->ddict, rpmfcFileDep(buf, fc->ix, ds));
148 +       } else
149 +               rc = 0;
150         break;
151      case RPMTAG_REQUIRENAME:
152 +       if (fc->findreq && !rpmfcMatchRegexps(fc->noautoreq, fc->noautoreq_c, ds->N[0], 'R')) {
153         /* Add to package requires. */
154         rc = rpmdsMerge(&fc->requires, ds);
155  
156         /* Add to file dependencies. */
157         buf[0] = '\0';
158         rc = rpmfcSaveArg(&fc->ddict, rpmfcFileDep(buf, fc->ix, ds));
159 +       } else
160 +               rc = 0;
161         break;
162      }
163      return rc;
164 @@ -862,6 +949,109 @@
165      { NULL, 0 }
166  };
167  
168 +static int rpmfcFindRequiredPackages(rpmfc fc) 
169 +{
170 +    rpmts ts=NULL;
171 +    const char * s;
172 +    char * se;
173 +    rpmds ds;
174 +    const char * N;
175 +    const char * EVR;
176 +    int_32 Flags;
177 +    unsigned char deptype;
178 +    int nddict;
179 +    int previx;
180 +    int ix;
181 +    int i;
182 +    int j;
183 +    int xx;
184 +    int r;
185 +    const char * hname;
186 +    rpmdbMatchIterator it;
187 +    Header hdr;
188 +    regex_t *noautoreqdep;
189 +    int noautoreqdep_c;
190 +
191 +    noautoreqdep=rpmfcExpandRegexps("%{__noautoreqdep}", &noautoreqdep_c);
192 +    
193 +    ts = rpmtsCreate(); /* XXX ts created in main() should be used */
194 +    
195 +    rpmMessage(RPMMESS_NORMAL, _("Searching for required packages....\n"));
196 +
197 +    nddict = argvCount(fc->ddict);
198 +    previx = -1;
199 +    for (i = 0; i < nddict; i++) {
200 +        s = fc->ddict[i];
201 +
202 +        /* Parse out (file#,deptype,N,EVR,Flags) */
203 +        ix = strtol(s, &se, 10);
204 +        assert(se != NULL);
205 +        deptype = *se++;
206 +        se++;
207 +        N = se;
208 +        while (*se && *se != ' ')
209 +            se++;
210 +        *se++ = '\0';
211 +        EVR = se;
212 +        while (*se && *se != ' ')
213 +            se++;
214 +        *se++ = '\0';
215 +        Flags = strtol(se, NULL, 16);
216 +
217 +        if (deptype!='R') continue;
218 +
219 +        rpmMessage(RPMMESS_DEBUG, _("#%i requires: %s,%s,%i\n"),ix,N,EVR,Flags);
220 +        if (EVR && EVR[0]) {
221 +            rpmMessage(RPMMESS_DEBUG, _("skipping #%i require\n"));
222 +            continue;
223 +        }
224 +        for(j=0;j<noautoreqdep_c;j++) 
225 +            if (!regexec(&noautoreqdep[j],N,0,NULL,0)) {
226 +                rpmMessage(RPMMESS_NORMAL, 
227 +                        _("skipping %s requirement processing"
228 +                       " (matches noautoreqdep pattern #%i)\n"),N,j);
229 +                break;
230 +            }
231 +        if (j<noautoreqdep_c) continue;
232 +        if (N[0]=='/') {
233 +            rpmMessage(RPMMESS_DEBUG, _("skipping #%i require (is file requirement)\n"));
234 +            continue;
235 +        }
236 +        it=rpmtsInitIterator(ts, RPMTAG_PROVIDENAME, N, 0);
237 +        if (!it) {
238 +            rpmMessage(RPMMESS_DEBUG, _("%s -> not found\n"),N);
239 +            continue;
240 +        }
241 +        rpmMessage(RPMMESS_DEBUG, _("Iterator: %p\n"),it);
242 +        if (rpmdbGetIteratorCount(it)>1) {
243 +            rpmMessage(RPMMESS_DEBUG, _("%s -> multiple (skipping)\n"),N);
244 +            rpmdbFreeIterator(it);
245 +            continue;
246 +        }
247 +        hdr=rpmdbNextIterator(it);
248 +        assert(hdr!=NULL);
249 +        r=headerGetEntry(hdr,RPMTAG_NAME,NULL,(void **)&hname, NULL);
250 +        assert(r<2);
251 +        if (!strcmp(hname,N)) {
252 +            rpmMessage(RPMMESS_DEBUG, _("%s -> %s (skipping)\n"),N,hname);
253 +            rpmdbFreeIterator(it);
254 +            continue;
255 +        }
256 +            
257 +        rpmMessage(RPMMESS_DEBUG, "%s -> %s\n",N,hname);
258 +        
259 +               ds = rpmdsSingle(RPMTAG_REQUIRENAME, hname, "", RPMSENSE_FIND_REQUIRES);
260 +               xx = rpmdsMerge(&fc->requires, ds);
261 +               ds = rpmdsFree(ds);
262 +
263 +        rpmdbFreeIterator(it);
264 +    }
265 +
266 +    noautoreqdep = rpmfcFreeRegexps(noautoreqdep, noautoreqdep_c);
267 +    ts = rpmtsFree(ts);
268 +    return 0;
269 +}
270 +
271  int rpmfcApply(rpmfc fc)
272  {
273      rpmfcApplyTbl fcat;
274 @@ -880,6 +1070,26 @@
275      int i;
276      int xx;
277      int skipping;
278 +    int j;
279 +    regex_t *noautoprovfiles = NULL;
280 +    int noautoprovfiles_c;
281 +    regex_t *noautoreqfiles = NULL;
282 +    int noautoreqfiles_c;
283 +    const char *buildroot;
284 +    int buildroot_l;
285 +
286 +    fc->noautoprov = NULL;
287 +    fc->noautoreq = NULL;
288 +
289 +    buildroot = rpmExpand("%{buildroot}",NULL);
290 +    buildroot_l = strlen(buildroot);
291 +    
292 +    noautoprovfiles = rpmfcExpandRegexps("%{__noautoprovfiles}", &noautoprovfiles_c);
293 +    noautoreqfiles = rpmfcExpandRegexps("%{__noautoreqfiles}", &noautoreqfiles_c);
294 +    fc->noautoprov = rpmfcExpandRegexps("%{__noautoprov}", &fc->noautoprov_c);
295 +    fc->noautoreq = rpmfcExpandRegexps("%{__noautoreq}", &fc->noautoreq_c);
296 +    rpmMessage(RPMMESS_DEBUG, _("%i _noautoprov patterns.\n"), fc->noautoprov_c);
297 +    rpmMessage(RPMMESS_DEBUG, _("%i _noautoreq patterns.\n"), fc->noautoreq_c);
298  
299      /* Generate package and per-file dependencies. */
300      for (fc->ix = 0; fc->fn[fc->ix] != NULL; fc->ix++) {
301 @@ -900,9 +1110,43 @@
302         for (fcat = rpmfcApplyTable; fcat->func != NULL; fcat++) {
303             if (!(fc->fcolor->vals[fc->ix] & fcat->colormask))
304                 /*@innercontinue@*/ continue;
305 +           fc->findprov = 1;
306 +           fc->findreq = 1;
307 +           if (strncmp(fc->fn[fc->ix],buildroot,buildroot_l)==0) {/* sanity check */
308 +                   for(j = 0; j < noautoprovfiles_c; j++) {
309 +                           if (!regexec(&noautoprovfiles[j],
310 +                                                   fc->fn[fc->ix] + buildroot_l, 0, NULL, 0)) {
311 +                                   rpmMessage(RPMMESS_NORMAL,
312 +                                                   _("skipping %s provides detection"
313 +                                                           " (matches noautoprovfiles pattern #%i)\n"),
314 +                                                   fc->fn[fc->ix], j);
315 +                                   fc->findprov = 0;
316 +                                   break;
317 +                           }
318 +                   }
319 +                   for(j = 0; j < noautoreqfiles_c; j++) {
320 +                           if (!regexec(&noautoreqfiles[j],
321 +                                                   fc->fn[fc->ix] + buildroot_l, 0, NULL, 0)) {
322 +                                   rpmMessage(RPMMESS_NORMAL,
323 +                                                   _("skipping %s requires detection"
324 +                                                           " (matches noautoreqfiles pattern #%i)\n"),
325 +                                                   fc->fn[fc->ix], j);
326 +                                   fc->findreq = 0;
327 +                                   break;
328 +                           }
329 +                   }
330 +           }
331 +
332             xx = (*fcat->func) (fc);
333         }
334      }
335 +    noautoprovfiles = rpmfcFreeRegexps(noautoprovfiles, noautoprovfiles_c);
336 +    noautoreqfiles = rpmfcFreeRegexps(noautoreqfiles, noautoreqfiles_c);
337 +    fc->noautoprov = rpmfcFreeRegexps(fc->noautoprov, fc->noautoprov_c);
338 +    fc->noautoreq = rpmfcFreeRegexps(fc->noautoreq, fc->noautoreq_c);
339 +#ifdef AUTODEP_PKGNAMES /* define to use package names in R */
340 +    rpmfcFindRequiredPackages(fc);
341 +#endif
342  
343  /*@-boundswrite@*/
344      /* Generate per-file indices into package dependencies. */
345 #--- rpm-4.4.9/po/pl.po.orig    2007-05-22 08:11:40.947724921 +0200
346 #+++ rpm-4.4.9/po/pl.po 2007-05-22 08:24:24.091213990 +0200
347 #@@ -2937,6 +2937,86 @@
348 # msgid "Failed to find %s:\n"
349 # msgstr "Nie uda³o siê odnale¼æ %s:\n"
350
351 #+#: lib/rpmfc.c:334
352 #+#, c-format
353 #+msgid "Compilation of regular expresion '%s' (expanded from '%s') failed. Skipping it.\n"
354 #+msgstr "Kompilacja wyra¿enia regularnego '%s' (powsta³ego z '%s') nie powiod³a siê; pominiêto.\n"
355 #+
356 #+#: lib/rpmfc.c:395
357 #+#, c-format
358 #+msgid "%i _noautoprov patterns.\n"
359 #+msgstr "%i wzorców _noautoprov.\n"
360 #+
361 #+#: lib/rpmfc.c:405
362 #+#, c-format
363 #+msgid "%i _noautoreq patterns.\n"
364 #+msgstr "%i wzorców _noautoreq.\n"
365 #+
366 #+#: lib/rpmfc.c:459
367 #+#, c-format
368 #+msgid "Checking %c: '%s' against _noauto expr. #%i\n"
369 #+msgstr "Sprawdzanie %c: '%s' z wyra¿eniem _noauto #%i\n"
370 #+
371 #+#: lib/rpmfc.c:462
372 #+#, c-format
373 #+msgid "Skipping %c: '%s' as it matches _noauto expr. #%i\n"
374 #+msgstr "Pominiêto %c: '%s' pasuj±ce do wyra¿enia _noauto #%i\n"
375 #+
376 #+#. XXX ts created in main() should be used
377 #+#: lib/rpmfc.c:1173
378 #+msgid "Searching for required packages....\n"
379 #+msgstr "Poszukiwanie wymaganych pakietów...\n"
380 #+
381 #+#: lib/rpmfc.c:1197
382 #+#, c-format
383 #+msgid "#%i requires: %s,%s,%i\n"
384 #+msgstr "#%i wymaga: %s,%s,%i\n"
385 #+
386 #+#: lib/rpmfc.c:1199
387 #+#, c-format
388 #+msgid "skipping #%i require\n"
389 #+msgstr "pominiêto zale¿no¶æ #%i\n"
390 #+
391 #+#: lib/rpmfc.c:1205
392 #+#, c-format
393 #+msgid "skipping %s requirement processing (matches noautoreqdep pattern #%i)\n"
394 #+msgstr "pominiêto przetwarzanie zale¿no¶ci %s (pasuje do wzorca noautoreqdep #%i)\n"
395 #+
396 #+#: lib/rpmfc.c:1211
397 #+#, c-format
398 #+msgid "skipping #%i require (is file requirement)\n"
399 #+msgstr "pominiêto zale¿no¶æ #%i (zale¿no¶æ od pliku)\n"
400 #+
401 #+#: lib/rpmfc.c:1216
402 #+#, c-format
403 #+msgid "%s -> not found\n"
404 #+msgstr "%s -> nie znaleziono\n"
405 #+
406 #+#: lib/rpmfc.c:1219
407 #+#, c-format
408 #+msgid "Iterator: %p\n"
409 #+msgstr "Iterator: %p\n"
410 #+
411 #+#: lib/rpmfc.c:1221
412 #+#, c-format
413 #+msgid "%s -> multiple (skipping)\n"
414 #+msgstr "%s -> wiele (pominiêto)\n"
415 #+
416 #+#: lib/rpmfc.c:1230
417 #+#, c-format
418 #+msgid "%s -> %s (skipping)\n"
419 #+msgstr "%s -> %s (pominiêto)\n"
420 #+
421 #+#: lib/rpmfc.c:1295
422 #+#, c-format
423 #+msgid "skipping %s provides detection (matches noautoprovfiles pattern #%i)\n"
424 #+msgstr "pominiêto wykrywanie w³asno¶ci %s (pasuje do wzorca noautoprovfiles #%i)\n"
425 #+
426 #+#: lib/rpmfc.c:1306
427 #+#, c-format
428 #+msgid "skipping %s requires detection (matches noautoreqfiles pattern #%i)\n"
429 #+msgstr "pominiêto wykrywanie w³asno¶ci %s (pasuje do wzorca noautoreqfiles #%i)\n"
430 #+
431 # #: lib/rpmfi.c:622
432 # #, c-format
433 --- rpm/configure.ac.orig       2004-08-22 13:02:30.000000000 +0200
434 +++ rpm/configure.ac    2004-08-22 13:25:37.000000000 +0200
435 @@ -971,6 +971,18 @@
436  AC_SUBST(__CHGRP_RHF)
437  
438  dnl
439 +dnl enable generating autorequires containing packages names 
440 +dnl
441 +AC_ARG_ENABLE([adding-packages-names-in-autogenerated-dependancies],
442 +             [  --enable-adding-packages-names-in-autogenerated-dependancies   Add packages names for autogenerated dependancies to requires],
443 +        
444 +               AC_MSG_RESULT([Using packages names in autogerated requires is enabled])
445 +               AC_DEFINE(AUTODEP_PKGNAMES, 1, "Generating autorequires containing packages names.") 
446 +       
447 +             )
448 +
449 +
450 +dnl
451  dnl figure out what root's primary group is
452  dnl
453  AC_MSG_CHECKING(root's primary group)
454 --- rpm-4.5/lib/rpmfc.c~        2008-06-11 01:02:40.000000000 +0300
455 +++ rpm-4.5/lib/rpmfc.c 2008-06-11 01:04:54.048916180 +0300
456 @@ -382,12 +382,9 @@
457   * @param fc           file classifier
458   * @param deptype      'P' == Provides:, 'R' == Requires:, helper
459   * @param nsdep                class name for interpreter (e.g. "perl")
460 - * @param noauto       _noauto* regexps
461 - * @param noauto_c     # of _noauto* regexps
462   * @return             0 on success
463   */
464 -static int rpmfcHelper(rpmfc fc, unsigned char deptype, const char * nsdep,
465 -    regex_t * noauto, int noauto_c)
466 +static int rpmfcHelper(rpmfc fc, unsigned char deptype, const char * nsdep)
467         /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
468         /*@modifies fc, rpmGlobalMacroContext, fileSystem, internalState @*/
469  {
470 @@ -405,6 +402,8 @@
471      int pac;
472      int xx;
473      int i;
474 +    regex_t * noauto = fc->noauto;
475 +    int noauto_c = fc->noauto_c;
476  
477      switch (deptype) {
478      default:
479 --- rpm-4.5/lib/rpmfc.c~        2008-06-11 01:04:54.000000000 +0300
480 +++ rpm-4.5/lib/rpmfc.c 2008-06-11 01:10:06.222936657 +0300
481 @@ -410,7 +410,7 @@
482         return -1;
483         /*@notreached@*/ break;
484      case 'P':
485 -       if (fc->skipProv)
486 +       if (fc->skipProv || !fc->findprov)
487             return 0;
488         xx = snprintf(buf, sizeof(buf), "%%{?__%s_provides}", nsdep);
489         depsp = &fc->provides;
490 @@ -418,7 +418,7 @@
491         tagN = RPMTAG_PROVIDENAME;
492         break;
493      case 'R':
494 -       if (fc->skipReq)
495 +       if (fc->skipReq || !fc->findreq)
496             return 0;
497         xx = snprintf(buf, sizeof(buf), "%%{?__%s_requires}", nsdep);
498         depsp = &fc->requires;
499 --- rpm-4.5/lib/rpmfc.c~        2008-06-11 01:11:33.000000000 +0300
500 +++ rpm-4.5/lib/rpmfc.c 2008-06-11 01:16:17.084344647 +0300
501 @@ -402,8 +402,8 @@
502      int pac;
503      int xx;
504      int i;
505 -    regex_t * noauto = fc->noauto;
506 -    int noauto_c = fc->noauto_c;
507 +    regex_t * noauto = NULL;
508 +    int noauto_c = 0;
509  
510      switch (deptype) {
511      default:
512 @@ -412,6 +412,8 @@
513      case 'P':
514         if (fc->skipProv || !fc->findprov)
515             return 0;
516 +       noauto = fc->noautoprov;
517 +       noauto_c = fc->noautoprov_c;
518         xx = snprintf(buf, sizeof(buf), "%%{?__%s_provides}", nsdep);
519         depsp = &fc->provides;
520         dsContext = RPMSENSE_FIND_PROVIDES;
521 @@ -420,6 +422,8 @@
522      case 'R':
523         if (fc->skipReq || !fc->findreq)
524             return 0;
525 +       noauto = fc->noautoreq;
526 +       noauto_c = fc->noautoreq_c;
527         xx = snprintf(buf, sizeof(buf), "%%{?__%s_requires}", nsdep);
528         depsp = &fc->requires;
529         dsContext = RPMSENSE_FIND_REQUIRES;
530 #--- rpm-4.5/lib/rpmfc.c~       2008-06-11 00:28:21.000000000 +0300
531 #+++ rpm-4.5/lib/rpmfc.c        2008-06-11 00:37:51.675282123 +0300
532 #@@ -829,7 +829,6 @@
533 #       }
534 #     } else
535 #     if (fc->fcolor->vals[fc->ix] & RPMFC_PYTHON) {
536 #-      xx = rpmfcHelper(fc, 'P', "python");
537 #       if (fc->findprov)
538 #           xx = rpmfcHelper(fc, 'P', "python", fc->noautoprov, fc->noautoprov_c);
539 # #ifdef        NOTYET
540 #--- rpm-4.5/lib/rpmfc.c~       2008-06-11 00:37:51.000000000 +0300
541 #+++ rpm-4.5/lib/rpmfc.c        2008-06-11 00:39:12.427942547 +0300
542 #@@ -876,7 +876,8 @@
543 #           xx = rpmfcHelper(fc, 'R', "java", fc->noautoreq, fc->noautoreq_c);
544 #     } else
545 #     if (fc->fcolor->vals[fc->ix] & RPMFC_DESKTOP_FILE) {
546 #-      xx = rpmfcHelper(fc, 'P', "mimetype");
547 #+      if (fc->findprov)
548 #+          xx = rpmfcHelper(fc, 'P', "mimetype", fc->noautoprov, fc->noautoprov_c);
549 #     }
550
551 #     return 0;
552 --- rpm-4.4.8/lib/rpmfc.c.orig  2007-02-14 07:31:50.000000000 +0100
553 +++ rpm-4.4.8/lib/rpmfc.c       2007-04-08 16:48:00.273560592 +0200
554 @@ -773,7 +773,7 @@
555      } else
556      if (fc->fcolor->vals[fc->ix] & RPMFC_PHP) {
557         xx = rpmfcHelper(fc, 'P', "php");
558 -       if (is_executable)
559 +       /* not only executable, files run by httpd usually are not */
560             xx = rpmfcHelper(fc, 'R', "php");
561      }
562  
563