]> git.pld-linux.org Git - packages/rpm.git/blame - rpm-pld-autodep.patch
- ugid.h is installed now
[packages/rpm.git] / rpm-pld-autodep.patch
CommitLineData
0513629a
JB
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
15bdd1bc
JB
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 @@
23e3bf9a
JB
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 /**
1e8c552d
JB
23--- rpm-4.4.9/lib/rpmfc.c.orig 2007-05-22 08:11:41.155736775 +0200
24+++ rpm-4.4.9/lib/rpmfc.c 2007-05-22 08:23:39.964699364 +0200
25@@ -15,6 +15,8 @@
5f8c53f0
JK
26 #define _RPMDS_INTERNAL
27 #include <rpmds.h>
28 #include <rpmfi.h>
29+#include <rpmts.h>
30+#include <rpmdb.h>
31
23e3bf9a
JB
32 #include "debug.h"
33
1e8c552d 34@@ -309,14 +311,83 @@
5f8c53f0
JK
35 return buf;
36 };
37
4bdd0c9c 38+static regex_t * rpmfcExpandRegexps(const char * str,int *count){
5f8c53f0
JK
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,
d327d730
JB
65+ _("Compilation of regular expresion '%s'"
66+ " (expanded from '%s') failed. Skipping it.\n"),
5f8c53f0
JK
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+
4bdd0c9c
JB
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){
5f8c53f0
JK
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
4bdd0c9c
JB
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 {
1e8c552d 119@@ -402,6 +473,8 @@
5f8c53f0
JK
120 }
121 /*@=branchstate@*/
122
4bdd0c9c
JB
123+ if(rpmfcMatchRegexps(noauto, noauto_c, N, deptype))
124+ continue;
5f8c53f0
JK
125
126 /* Add tracking dependency for versioned Provides: */
127 if (!fc->tracked && deptype == 'P' && *EVR != '\0') {
1e8c552d 128@@ -714,7 +787,7 @@
5f8c53f0
JK
129 *se = '\0';
130 se++;
131
132- if (is_executable) {
23e3bf9a 133+ if (is_executable && fc->findreq && !rpmfcMatchRegexps(fc->noautoreq, fc->noautoreq_c, s, 'R')) {
5f8c53f0
JK
134 /* Add to package requires. */
135 ds = rpmdsSingle(RPMTAG_REQUIRENAME, s, "", RPMSENSE_FIND_REQUIRES);
136 xx = rpmdsMerge(&fc->requires, ds);
1e8c552d 137@@ -743,44 +816,52 @@
5f8c53f0
JK
138
139 if (fc->fcolor->vals[fc->ix] & RPMFC_PERL) {
1e8c552d
JB
140 if (strncmp(fn, "/usr/share/doc/", sizeof("/usr/share/doc/")-1)) {
141- if (fc->fcolor->vals[fc->ix] & RPMFC_MODULE)
142- xx = rpmfcHelper(fc, 'P', "perl");
143- if (is_executable || (fc->fcolor->vals[fc->ix] & RPMFC_MODULE))
144- xx = rpmfcHelper(fc, 'R', "perl");
145+ if (fc->findprov && (fc->fcolor->vals[fc->ix] & RPMFC_MODULE))
146+ xx = rpmfcHelper(fc, 'P', "perl", fc->noautoprov, fc->noautoprov_c);
147+ if (fc->findreq && (is_executable || (fc->fcolor->vals[fc->ix] & RPMFC_MODULE)))
148+ xx = rpmfcHelper(fc, 'R', "perl", fc->noautoreq, fc->noautoreq_c);
149 }
23e3bf9a 150 } else
5f8c53f0
JK
151 if (fc->fcolor->vals[fc->ix] & RPMFC_PYTHON) {
152- xx = rpmfcHelper(fc, 'P', "python");
23e3bf9a
JB
153+ if (fc->findprov)
154+ xx = rpmfcHelper(fc, 'P', "python", fc->noautoprov, fc->noautoprov_c);
155 #ifdef NOTYET
156 if (is_executable)
157 #endif
4bdd0c9c 158- xx = rpmfcHelper(fc, 'R', "python");
23e3bf9a
JB
159+ if (fc->findreq)
160+ xx = rpmfcHelper(fc, 'R', "python", fc->noautoreq, fc->noautoreq_c);
161 } else
162 if (fc->fcolor->vals[fc->ix] & RPMFC_LIBTOOL) {
163- xx = rpmfcHelper(fc, 'P', "libtool");
164+ if (fc->findprov)
165+ xx = rpmfcHelper(fc, 'P', "libtool", fc->noautoprov, fc->noautoprov_c);
166 #ifdef NOTYET
167 if (is_executable)
168 #endif
169- xx = rpmfcHelper(fc, 'R', "libtool");
170+ if (fc->findreq)
171+ xx = rpmfcHelper(fc, 'R', "libtool", fc->noautoreq, fc->noautoreq_c);
172 } else
173 if (fc->fcolor->vals[fc->ix] & RPMFC_PKGCONFIG) {
174- xx = rpmfcHelper(fc, 'P', "pkgconfig");
175+ if (fc->findprov)
176+ xx = rpmfcHelper(fc, 'P', "pkgconfig", fc->noautoprov, fc->noautoprov_c);
177 #ifdef NOTYET
178 if (is_executable)
179 #endif
180- xx = rpmfcHelper(fc, 'R', "pkgconfig");
181+ if (fc->findreq)
bab644a3 182+ xx = rpmfcHelper(fc, 'R', "pkgconfig", fc->noautoreq, fc->noautoreq_c);
23e3bf9a
JB
183 } else
184 if (fc->fcolor->vals[fc->ix] & RPMFC_BOURNE) {
185 #ifdef NOTYET
186 xx = rpmfcHelper(fc, 'P', "executable");
187 #endif
188- if (is_executable)
189- xx = rpmfcHelper(fc, 'R', "executable");
190+ if (fc->findreq && is_executable)
191+ xx = rpmfcHelper(fc, 'R', "executable", fc->noautoreq, fc->noautoreq_c);
0513629a 192 } else
5f8c53f0 193 if (fc->fcolor->vals[fc->ix] & RPMFC_PHP) {
0513629a
JB
194- xx = rpmfcHelper(fc, 'P', "php");
195+ if (fc->findprov)
196+ xx = rpmfcHelper(fc, 'P', "php", fc->noautoprov, fc->noautoprov_c);
197 /* not only executable, files run by httpd usually are not */
5f8c53f0 198- xx = rpmfcHelper(fc, 'R', "php");
0513629a 199+ if (fc->findreq)
52128679 200+ xx = rpmfcHelper(fc, 'R', "php", fc->noautoreq, fc->noautoreq_c);
0513629a 201 }
5f8c53f0
JK
202
203 return 0;
1e8c552d 204@@ -808,20 +889,26 @@
23e3bf9a
JB
205 default:
206 break;
207 case RPMTAG_PROVIDENAME:
15bdd1bc 208+ if (fc->findprov && !rpmfcMatchRegexps(fc->noautoprov, fc->noautoprov_c, ds->N[0], 'P')) {
23e3bf9a
JB
209 /* Add to package provides. */
210 rc = rpmdsMerge(&fc->provides, ds);
4bdd0c9c 211
23e3bf9a
JB
212 /* Add to file dependencies. */
213 buf[0] = '\0';
214 rc = rpmfcSaveArg(&fc->ddict, rpmfcFileDep(buf, fc->ix, ds));
215+ } else
216+ rc = 0;
217 break;
218 case RPMTAG_REQUIRENAME:
15bdd1bc 219+ if (fc->findreq && !rpmfcMatchRegexps(fc->noautoreq, fc->noautoreq_c, ds->N[0], 'R')) {
23e3bf9a
JB
220 /* Add to package requires. */
221 rc = rpmdsMerge(&fc->requires, ds);
5f8c53f0 222
15bdd1bc
JB
223 /* Add to file dependencies. */
224 buf[0] = '\0';
225 rc = rpmfcSaveArg(&fc->ddict, rpmfcFileDep(buf, fc->ix, ds));
226+ } else
227+ rc = 0;
228 break;
229 }
230 return rc;
1e8c552d 231@@ -862,6 +949,109 @@
5f8c53f0
JK
232 { NULL, 0 }
233 };
234
4bdd0c9c 235+static int rpmfcFindRequiredPackages(rpmfc fc)
5f8c53f0
JK
236+{
237+ rpmts ts=NULL;
238+ const char * s;
239+ char * se;
240+ rpmds ds;
241+ const char * N;
242+ const char * EVR;
243+ int_32 Flags;
244+ unsigned char deptype;
245+ int nddict;
246+ int previx;
247+ int ix;
248+ int i;
249+ int j;
250+ int xx;
251+ int r;
252+ const char * hname;
253+ rpmdbMatchIterator it;
254+ Header hdr;
255+ regex_t *noautoreqdep;
256+ int noautoreqdep_c;
257+
7ce4c2db 258+ noautoreqdep=rpmfcExpandRegexps("%{__noautoreqdep}", &noautoreqdep_c);
5f8c53f0
JK
259+
260+ ts = rpmtsCreate(); /* XXX ts created in main() should be used */
261+
d327d730 262+ rpmMessage(RPMMESS_NORMAL, _("Searching for required packages....\n"));
5f8c53f0
JK
263+
264+ nddict = argvCount(fc->ddict);
265+ previx = -1;
266+ for (i = 0; i < nddict; i++) {
267+ s = fc->ddict[i];
268+
269+ /* Parse out (file#,deptype,N,EVR,Flags) */
270+ ix = strtol(s, &se, 10);
271+ assert(se != NULL);
272+ deptype = *se++;
273+ se++;
274+ N = se;
275+ while (*se && *se != ' ')
276+ se++;
277+ *se++ = '\0';
278+ EVR = se;
279+ while (*se && *se != ' ')
280+ se++;
281+ *se++ = '\0';
282+ Flags = strtol(se, NULL, 16);
283+
284+ if (deptype!='R') continue;
285+
d327d730 286+ rpmMessage(RPMMESS_DEBUG, _("#%i requires: %s,%s,%i\n"),ix,N,EVR,Flags);
5f8c53f0 287+ if (EVR && EVR[0]) {
d327d730 288+ rpmMessage(RPMMESS_DEBUG, _("skipping #%i require\n"));
5f8c53f0
JK
289+ continue;
290+ }
291+ for(j=0;j<noautoreqdep_c;j++)
292+ if (!regexec(&noautoreqdep[j],N,0,NULL,0)) {
293+ rpmMessage(RPMMESS_NORMAL,
d327d730
JB
294+ _("skipping %s requirement processing"
295+ " (matches noautoreqdep pattern #%i)\n"),N,j);
5f8c53f0
JK
296+ break;
297+ }
298+ if (j<noautoreqdep_c) continue;
299+ if (N[0]=='/') {
d327d730 300+ rpmMessage(RPMMESS_DEBUG, _("skipping #%i require (is file requirement)\n"));
5f8c53f0
JK
301+ continue;
302+ }
303+ it=rpmtsInitIterator(ts, RPMTAG_PROVIDENAME, N, 0);
304+ if (!it) {
d327d730 305+ rpmMessage(RPMMESS_DEBUG, _("%s -> not found\n"),N);
5f8c53f0
JK
306+ continue;
307+ }
d327d730 308+ rpmMessage(RPMMESS_DEBUG, _("Iterator: %p\n"),it);
5f8c53f0 309+ if (rpmdbGetIteratorCount(it)>1) {
d327d730 310+ rpmMessage(RPMMESS_DEBUG, _("%s -> multiple (skipping)\n"),N);
5f8c53f0
JK
311+ rpmdbFreeIterator(it);
312+ continue;
313+ }
314+ hdr=rpmdbNextIterator(it);
315+ assert(hdr!=NULL);
6efed78b 316+ r=headerGetEntry(hdr,RPMTAG_NAME,NULL,(void **)&hname, NULL);
5f8c53f0
JK
317+ assert(r<2);
318+ if (!strcmp(hname,N)) {
d327d730 319+ rpmMessage(RPMMESS_DEBUG, _("%s -> %s (skipping)\n"),N,hname);
5f8c53f0
JK
320+ rpmdbFreeIterator(it);
321+ continue;
322+ }
323+
324+ rpmMessage(RPMMESS_DEBUG, "%s -> %s\n",N,hname);
325+
326+ ds = rpmdsSingle(RPMTAG_REQUIRENAME, hname, "", RPMSENSE_FIND_REQUIRES);
327+ xx = rpmdsMerge(&fc->requires, ds);
328+ ds = rpmdsFree(ds);
329+
330+ rpmdbFreeIterator(it);
331+ }
332+
23e3bf9a 333+ noautoreqdep = rpmfcFreeRegexps(noautoreqdep, noautoreqdep_c);
5f8c53f0
JK
334+ ts = rpmtsFree(ts);
335+ return 0;
336+}
337+
338 int rpmfcApply(rpmfc fc)
339 {
340 rpmfcApplyTbl fcat;
1e8c552d 341@@ -880,6 +1070,26 @@
5f8c53f0
JK
342 int i;
343 int xx;
505bb97c 344 int skipping;
5f8c53f0 345+ int j;
4bdd0c9c 346+ regex_t *noautoprovfiles = NULL;
5f8c53f0 347+ int noautoprovfiles_c;
4bdd0c9c
JB
348+ regex_t *noautoreqfiles = NULL;
349+ int noautoreqfiles_c;
5f8c53f0
JK
350+ const char *buildroot;
351+ int buildroot_l;
352+
23e3bf9a
JB
353+ fc->noautoprov = NULL;
354+ fc->noautoreq = NULL;
355+
4bdd0c9c
JB
356+ buildroot = rpmExpand("%{buildroot}",NULL);
357+ buildroot_l = strlen(buildroot);
5f8c53f0 358+
7ce4c2db
JB
359+ noautoprovfiles = rpmfcExpandRegexps("%{__noautoprovfiles}", &noautoprovfiles_c);
360+ noautoreqfiles = rpmfcExpandRegexps("%{__noautoreqfiles}", &noautoreqfiles_c);
23e3bf9a
JB
361+ fc->noautoprov = rpmfcExpandRegexps("%{__noautoprov}", &fc->noautoprov_c);
362+ fc->noautoreq = rpmfcExpandRegexps("%{__noautoreq}", &fc->noautoreq_c);
363+ rpmMessage(RPMMESS_DEBUG, _("%i _noautoprov patterns.\n"), fc->noautoprov_c);
364+ rpmMessage(RPMMESS_DEBUG, _("%i _noautoreq patterns.\n"), fc->noautoreq_c);
5f8c53f0
JK
365
366 /* Generate package and per-file dependencies. */
367 for (fc->ix = 0; fc->fn[fc->ix] != NULL; fc->ix++) {
1e8c552d 368@@ -900,9 +1110,43 @@
5f8c53f0
JK
369 for (fcat = rpmfcApplyTable; fcat->func != NULL; fcat++) {
370 if (!(fc->fcolor->vals[fc->ix] & fcat->colormask))
371 /*@innercontinue@*/ continue;
23e3bf9a
JB
372+ fc->findprov = 1;
373+ fc->findreq = 1;
5f8c53f0 374+ if (strncmp(fc->fn[fc->ix],buildroot,buildroot_l)==0) {/* sanity check */
c7d56820
AM
375+ for(j = 0; j < noautoprovfiles_c; j++) {
376+ if (!regexec(&noautoprovfiles[j],
377+ fc->fn[fc->ix] + buildroot_l, 0, NULL, 0)) {
378+ rpmMessage(RPMMESS_NORMAL,
379+ _("skipping %s provides detection"
380+ " (matches noautoprovfiles pattern #%i)\n"),
381+ fc->fn[fc->ix], j);
382+ fc->findprov = 0;
383+ break;
384+ }
5f8c53f0 385+ }
c7d56820
AM
386+ for(j = 0; j < noautoreqfiles_c; j++) {
387+ if (!regexec(&noautoreqfiles[j],
388+ fc->fn[fc->ix] + buildroot_l, 0, NULL, 0)) {
389+ rpmMessage(RPMMESS_NORMAL,
390+ _("skipping %s requires detection"
391+ " (matches noautoreqfiles pattern #%i)\n"),
392+ fc->fn[fc->ix], j);
393+ fc->findreq = 0;
394+ break;
395+ }
5f8c53f0 396+ }
5f8c53f0 397+ }
c7d56820 398+
23e3bf9a 399 xx = (*fcat->func) (fc);
5f8c53f0
JK
400 }
401 }
7ce4c2db
JB
402+ noautoprovfiles = rpmfcFreeRegexps(noautoprovfiles, noautoprovfiles_c);
403+ noautoreqfiles = rpmfcFreeRegexps(noautoreqfiles, noautoreqfiles_c);
23e3bf9a
JB
404+ fc->noautoprov = rpmfcFreeRegexps(fc->noautoprov, fc->noautoprov_c);
405+ fc->noautoreq = rpmfcFreeRegexps(fc->noautoreq, fc->noautoreq_c);
8e52eb7d 406+#ifdef AUTODEP_PKGNAMES /* define to use package names in R */
7ce4c2db
JB
407+ rpmfcFindRequiredPackages(fc);
408+#endif
c7d56820 409
5f8c53f0
JK
410 /*@-boundswrite@*/
411 /* Generate per-file indices into package dependencies. */
1e8c552d
JB
412--- rpm-4.4.9/po/pl.po.orig 2007-05-22 08:11:40.947724921 +0200
413+++ rpm-4.4.9/po/pl.po 2007-05-22 08:24:24.091213990 +0200
414@@ -2937,6 +2937,86 @@
415 msgid "Failed to find %s:\n"
416