- check for interrupt during iteration.

- python: add ts.setProbFilter() method, remove ts.run() argument.

CVS patchset: 5652
CVS date: 2002/08/20 22:05:18
This commit is contained in:
jbj 2002-08-20 22:05:18 +00:00
parent 46d1fa7527
commit b6b6612cfa
11 changed files with 95 additions and 45 deletions

View File

@ -255,6 +255,8 @@
- skip redundant /sbin/ldconfig scripts on upgrade (if possible).
- python: stupid typo broke ts.check().
- fix: add epoch to "already installed" check.
- check for interrupt during iteration.
- python: add ts.setProbFilter() method, remove ts.run() argument.
4.0.3 -> 4.0.4:
- solaris: translate i86pc to i386 (#57182).

View File

@ -31,6 +31,7 @@
/*@access Header @*/
/*@access rpmfi @*/
/*@access rpmte @*/
/*@access FD_t @*/
/*@access StringBuf @*/ /* compared with NULL */
@ -1372,7 +1373,9 @@ static void genCpioListAndHeader(/*@partial@*/ FileList fl,
if (fi == NULL) return; /* XXX can't happen */
/*@-onlytrans@*/
fi->te = xcalloc(1, sizeof(*fi->te));
/*@=onlytrans@*/
fi->te->type = TR_ADDED;
fi->dnl = _free(fi->dnl);

View File

@ -888,7 +888,7 @@ static pid_t psmWait(rpmpsm psm)
/*@modifies psm, fileSystem, internalState @*/
{
if (psm->reaper) {
/* XXX FIXME: signal race on psm->reaped prevents pause(3) */
/*@-infloops@*/
while (psm->reaped == 0)
(void) sleep(2);
/*@=infloops@*/
@ -915,7 +915,7 @@ fprintf(stderr, " Wait: %p[%d:%d:%d] = %p child %d\n", psmtbl.psms, 0, psmt
/*@unchecked@*/
static int ldconfig_done = 0;
/*@unchecked@*/ /*@observer@*/
/*@unchecked@*/ /*@observer@*/ /*@null@*/
static const char * ldconfig_path = "/sbin/ldconfig";
/**
@ -940,8 +940,10 @@ static int runScript(rpmpsm psm, Header h,
const char * sln,
int progArgc, const char ** progArgv,
const char * script, int arg1, int arg2)
/*@globals rpmGlobalMacroContext, fileSystem, internalState@*/
/*@modifies psm, rpmGlobalMacroContext, fileSystem, internalState @*/
/*@globals ldconfig_done, rpmGlobalMacroContext,
fileSystem, internalState@*/
/*@modifies psm, ldconfig_done, rpmGlobalMacroContext,
fileSystem, internalState @*/
{
const rpmts ts = psm->ts;
rpmfi fi = psm->fi;
@ -1259,10 +1261,9 @@ exit:
*/
static int handleOneTrigger(const rpmpsm psm, Header sourceH, Header triggeredH,
int arg2, unsigned char * triggersAlreadyRun)
/*@globals rpmGlobalMacroContext,
fileSystem, internalState@*/
/*@modifies psm, triggeredH, *triggersAlreadyRun, rpmGlobalMacroContext,
fileSystem, internalState @*/
/*@globals rpmGlobalMacroContext, fileSystem, internalState@*/
/*@modifies psm, sourceH, triggeredH, *triggersAlreadyRun,
rpmGlobalMacroContext, fileSystem, internalState @*/
{
int scareMem = 1;
const rpmts ts = psm->ts;
@ -1299,7 +1300,10 @@ static int handleOneTrigger(const rpmpsm psm, Header sourceH, Header triggeredH,
if (!(Flags & psm->sense))
continue;
if (!rpmdsNVRMatchesDep(sourceH, trigger, 1))
/*
* XXX Trigger on any provided dependency, not just the package NEVR.
*/
if (!rpmdsAnyMatchesDep(sourceH, trigger, 1))
continue;
if (!( hge(triggeredH, RPMTAG_TRIGGERINDEX, &tit,
@ -1605,10 +1609,12 @@ int rpmpsmStage(rpmpsm psm, pkgStage stage)
assert(psm->mi == NULL);
psm->mi = rpmtsInitIterator(ts, RPMTAG_NAME, rpmteN(psm->te), 0);
xx = rpmdbSetIteratorRE(psm->mi, RPMTAG_VERSION,
RPMMIRE_DEFAULT, rpmteV(psm->te));
xx = rpmdbSetIteratorRE(psm->mi, RPMTAG_RELEASE,
RPMMIRE_DEFAULT, rpmteR(psm->te));
xx = rpmdbSetIteratorRE(psm->mi, RPMTAG_EPOCH, RPMMIRE_DEFAULT,
rpmteE(psm->te));
xx = rpmdbSetIteratorRE(psm->mi, RPMTAG_VERSION, RPMMIRE_DEFAULT,
rpmteV(psm->te));
xx = rpmdbSetIteratorRE(psm->mi, RPMTAG_RELEASE, RPMMIRE_DEFAULT,
rpmteR(psm->te));
while ((psm->oh = rpmdbNextIterator(psm->mi))) {
fi->record = rpmdbGetIteratorOffset(psm->mi);

View File

@ -997,6 +997,8 @@ rpmfi rpmfiNew(rpmts ts, Header h, rpmTag tagN, int scareMem)
}
fi = xcalloc(1, sizeof(*fi));
if (fi == NULL) /* XXX can't happen */
goto exit;
fi->magic = RPMFIMAGIC;
fi->Type = Type;

View File

@ -31,7 +31,7 @@ const char * macrofiles = MACROFILES;
/*@observer@*/ /*@unchecked@*/
static const char * platform = "/etc/rpm/platform";
/*@only@*/ /*@unchecked@*/
/*@only@*/ /*@relnul@*/ /*@unchecked@*/
static const char ** platpat = NULL;
/*@unchecked@*/
static int nplatpat = 0;
@ -1645,10 +1645,12 @@ void rpmFreeRpmrc(void)
{
int i, j, k;
/*@-onlyunqglobaltrans -unqualifiedtrans @*/
if (platpat)
for (i = 0; i < nplatpat; i++)
platpat[i] = _free(platpat[i]);
platpat = _free(platpat);
/*@-onlyunqglobaltrans =unqualifiedtrans @*/
nplatpat = 0;
for (i = 0; i < RPM_MACHTABLE_COUNT; i++) {
@ -1708,9 +1710,9 @@ void rpmFreeRpmrc(void)
current[OS] = _free(current[OS]);
current[ARCH] = _free(current[ARCH]);
defaultsInitialized = 0;
/*@-nullstate@*/ /* FIX: current may be NULL */
/*@-globstate -nullstate@*/ /* FIX: platpat/current may be NULL */
return;
/*@=nullstate@*/
/*@=globstate =nullstate@*/
}
/** \ingroup rpmrc

View File

@ -1409,7 +1409,7 @@ rpmMessage(RPMMESS_DEBUG, _("computing file dispositions\n"));
/*@-type@*/ /* FIX: rpmte not opaque */
{
/*@-noeffectuncon@*/ /* FIX: notify annotations */
p->fd = ts->notify(fi->h, RPMCALLBACK_INST_OPEN_FILE, 0, 0,
p->fd = ts->notify(p->h, RPMCALLBACK_INST_OPEN_FILE, 0, 0,
rpmteKey(p), ts->notifyData);
/*@=noeffectuncon@*/
if (rpmteFd(p) != NULL) {
@ -1424,7 +1424,7 @@ rpmMessage(RPMMESS_DEBUG, _("computing file dispositions\n"));
if (!(rpmrc == RPMRC_OK || rpmrc == RPMRC_BADSIZE)) {
/*@-noeffectuncon@*/ /* FIX: notify annotations */
p->fd = ts->notify(fi->h, RPMCALLBACK_INST_CLOSE_FILE,
p->fd = ts->notify(p->h, RPMCALLBACK_INST_CLOSE_FILE,
0, 0,
rpmteKey(p), ts->notifyData);
/*@=noeffectuncon@*/
@ -1450,12 +1450,14 @@ rpmMessage(RPMMESS_DEBUG, _("computing file dispositions\n"));
fi->actions = NULL;
fi = rpmfiFree(fi);
fi = rpmfiNew(ts, p->h, RPMTAG_BASENAMES, 1);
p->fi = fi;
fi->te = p;
fi->fstates = _free(fi->fstates);
fi->fstates = fstates;
fi->actions = _free(fi->actions);
fi->actions = actions;
if (fi != NULL) { /* XXX can't happen */
fi->te = p;
fi->fstates = _free(fi->fstates);
fi->fstates = fstates;
fi->actions = _free(fi->actions);
fi->actions = actions;
p->fi = fi;
}
}
psm->fi = rpmfiLink(p->fi, NULL);
@ -1470,23 +1472,23 @@ rpmMessage(RPMMESS_DEBUG, _("computing file dispositions\n"));
lastFailKey = pkgKey;
}
/*@=nullstate@*/
fi->h = headerFree(fi->h);
} else {
ourrc++;
lastFailKey = pkgKey;
}
p->h = headerFree(p->h);
if (gotfd) {
/*@-noeffectuncon @*/ /* FIX: check rc */
(void) ts->notify(fi->h, RPMCALLBACK_INST_CLOSE_FILE, 0, 0,
(void) ts->notify(p->h, RPMCALLBACK_INST_CLOSE_FILE, 0, 0,
rpmteKey(p), ts->notifyData);
/*@=noeffectuncon @*/
/*@-type@*/
p->fd = NULL;
/*@=type@*/
}
p->h = headerFree(p->h);
/*@switchbreak@*/ break;
case TR_REMOVED:
rpmMessage(RPMMESS_DEBUG, "========== --- %s\n", rpmteNEVR(p));
@ -1507,7 +1509,7 @@ rpmMessage(RPMMESS_DEBUG, _("computing file dispositions\n"));
/*@=nullstate@*/
/*@-type@*/ /* FIX: p is almost opaque */
p->fi = rpmfiFree(fi);
p->fi = rpmfiFree(p->fi);
/*@=type@*/
}

View File

@ -128,12 +128,9 @@ static int _rpmts_debug = 0;
* packages.
* @return previous transFlags
*
* - run(problemSetFilter,callback,data) Attempt to execute a
* transaction set. After the transaction set has been populated
* with install and upgrade actions, it can be executed by invoking
* the run() method.
* - ts.setProbFilter(ignoreSet) Set transaction set problem filter.
* @param problemSetFilter - control bit(s) to ignore classes of problems,
* any of
* a logical or of one or more of the following bit(s):
* - rpm.RPMPROB_FILTER_IGNOREOS -
* - rpm.RPMPROB_FILTER_IGNOREARCH -
* - rpm.RPMPROB_FILTER_REPLACEPKG -
@ -142,6 +139,12 @@ static int _rpmts_debug = 0;
* - rpm.RPMPROB_FILTER_REPLACEOLDFILES -
* - rpm.RPMPROB_FILTER_OLDPACKAGE -
* - rpm.RPMPROB_FILTER_DISKSPACE -
* @return previous ignoreSet
*
* - ts.run(callback,data) Attempt to execute a transaction set.
* After the transaction set has been populated with install/upgrade or
* erase actions, the transaction set can be executed by invoking
* the ts.run() method.
*/
/** \ingroup python
@ -1013,20 +1016,39 @@ fprintf(stderr, "*** rpmts_SetFlags(%p) ts %p transFlags %x\n", s, s->ts, transF
return Py_BuildValue("i", rpmtsSetFlags(s->ts, transFlags));
}
/** \ingroup python
*/
static PyObject * rpmts_SetProbFilter(rpmtsObject * s, PyObject * args)
/*@globals rpmGlobalMacroContext, _Py_NoneStruct @*/
/*@modifies s, rpmGlobalMacroContext, _Py_NoneStruct @*/
{
rpmprobFilterFlags ignoreSet = 0;
rpmprobFilterFlags oignoreSet;
if (!PyArg_ParseTuple(args, "i:ProbFilter", &ignoreSet))
return NULL;
if (_rpmts_debug)
fprintf(stderr, "*** rpmts_SetProbFilter(%p) ts %p ignoreSet %x\n", s, s->ts, ignoreSet);
oignoreSet = s->ignoreSet;
s->ignoreSet = ignoreSet;
return Py_BuildValue("i", oignoreSet);
}
/** \ingroup python
*/
static PyObject * rpmts_Run(rpmtsObject * s, PyObject * args)
/*@globals rpmGlobalMacroContext, _Py_NoneStruct @*/
/*@modifies s, rpmGlobalMacroContext, _Py_NoneStruct @*/
{
int ignoreSet;
int rc, i;
PyObject * list;
rpmps ps;
struct rpmtsCallbackType_s cbInfo;
if (!PyArg_ParseTuple(args, "iOO:Run", &ignoreSet, &cbInfo.cb,
&cbInfo.data))
if (!PyArg_ParseTuple(args, "OO:Run", &cbInfo.cb, &cbInfo.data))
return NULL;
cbInfo.tso = s;
@ -1043,9 +1065,9 @@ static PyObject * rpmts_Run(rpmtsObject * s, PyObject * args)
if (_rpmts_debug)
fprintf(stderr, "*** rpmts_Run(%p) ts %p ignore %x\n", s, s->ts, ignoreSet);
fprintf(stderr, "*** rpmts_Run(%p) ts %p ignore %x\n", s, s->ts, s->ignoreSet);
rc = rpmtsRun(s->ts, NULL, ignoreSet);
rc = rpmtsRun(s->ts, NULL, s->ignoreSet);
ps = rpmtsProblems(s->ts);
if (cbInfo.cb) {
@ -1205,8 +1227,12 @@ static struct PyMethodDef rpmts_methods[] = {
NULL },
{"setFlags", (PyCFunction) rpmts_SetFlags, METH_VARARGS,
"ts.setFlags(transFlags) -> previous transFlags\n\
- Set control bit(s) for processing a transaction set.\n\
Note: This method sets bit(s) passed as the first argument to ts.run()\n" },
- Set control bit(s) for executing ts.run().\n\
Note: This method replaces the 1st argument to the old ts.run()\n" },
{"setProbFilter", (PyCFunction) rpmts_SetProbFilter, METH_VARARGS,
"ts.setProbFilter(ignoreSet) -> previous ignoreSet\n\
- Set control bit(s) for ignoring problems found by ts.run().\n\
Note: This method replaces the 2nd argument to the old ts.run()\n" },
{"run", (PyCFunction) rpmts_Run, METH_VARARGS,
NULL },
{"clean", (PyCFunction) rpmts_Clean, METH_VARARGS,

View File

@ -14,6 +14,7 @@ typedef struct rpmtsObject_s {
FD_t scriptFd;
rpmtsi tsi;
rpmElementType tsiFilter;
rpmprobFilterFlags ignoreSet;
} rpmtsObject;
/*@unchecked@*/

View File

@ -17,7 +17,7 @@ Name: rpm
%define version @VERSION@
Version: %{version}
%{expand: %%define rpm_version %{version}}
Release: 0.84
Release: 0.85
Group: System Environment/Base
Source: ftp://ftp.rpm.org/pub/rpm/dist/rpm-4.0.x/rpm-%{rpm_version}.tar.gz
Copyright: GPL
@ -519,9 +519,11 @@ fi
%{__prefix}/include/popt.h
%changelog
* Tue Aug 20 2002 Jeff Johnson <jbj@redhat.com> 4.1-0.84
* Tue Aug 20 2002 Jeff Johnson <jbj@redhat.com> 4.1-0.85
- python: stupid typo broke ts.check().
- fix: add epoch to "already installed" check.
- check for interrupt during iteration.
- python: add ts.setProbFilter() method, remove ts.run() argument.
* Mon Aug 19 2002 Jeff Johnson <jbj@redhat.com> 4.1-0.82
- add --with-efence to configure, check install/upgrade with efence.

View File

@ -2683,10 +2683,10 @@ static char * formatValue(sprintfTag tag, Header h,
/*@=branchstate@*/
if (tag->arrayCount) {
/*@-observertrans -modobserver@*/
/*@-branchstate -observertrans -modobserver@*/
if (datafree)
data = headerFreeData(data, type);
/*@=observertrans =modobserver@*/
/*@=branchstate =observertrans =modobserver@*/
countBuf = count;
data = &countBuf;

View File

@ -2022,7 +2022,9 @@ static int mireSkip (const rpmdbMatchIterator mi)
if (mire->tag != RPMTAG_EPOCH)
continue;
t = RPM_INT32_TYPE;
/*@-immediatetrans@*/
u.i32p = &zero;
/*@=immediatetrans@*/
c = 1;
}
@ -2140,6 +2142,8 @@ Header rpmdbNextIterator(rpmdbMatchIterator mi)
if (mi == NULL)
return NULL;
(void) checkSignals();
dbi = dbiOpen(mi->mi_db, RPMDBI_PACKAGES, 0);
if (dbi == NULL)
return NULL;