5 # TODO: migrate relevant documentation from C-side
6 class TransactionSet(_rpm.ts):
8 # FIXME: kludge for keeping refcounts on transaction element keys
11 def _wrapSetGet(self, attr, val):
12 oval = getattr(self, attr)
13 setattr(self, attr, val)
16 def setVSFlags(self, flags):
17 return self._wrapSetGet('_vsflags', flags)
22 def setColor(self, color):
23 return self._wrapSetGet('_color', color)
25 def setPrefColor(self, color):
26 return self._wrapSetGet('_prefcolor', color)
28 def setFlags(self, flags):
29 return self._wrapSetGet('_flags', flags)
31 def setProbFilter(self, ignoreSet):
32 return self._wrapSetGet('_probFilter', ignoreSet)
34 def parseSpec(self, specfile):
36 return _rpmb.spec(specfile)
42 # Backwards compatibility goo - WTH does this return a *tuple* ?!
48 def addInstall(self, item, key, how="u"):
49 if isinstance(item, str):
51 header = self.hdrFromFdno(f)
53 elif isinstance(item, file):
54 header = self.hdrFromFdno(item)
58 if not how in ['u', 'i']:
59 raise ValueError, 'how argument must be "u" or "i"'
60 upgrade = (how == "u")
62 if not _rpm.ts.addInstall(self, header, key, upgrade):
63 raise _rpm.error, "adding package to transaction failed"
64 self._keyList.append(key)
66 def addErase(self, item):
68 if isinstance(item, _rpm.hdr):
70 elif isinstance(item, _rpm.mi):
72 elif isinstance(item, int):
73 hdrs = self.dbMatch(_rpm.RPMDBI_PACKAGES, item)
74 elif isinstance(item, str):
75 hdrs = self.dbMatch(_rpm.RPMDBI_LABEL, item)
77 raise TypeError, "invalid type %s" % type(item)
80 if not _rpm.ts.addErase(self, h):
81 raise _rpm.error, "package not installed"
83 # garbage collection should take care but just in case...
84 if isinstance(hdrs, _rpm.mi):
87 def run(self, callback, data):
88 rc = _rpm.ts.run(self, callback, data, self._probFilter)
90 # crazy backwards compatibility goo: None for ok, list of problems
91 # if transaction didnt complete and empty list if it completed
98 for prob in self.problems():
99 item = ("%s" % prob, (prob.type, prob._str, prob._num))
103 def check(self, *args, **kwds):
104 _rpm.ts.check(self, *args, **kwds)
106 probs = self.problems()
110 # compatibility: munge problem strings into dependency tuples of doom
113 # is it anything we need to care about?
114 if p.type == _rpm.RPMPROB_CONFLICT:
115 sense = _rpm.RPMDEP_SENSE_CONFLICTS
116 elif p.type == _rpm.RPMPROB_REQUIRES:
117 sense = _rpm.RPMDEP_SENSE_REQUIRES
121 # strip arch, split to name, version, release
122 nevr = p.pkgNEVR.rsplit('.', 1)[0]
123 n, v, r = nevr.rsplit('-', 2)
125 # extract the dependency information
126 needs = p.altNEVR.split()[1:]
128 needflags = _rpm.RPMSENSE_ANY
131 if needop.find('<') >= 0: needflags |= _rpm.RPMSENSE_LESS
132 if needop.find('=') >= 0: needflags |= _rpm.RPMSENSE_EQUAL
133 if needop.find('>') >= 0: needflags |= _rpm.RPMSENSE_GREATER
138 res.append(((n, v, r),(needname,needver),needflags,sense,p.key))