]> git.pld-linux.org Git - packages/rpm.git/blob - rpm-pld-autodep.patch
- updated
[packages/rpm.git] / rpm-pld-autodep.patch
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
4 @@ -979,6 +979,14 @@
5  
6  AC_MSG_HEADER([INSTALLATION PARAMETERS])
7  
8 +dnl enable generating autorequires containing packages names
9 +dnl
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."]))
14 +dnl
15 +
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
22 @@ -17,6 +17,8 @@
23  #define        _RPMDS_INTERNAL
24  #include <rpmds.h>
25  #include <rpmfi.h>
26 +#include <rpmts.h>
27 +#include <rpmdb.h>
28  
29  #include "debug.h"
30  
31 @@ -311,14 +313,83 @@
32      return buf;
33  };
34  
35 +static regex_t * rpmfcExpandRegexps(const char * str,int *count){
36 +    int i,j,r;
37 +    const char *s;
38 +    ARGV_t patterns=NULL;
39 +    regex_t *compiled=NULL;
40 +
41 +    s=rpmExpand(str,NULL);
42 +    if (s) {
43 +       poptParseArgvString(s,count,(const char ***)&patterns);
44 +       s = _free(s);
45 +    }
46 +    if (patterns==NULL){
47 +               *count=0;
48 +       return NULL;
49 +    }
50 +    if (*count==0){
51 +       _free(patterns);
52 +       return NULL;
53 +    }
54 +
55 +    compiled=malloc(sizeof(regex_t)*(*count));
56 +    j=0;
57 +    for(i=0;i<*count;i++){
58 +       r=regcomp(&compiled[j],patterns[i],REG_NOSUB);
59 +       if (r==0) j++;
60 +       else {
61 +               rpmlog(RPMLOG_NOTICE, 
62 +                       _("Compilation of regular expresion '%s'"
63 +                       " (expanded from '%s') failed. Skipping it.\n"),
64 +                       patterns[i],str);
65 +       }
66 +    }
67 +    patterns=_free(patterns);
68 +    if (j==0) {
69 +       compiled=_free(compiled);
70 +       *count=0;
71 +       return NULL;
72 +    }
73 +    *count=j;
74 +    return compiled;
75 +}
76 +
77 +static int rpmfcMatchRegexps(regex_t *regexps, int count, const char *str, char deptype)
78 +{
79 +    int j;
80 +    for(j = 0; j < count; j++) {
81 +       rpmlog(RPMLOG_DEBUG,
82 +           _("Checking %c: '%s' against _noauto expr. #%i\n"), deptype, str, j);
83 +       if (!regexec(&regexps[j], str, 0, NULL, 0)) {
84 +           rpmlog(RPMLOG_NOTICE,
85 +               _("Skipping %c: '%s' as it matches _noauto expr. #%i\n"), deptype, str, j);
86 +           return 1;
87 +       }
88 +    }
89 +    return 0;
90 +}
91 +
92 +static regex_t * rpmfcFreeRegexps(regex_t *regexps,int count){
93 +    int i;
94 +       
95 +    if (regexps)
96 +        for(i=0;i<count;i++)
97 +           regfree(&regexps[i]);
98 +    return _free(regexps);
99 +}
100 +
101  /**
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
109   */
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 @*/
115  {
116 @@ -404,6 +475,8 @@
117             }
118  /*@=branchstate@*/
119  
120 +           if(rpmfcMatchRegexps(noauto, noauto_c, N, deptype))
121 +               continue;
122  
123             /* Add tracking dependency for versioned Provides: */
124             if (!fc->tracked && deptype == 'P' && *EVR != '\0') {
125 @@ -718,7 +791,7 @@
126         *se = '\0';
127         se++;
128  
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 @@
135  
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);
146         }
147      } else
148      if (fc->fcolor->vals[fc->ix] & RPMFC_PYTHON) {
149 -       xx = rpmfcHelper(fc, 'P', "python");
150 +       if (fc->findprov)
151 +       xx = rpmfcHelper(fc, 'P', "python", fc->noautoprov, fc->noautoprov_c);
152  #ifdef NOTYET
153         if (is_executable)
154  #endif
155 -           xx = rpmfcHelper(fc, 'R', "python");
156 +           if (fc->findreq)
157 +           xx = rpmfcHelper(fc, 'R', "python", fc->noautoreq, fc->noautoreq_c);
158      } else
159      if (fc->fcolor->vals[fc->ix] & RPMFC_LIBTOOL) {
160 -       xx = rpmfcHelper(fc, 'P', "libtool");
161 +       if (fc->findprov)
162 +       xx = rpmfcHelper(fc, 'P', "libtool", fc->noautoprov, fc->noautoprov_c);
163  #ifdef NOTYET
164         if (is_executable)
165  #endif
166 -           xx = rpmfcHelper(fc, 'R', "libtool");
167 +           if (fc->findreq)
168 +           xx = rpmfcHelper(fc, 'R', "libtool", fc->noautoreq, fc->noautoreq_c);
169      } else
170      if (fc->fcolor->vals[fc->ix] & RPMFC_PKGCONFIG) {
171 -       xx = rpmfcHelper(fc, 'P', "pkgconfig");
172 +       if (fc->findprov)
173 +       xx = rpmfcHelper(fc, 'P', "pkgconfig", fc->noautoprov, fc->noautoprov_c);
174  #ifdef NOTYET
175         if (is_executable)
176  #endif
177 -           xx = rpmfcHelper(fc, 'R', "pkgconfig");
178 +           if (fc->findreq)
179 +           xx = rpmfcHelper(fc, 'R', "pkgconfig", fc->noautoreq, fc->noautoreq_c);
180      } else
181      if (fc->fcolor->vals[fc->ix] & RPMFC_BOURNE) {
182  #ifdef NOTYET
183 -       xx = rpmfcHelper(fc, 'P', "executable");
184 +       if (fc->findprov)
185 +       xx = rpmfcHelper(fc, 'P', "executable", fc->noautoprov, fc->noautoprov_c);
186  #endif
187         if (is_executable)
188 -           xx = rpmfcHelper(fc, 'R', "executable");
189 +           if (fc->findreq)
190 +           xx = rpmfcHelper(fc, 'R', "executable", fc->noautoreq, fc->noautoreq_c);
191      } else
192      if (fc->fcolor->vals[fc->ix] & RPMFC_PHP) {
193 -       xx = rpmfcHelper(fc, 'P', "php");
194 +       if (fc->findprov)
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");
198 +           if (fc->findreq)
199 +           xx = rpmfcHelper(fc, 'R', "php", fc->noautoreq, fc->noautoreq_c);
200      } else
201      if (fc->fcolor->vals[fc->ix] & RPMFC_MONO) {
202 -       xx = rpmfcHelper(fc, 'P', "mono");
203 +       if (fc->findprov)
204 +       xx = rpmfcHelper(fc, 'P', "mono", fc->noautoprov, fc->noautoprov_c);
205         if (is_executable)
206 -           xx = rpmfcHelper(fc, 'R', "mono");
207 +           if (fc->findreq)
208 +           xx = rpmfcHelper(fc, 'R', "mono", fc->noautoreq, fc->noautoreq_c);
209      }
210      return 0;
211  }
212 @@ -816,20 +901,26 @@
213      default:
214         break;
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);
219  
220         /* Add to file dependencies. */
221         buf[0] = '\0';
222         rc = rpmfcSaveArg(&fc->ddict, rpmfcFileDep(buf, fc->ix, ds));
223 +       } else
224 +               rc = 0;
225         break;
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);
230  
231         /* Add to file dependencies. */
232         buf[0] = '\0';
233         rc = rpmfcSaveArg(&fc->ddict, rpmfcFileDep(buf, fc->ix, ds));
234 +       } else
235 +               rc = 0;
236         break;
237      }
238      return rc;
239 @@ -870,6 +961,109 @@
240      { NULL, 0 }
241  };
242  
243 +static int rpmfcFindRequiredPackages(rpmfc fc) 
244 +{
245 +    rpmts ts=NULL;
246 +    const char * s;
247 +    char * se;
248 +    rpmds ds;
249 +    const char * N;
250 +    const char * EVR;
251 +    int32_t Flags;
252 +    unsigned char deptype;
253 +    int nddict;
254 +    int previx;
255 +    int ix;
256 +    int i;
257 +    int j;
258 +    int xx;
259 +    int r;
260 +    const char * hname;
261 +    rpmdbMatchIterator it;
262 +    Header hdr;
263 +    regex_t *noautoreqdep;
264 +    int noautoreqdep_c;
265 +
266 +    noautoreqdep=rpmfcExpandRegexps("%{__noautoreqdep}", &noautoreqdep_c);
267 +    
268 +    ts = rpmtsCreate(); /* XXX ts created in main() should be used */
269 +    
270 +    rpmlog(RPMLOG_NOTICE, _("Searching for required packages....\n"));
271 +
272 +    nddict = argvCount(fc->ddict);
273 +    previx = -1;
274 +    for (i = 0; i < nddict; i++) {
275 +        s = fc->ddict[i];
276 +
277 +        /* Parse out (file#,deptype,N,EVR,Flags) */
278 +        ix = strtol(s, &se, 10);
279 +        assert(se != NULL);
280 +        deptype = *se++;
281 +        se++;
282 +        N = se;
283 +        while (*se && *se != ' ')
284 +            se++;
285 +        *se++ = '\0';
286 +        EVR = se;
287 +        while (*se && *se != ' ')
288 +            se++;
289 +        *se++ = '\0';
290 +        Flags = strtol(se, NULL, 16);
291 +
292 +        if (deptype!='R') continue;
293 +
294 +        rpmlog(RPMLOG_DEBUG, _("#%i requires: %s,%s,%i\n"),ix,N,EVR,Flags);
295 +        if (EVR && EVR[0]) {
296 +            rpmlog(RPMLOG_DEBUG, _("skipping #%i require\n"));
297 +            continue;
298 +        }
299 +        for(j=0;j<noautoreqdep_c;j++) 
300 +            if (!regexec(&noautoreqdep[j],N,0,NULL,0)) {
301 +                rpmlog(RPMLOG_NOTICE, 
302 +                        _("skipping %s requirement processing"
303 +                       " (matches noautoreqdep pattern #%i)\n"),N,j);
304 +                break;
305 +            }
306 +        if (j<noautoreqdep_c) continue;
307 +        if (N[0]=='/') {
308 +            rpmlog(RPMLOG_DEBUG, _("skipping #%i require (is file requirement)\n"));
309 +            continue;
310 +        }
311 +        it=rpmtsInitIterator(ts, RPMTAG_PROVIDENAME, N, 0);
312 +        if (!it) {
313 +            rpmlog(RPMLOG_DEBUG, _("%s -> not found\n"),N);
314 +            continue;
315 +        }
316 +        rpmlog(RPMLOG_DEBUG, _("Iterator: %p\n"),it);
317 +        if (rpmdbGetIteratorCount(it)>1) {
318 +            rpmlog(RPMLOG_DEBUG, _("%s -> multiple (skipping)\n"),N);
319 +            rpmdbFreeIterator(it);
320 +            continue;
321 +        }
322 +        hdr=rpmdbNextIterator(it);
323 +        assert(hdr!=NULL);
324 +        r=headerGetEntry(hdr,RPMTAG_NAME,NULL,(void **)&hname, NULL);
325 +        assert(r<2);
326 +        if (!strcmp(hname,N)) {
327 +            rpmlog(RPMLOG_DEBUG, _("%s -> %s (skipping)\n"),N,hname);
328 +            rpmdbFreeIterator(it);
329 +            continue;
330 +        }
331 +            
332 +        rpmlog(RPMLOG_DEBUG, "%s -> %s\n",N,hname);
333 +        
334 +               ds = rpmdsSingle(RPMTAG_REQUIRENAME, hname, "", RPMSENSE_FIND_REQUIRES);
335 +               xx = rpmdsMerge(&fc->requires, ds);
336 +               ds = rpmdsFree(ds);
337 +
338 +        rpmdbFreeIterator(it);
339 +    }
340 +
341 +    noautoreqdep = rpmfcFreeRegexps(noautoreqdep, noautoreqdep_c);
342 +    ts = rpmtsFree(ts);
343 +    return 0;
344 +}
345 +
346  rpmRC rpmfcApply(rpmfc fc)
347  {
348      rpmfcApplyTbl fcat;
349 @@ -888,6 +1082,26 @@
350      int i;
351      int xx;
352      int skipping;
353 +    int j;
354 +    regex_t *noautoprovfiles = NULL;
355 +    int noautoprovfiles_c;
356 +    regex_t *noautoreqfiles = NULL;
357 +    int noautoreqfiles_c;
358 +    const char *buildroot;
359 +    int buildroot_l;
360 +
361 +    fc->noautoprov = NULL;
362 +    fc->noautoreq = NULL;
363 +
364 +    buildroot = rpmExpand("%{buildroot}",NULL);
365 +    buildroot_l = strlen(buildroot);
366 +    
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 +    rpmlog(RPMLOG_DEBUG, _("%i _noautoprov patterns.\n"), fc->noautoprov_c);
372 +    rpmlog(RPMLOG_DEBUG, _("%i _noautoreq patterns.\n"), fc->noautoreq_c);
373  
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;
380 +           fc->findprov = 1;
381 +           fc->findreq = 1;
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 +                                   rpmlog(RPMLOG_NOTICE,
387 +                                                   _("skipping %s provides detection"
388 +                                                           " (matches noautoprovfiles pattern #%i)\n"),
389 +                                                   fc->fn[fc->ix], j);
390 +                                   fc->findprov = 0;
391 +                                   break;
392 +                           }
393 +                   }
394 +                   for(j = 0; j < noautoreqfiles_c; j++) {
395 +                           if (!regexec(&noautoreqfiles[j],
396 +                                                   fc->fn[fc->ix] + buildroot_l, 0, NULL, 0)) {
397 +                                   rpmlog(RPMLOG_NOTICE,
398 +                                                   _("skipping %s requires detection"
399 +                                                           " (matches noautoreqfiles pattern #%i)\n"),
400 +                                                   fc->fn[fc->ix], j);
401 +                                   fc->findreq = 0;
402 +                                   break;
403 +                           }
404 +                   }
405 +           }
406 +
407             xx = (*fcat->func) (fc);
408         }
409      }
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);
416 +#endif
417  
418  /*@-boundswrite@*/
419      /* Generate per-file indices into package dependencies. */
420 diff -ur rpm.org/lib/rpmfc.h rpm/lib/rpmfc.h
421 --- rpm.org/lib/rpmfc.h 2007-07-14 05:22:44.000000000 +0200
422 +++ rpm/lib/rpmfc.h     2007-10-02 14:49:18.731230377 +0200
423 @@ -98,6 +98,11 @@
424      StringBuf sb_python;/*!< concatenated list of python colored files. */
425      StringBuf sb_php;  /*!< concatenated list of php colored files. */
426  
427 +    int findprov, findreq;
428 +    regex_t *noautoprov;
429 +    int noautoprov_c;
430 +    regex_t *noautoreq;
431 +    int noautoreq_c;
432  };
433  
434  /**
435 --- rpm/lib/rpmfc.h.org 2007-10-02 15:05:48.028299804 +0200
436 +++ rpm/lib/rpmfc.h     2007-10-02 15:06:03.052024633 +0200
437 @@ -67,6 +67,13 @@
438  };
439  
440  #if defined(_RPMFC_INTERNAL)
441 +
442 +#if defined(WITH_PCRE) && defined(HAVE_PCREPOSIX_H)
443 +#include <pcreposix.h>
444 +#else
445 +#include <regex.h>
446 +#endif
447 +
448  /**
449   */
450  struct rpmfc_s {
This page took 0.067852 seconds and 3 git commands to generate.