]> git.pld-linux.org Git - packages/rpm.git/blame - rpm-pld-autodep.patch
- all _noauto and require-package-with-required-capability support in one
[packages/rpm.git] / rpm-pld-autodep.patch
CommitLineData
5f8c53f0
JK
1diff -dur rpm-4.3.orig/build/rpmfc.c rpm-4.3/build/rpmfc.c
2--- rpm-4.3.orig/build/rpmfc.c 2004-01-16 14:21:42.283166337 +0100
3+++ rpm-4.3/build/rpmfc.c 2004-01-16 14:38:10.000000000 +0100
4@@ -1,6 +1,7 @@
5 #include "system.h"
6
7 #include <signal.h> /* getOutputFrom() */
8+#include <regex.h>
9
10 #include <rpmbuild.h>
11 #include <argv.h>
12@@ -9,6 +10,8 @@
13 #define _RPMDS_INTERNAL
14 #include <rpmds.h>
15 #include <rpmfi.h>
16+#include <rpmts.h>
17+#include <rpmdb.h>
18
19 #if HAVE_GELF_H
20 #include <gelf.h>
21@@ -301,6 +304,57 @@
22 return buf;
23 };
24
25+regex_t * rpmfcExpandRegexps(const char * str,int *count){
26+ int i,j,r;
27+ const char *s;
28+ ARGV_t patterns=NULL;
29+ regex_t *compiled=NULL;
30+
31+ s=rpmExpand(str,NULL);
32+ if (s) {
33+ poptParseArgvString(s,count,(const char ***)&patterns);
34+ s = _free(s);
35+ }
36+ if (patterns==NULL){
37+ *count=0;
38+ return NULL;
39+ }
40+ if (*count==0){
41+ _free(patterns);
42+ return NULL;
43+ }
44+
45+ compiled=malloc(sizeof(regex_t)*(*count));
46+ j=0;
47+ for(i=0;i<*count;i++){
48+ r=regcomp(&compiled[j],patterns[i],REG_NOSUB);
49+ if (r==0) j++;
50+ else {
51+ rpmMessage(RPMMESS_NORMAL,
52+ "Compilation of regular expresion '%s'"
53+ " (expanded from '%s') failed. Skipping it.\n",
54+ patterns[i],str);
55+ }
56+ }
57+ patterns=_free(patterns);
58+ if (j==0) {
59+ compiled=_free(compiled);
60+ *count=0;
61+ return NULL;
62+ }
63+ *count=j;
64+ return compiled;
65+}
66+
67+regex_t * rpmfcFreeRegexps(regex_t *regexps,int count){
68+ int i;
69+
70+ if (regexps)
71+ for(i=0;i<count;i++)
72+ regfree(&regexps[i]);
73+ return _free(regexps);
74+}
75+
76 /**
77 * Run per-interpreter dependency helper.
78 * @param fc file classifier
79@@ -326,6 +380,9 @@
80 int pac;
81 int xx;
82 int i;
83+ int noauto_c=0;
84+ regex_t *noauto=NULL;
85+ int j;
86
87 switch (deptype) {
88 default:
89@@ -334,6 +391,8 @@
90 case 'P':
91 if (fc->skipProv)
92 return 0;
93+ noauto=rpmfcExpandRegexps("%{_noautoprov}",&noauto_c);
94+ rpmMessage(RPMMESS_DEBUG, "%i _noautoprov patterns.\n",noauto_c);
95 xx = snprintf(buf, sizeof(buf), "%%{?__%s_provides}", nsdep);
96 depsp = &fc->provides;
97 dsContext = RPMSENSE_FIND_PROVIDES;
98@@ -342,6 +401,8 @@
99 case 'R':
100 if (fc->skipReq)
101 return 0;
102+ noauto=rpmfcExpandRegexps("%{_noautoreq}",&noauto_c);
103+ rpmMessage(RPMMESS_DEBUG, "%i _noautoreq patterns.\n",noauto_c);
104 xx = snprintf(buf, sizeof(buf), "%%{?__%s_requires}", nsdep);
105 depsp = &fc->requires;
106 dsContext = RPMSENSE_FIND_REQUIRES;
107@@ -394,6 +455,16 @@
108 }
109 /*@=branchstate@*/
110
111+ for(j=0;j<noauto_c;j++){
112+ rpmMessage(RPMMESS_DEBUG, "Checking %c: '%s'"
113+ " against _noauto expr. #%i\n",deptype,N,j);
114+ if (!regexec(&noauto[j],N,0,NULL,0)) {
115+ rpmMessage(RPMMESS_NORMAL, "Skipping %c: '%s'"
116+ " as it matches _noauto expr. #%i\n",deptype,N,j);
117+ break;
118+ }
119+ }
120+ if (j<noauto_c) continue;
121
122 /* Add tracking dependency for versioned Provides: */
123 if (!fc->tracked && deptype == 'P' && *EVR != '\0') {
124@@ -422,6 +493,7 @@
125 }
126 sb_stdout = freeStringBuf(sb_stdout);
127
128+ noauto=rpmfcFreeRegexps(noauto,noauto_c);
129 return 0;
130 }
131
132@@ -637,9 +709,11 @@
133 /**
134 * Extract script dependencies.
135 * @param fc file classifier
136+ * @param findprov 1 to enable provides
137+ * @param findreq 1 to enable requires
138 * @return 0 on success
139 */
140-static int rpmfcSCRIPT(rpmfc fc)
141+static int rpmfcSCRIPT(rpmfc fc,int findprov,int findreq)
142 /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
143 /*@modifies fc, rpmGlobalMacroContext, fileSystem, internalState @*/
144 {
145@@ -691,7 +765,7 @@
146 *se = '\0';
147 se++;
148
149- if (is_executable) {
150+ if (is_executable && findreq) {
151 /* Add to package requires. */
152 ds = rpmdsSingle(RPMTAG_REQUIRENAME, s, "", RPMSENSE_FIND_REQUIRES);
153 xx = rpmdsMerge(&fc->requires, ds);
154@@ -718,19 +792,22 @@
155 (void) fclose(fp);
156
157 if (fc->fcolor->vals[fc->ix] & RPMFC_PERL) {
158- if (fc->fcolor->vals[fc->ix] & RPMFC_MODULE)
159+ if (findprov && fc->fcolor->vals[fc->ix] & RPMFC_MODULE)
160 xx = rpmfcHelper(fc, 'P', "perl");
161- if (is_executable || (fc->fcolor->vals[fc->ix] & RPMFC_MODULE))
162+ if (findreq && (is_executable || (fc->fcolor->vals[fc->ix] & RPMFC_MODULE)))
163 xx = rpmfcHelper(fc, 'R', "perl");
164 }
165 if (fc->fcolor->vals[fc->ix] & RPMFC_PYTHON) {
166- xx = rpmfcHelper(fc, 'P', "python");
167- if (is_executable)
168+ if (findprov)
169+ xx = rpmfcHelper(fc, 'P', "python");
170+ if (findreq && is_executable)
171 xx = rpmfcHelper(fc, 'R', "python");
172 }
173 if (fc->fcolor->vals[fc->ix] & RPMFC_PHP) {
174+ if (findprov)
175 xx = rpmfcHelper(fc, 'P', "php");
176- xx = rpmfcHelper(fc, 'R', "php");
177+ if (findreq)
178+ xx = rpmfcHelper(fc, 'R', "php");
179 }
180
181 return 0;
182@@ -739,9 +816,11 @@
183 /**
184 * Extract Elf dependencies.
185 * @param fc file classifier
186+ * @param findprov 1 to enable provides
187+ * @param findreq 1 to enable requires
188 * @return 0 on success
189 */
190-static int rpmfcELF(rpmfc fc)
191+static int rpmfcELF(rpmfc fc,int findprov,int findreq)
192 /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
193 /*@modifies fc, rpmGlobalMacroContext, fileSystem, internalState @*/
194 {
195@@ -853,17 +932,19 @@
196 t = stpcpy(t, "(64bit)");
197 #endif
198 t++;
199+
200+ if (findprov) {
201+ /* Add to package provides. */
202+ ds = rpmdsSingle(RPMTAG_PROVIDES,
203+ buf, "", RPMSENSE_FIND_PROVIDES);
204+ xx = rpmdsMerge(&fc->provides, ds);
205
206- /* Add to package provides. */
207- ds = rpmdsSingle(RPMTAG_PROVIDES,
208- buf, "", RPMSENSE_FIND_PROVIDES);
209- xx = rpmdsMerge(&fc->provides, ds);
210-
211- /* Add to file dependencies. */
212- xx = rpmfcSaveArg(&fc->ddict,
213- rpmfcFileDep(t, fc->ix, ds));
214+ /* Add to file dependencies. */
215+ xx = rpmfcSaveArg(&fc->ddict,
216+ rpmfcFileDep(t, fc->ix, ds));
217
218- ds = rpmdsFree(ds);
219+ ds = rpmdsFree(ds);
220+ }
221 }
222 auxoffset += aux->vda_next;
223 }
224@@ -914,15 +995,17 @@
225 #endif
226 t++;
227
228- /* Add to package dependencies. */
229- ds = rpmdsSingle(RPMTAG_REQUIRENAME,
230- buf, "", RPMSENSE_FIND_REQUIRES);
231- xx = rpmdsMerge(&fc->requires, ds);
232+ if (findreq) {
233+ /* Add to package dependencies. */
234+ ds = rpmdsSingle(RPMTAG_REQUIRENAME,
235+ buf, "", RPMSENSE_FIND_REQUIRES);
236+ xx = rpmdsMerge(&fc->requires, ds);
237
238- /* Add to file dependencies. */
239- xx = rpmfcSaveArg(&fc->ddict,
240- rpmfcFileDep(t, fc->ix, ds));
241- ds = rpmdsFree(ds);
242+ /* Add to file dependencies. */
243+ xx = rpmfcSaveArg(&fc->ddict,
244+ rpmfcFileDep(t, fc->ix, ds));
245+ ds = rpmdsFree(ds);
246+ }
247 }
248 auxoffset += aux->vna_next;
249 }
250@@ -947,6 +1030,7 @@
251 /* Files with executable bit set only. */
252 if (fc->skipReq || !(st->st_mode & (S_IXUSR|S_IXGRP|S_IXOTH)))
253 /*@innercontinue@*/ continue;
254+ if (!findreq) continue;
255 /* Add to package requires. */
256 depsp = &fc->requires;
257 tagN = RPMTAG_REQUIRENAME;
258@@ -959,6 +1043,7 @@
259 /* Add to package provides. */
260 if (fc->skipProv)
261 /*@innercontinue@*/ continue;
262+ if (!findprov) continue;
263 depsp = &fc->provides;
264 tagN = RPMTAG_PROVIDENAME;
265 dsContext = RPMSENSE_FIND_PROVIDES;
266@@ -997,7 +1082,7 @@
267 /*@=branchstate =uniondef @*/
268
269 /* For DSO's, provide the basename of the file if DT_SONAME not found. */
270- if (!fc->skipProv && isDSO && !gotSONAME) {
271+ if (findprov && !fc->skipProv && isDSO && !gotSONAME) {
272 depsp = &fc->provides;
273 tagN = RPMTAG_PROVIDENAME;
274 dsContext = RPMSENSE_FIND_PROVIDES;
275@@ -1045,7 +1130,7 @@
276 }
277
278 typedef struct rpmfcApplyTbl_s {
279- int (*func) (rpmfc fc);
280+ int (*func) (rpmfc fc,int findprov,int findreq);
281 int colormask;
282 } * rpmfcApplyTbl;
283
284@@ -1058,6 +1143,109 @@
285 { NULL, 0 }
286 };
287
288+int rpmfcFindRequiredPackages(rpmfc fc)
289+{
290+ rpmts ts=NULL;
291+ const char * s;
292+ char * se;
293+ rpmds ds;
294+ const char * N;
295+ const char * EVR;
296+ int_32 Flags;
297+ unsigned char deptype;
298+ int nddict;
299+ int previx;
300+ int ix;
301+ int i;
302+ int j;
303+ int xx;
304+ int r;
305+ const char * hname;
306+ rpmdbMatchIterator it;
307+ Header hdr;
308+ regex_t *noautoreqdep;
309+ int noautoreqdep_c;
310+
311+ noautoreqdep=rpmfcExpandRegexps("%{_noautoreqdep}",&noautoreqdep_c);
312+
313+ ts = rpmtsCreate(); /* XXX ts created in main() should be used */
314+
315+ rpmMessage(RPMMESS_NORMAL, "Searching for required packages....\n");
316+
317+ nddict = argvCount(fc->ddict);
318+ previx = -1;
319+ for (i = 0; i < nddict; i++) {
320+ s = fc->ddict[i];
321+
322+ /* Parse out (file#,deptype,N,EVR,Flags) */
323+ ix = strtol(s, &se, 10);
324+ assert(se != NULL);
325+ deptype = *se++;
326+ se++;
327+ N = se;
328+ while (*se && *se != ' ')
329+ se++;
330+ *se++ = '\0';
331+ EVR = se;
332+ while (*se && *se != ' ')
333+ se++;
334+ *se++ = '\0';
335+ Flags = strtol(se, NULL, 16);
336+
337+ if (deptype!='R') continue;
338+
339+ rpmMessage(RPMMESS_DEBUG, "#%i requires: %s,%s,%i\n",ix,N,EVR,Flags);
340+ if (EVR && EVR[0]) {
341+ rpmMessage(RPMMESS_DEBUG, "skipping #%i require\n");
342+ continue;
343+ }
344+ for(j=0;j<noautoreqdep_c;j++)
345+ if (!regexec(&noautoreqdep[j],N,0,NULL,0)) {
346+ rpmMessage(RPMMESS_NORMAL,
347+ "skipping %s requirement processing"
348+ " (matches noautoreqdep pattern: #%i)\n",N,j);
349+ break;
350+ }
351+ if (j<noautoreqdep_c) continue;
352+ if (N[0]=='/') {
353+ rpmMessage(RPMMESS_DEBUG, "skipping #%i require (is file requirement)\n");
354+ continue;
355+ }
356+ it=rpmtsInitIterator(ts, RPMTAG_PROVIDENAME, N, 0);
357+ if (!it) {
358+ rpmMessage(RPMMESS_DEBUG, "%s -> not found\n",N);
359+ continue;
360+ }
361+ rpmMessage(RPMMESS_DEBUG, "Iterator: %p\n",it);
362+ if (rpmdbGetIteratorCount(it)>1) {
363+ rpmMessage(RPMMESS_DEBUG, "%s -> multiple (skipping)\n",N);
364+ rpmdbFreeIterator(it);
365+ continue;
366+ }
367+ hdr=rpmdbNextIterator(it);
368+ assert(hdr!=NULL);
369+ r=rpmHeaderGetEntry(hdr,RPMTAG_NAME,NULL,(void **)&hname, NULL);
370+ assert(r<2);
371+ if (!strcmp(hname,N)) {
372+ rpmMessage(RPMMESS_DEBUG, "%s -> %s (skipping)\n",N,hname);
373+ rpmdbFreeIterator(it);
374+ continue;
375+ }
376+
377+ rpmMessage(RPMMESS_DEBUG, "%s -> %s\n",N,hname);
378+
379+ ds = rpmdsSingle(RPMTAG_REQUIRENAME, hname, "", RPMSENSE_FIND_REQUIRES);
380+ xx = rpmdsMerge(&fc->requires, ds);
381+ ds = rpmdsFree(ds);
382+
383+ rpmdbFreeIterator(it);
384+ }
385+
386+ noautoreqdep=rpmfcFreeRegexps(noautoreqdep,noautoreqdep_c);
387+ ts = rpmtsFree(ts);
388+ return 0;
389+}
390+
391 int rpmfcApply(rpmfc fc)
392 {
393 rpmfcApplyTbl fcat;
394@@ -1075,6 +1263,21 @@
395 int ix;
396 int i;
397 int xx;
398+ int j;
399+ int findprov;
400+ int findreq;
401+ regex_t *noautoreqfiles=NULL;
402+ int noautoreqfiles_c;
403+ regex_t *noautoprovfiles=NULL;
404+ int noautoprovfiles_c;
405+ const char *buildroot;
406+ int buildroot_l;
407+
408+ buildroot=rpmExpand("%{buildroot}",NULL);
409+ buildroot_l=strlen(buildroot);
410+
411+ noautoreqfiles=rpmfcExpandRegexps("%{_noautoreqfiles}",&noautoreqfiles_c);
412+ noautoprovfiles=rpmfcExpandRegexps("%{_noautoprovfiles}",&noautoprovfiles_c);
413
414 /* Generate package and per-file dependencies. */
415 for (fc->ix = 0; fc->fn[fc->ix] != NULL; fc->ix++) {
416@@ -1082,10 +1285,41 @@
417 for (fcat = rpmfcApplyTable; fcat->func != NULL; fcat++) {
418 if (!(fc->fcolor->vals[fc->ix] & fcat->colormask))
419 /*@innercontinue@*/ continue;
420- xx = (*fcat->func) (fc);
421+ findprov=1;
422+ findreq=1;
423+ if (strncmp(fc->fn[fc->ix],buildroot,buildroot_l)==0) {/* sanity check */
424+ for(j=0;j<noautoprovfiles_c;j++) {
425+ if (!regexec(&noautoprovfiles[j],
426+ fc->fn[fc->ix]+buildroot_l,0,NULL,0)) {
427+ rpmMessage(RPMMESS_NORMAL,
428+ "skipping %s provides detection"
429+ " (matches noautoprovfiles pattern #%i)\n",
430+ fc->fn[fc->ix],j);
431+ findprov=0;
432+ break;
433+ }
434+ }
435+ for(j=0;j<noautoreqfiles_c;j++) {
436+ if (!regexec(&noautoreqfiles[j],
437+ fc->fn[fc->ix]+buildroot_l,0,NULL,0)) {
438+ rpmMessage(RPMMESS_NORMAL,
439+ "skipping %s requires detection"
440+ " (matches noautoreqfiles pattern #%i)\n",
441+ fc->fn[fc->ix],j);
442+ findreq=0;
443+ break;
444+ }
445+ }
446+ }
447+ xx = (*fcat->func) (fc,findprov,findreq);
448 }
449 }
450
451+ noautoreqfiles=rpmfcFreeRegexps(noautoreqfiles,noautoreqfiles_c);
452+ noautoprovfiles=rpmfcFreeRegexps(noautoprovfiles,noautoprovfiles_c);
453+
454+ rpmfcFindRequiredPackages(fc);
455+
456 /*@-boundswrite@*/
457 /* Generate per-file indices into package dependencies. */
458 nddict = argvCount(fc->ddict);
This page took 0.079947 seconds and 4 git commands to generate.