summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/apt_pkgmodule.h4
-rw-r--r--python/depcache.cc256
-rw-r--r--python/tar.cc2
3 files changed, 217 insertions, 45 deletions
diff --git a/python/apt_pkgmodule.h b/python/apt_pkgmodule.h
index 82389590..bc4c5509 100644
--- a/python/apt_pkgmodule.h
+++ b/python/apt_pkgmodule.h
@@ -63,10 +63,6 @@ PyObject *TmpGetCache(PyObject *Self,PyObject *Args);
extern PyTypeObject PkgDepCacheType;
PyObject *GetDepCache(PyObject *Self,PyObject *Args);
-// Progress
-bool AddOpProgressToModule(PyObject *Dict);
-PyObject *GetOpProgress(PyObject *Self,PyObject *Args);
-
// PkgRecords Stuff
extern PyTypeObject PkgRecordsType;
PyObject *GetPkgRecords(PyObject *Self,PyObject *Args);
diff --git a/python/depcache.cc b/python/depcache.cc
index 50611713..81e73efb 100644
--- a/python/depcache.cc
+++ b/python/depcache.cc
@@ -13,35 +13,34 @@
#include <apt-pkg/pkgcache.h>
#include <apt-pkg/cachefile.h>
+#include <apt-pkg/algorithms.h>
#include <apt-pkg/policy.h>
#include <apt-pkg/sptr.h>
#include <Python.h>
-#include "progress.h"
#include <iostream>
-
-
-
-
-
// DepCache Class /*{{{*/
// ---------------------------------------------------------------------
struct PkgDepCacheStruct
{
- pkgDepCache depcache;
- PyOpProgressStruct progress;
+ pkgDepCache *depcache;
+ pkgPolicy *policy;
+
+ PkgDepCacheStruct(pkgCache *Cache) {
+ policy = new pkgPolicy(Cache);
+ depcache = new pkgDepCache(Cache);
+ }
+ virtual ~PkgDepCacheStruct() {
+ delete depcache;
+ delete policy;
+ };
- PkgDepCacheStruct(pkgCache *Cache, pkgPolicy *Policy)
- : depcache(Cache,Policy) {};
- // FIXME: wrap pkgPolicy as well and remove this "new() memory leak"
- PkgDepCacheStruct(pkgCache *Cache)
- : depcache(Cache,new pkgPolicy(Cache) ) {};
- PkgDepCacheStruct() : depcache(NULL, NULL) {abort();};
+ PkgDepCacheStruct() {abort();};
};
@@ -50,8 +49,7 @@ static PyObject *PkgDepCacheInit(PyObject *Self,PyObject *Args)
{
PkgDepCacheStruct &Struct = GetCpp<PkgDepCacheStruct>(Self);
- OpProgress *progress = &Struct.progress;
- Struct.depcache.Init(progress);
+ Struct.depcache->Init(0);
return HandleErrors(Py_None);
}
@@ -65,16 +63,202 @@ static PyObject *PkgDepCacheGetCandidateVer(PyObject *Self,PyObject *Args)
return 0;
pkgCache::PkgIterator &Pkg = GetCpp<pkgCache::PkgIterator>(PackageObj);
- pkgCache::VerIterator I = Struct.depcache.GetCandidateVer(Pkg);
+ pkgCache::VerIterator I = Struct.depcache->GetCandidateVer(Pkg);
CandidateObj = CppOwnedPyObject_NEW<pkgCache::VerIterator>(PackageObj,&VersionType,I);
return CandidateObj;
}
+static PyObject *PkgDepCacheUpgrade(PyObject *Self,PyObject *Args)
+{
+ PkgDepCacheStruct &Struct = GetCpp<PkgDepCacheStruct>(Self);
+
+ char *distUpgrade=0;
+ if (PyArg_ParseTuple(Args,"|b",&distUpgrade) == 0)
+ return 0;
+
+ if(distUpgrade)
+ pkgDistUpgrade(*Struct.depcache);
+ else
+ pkgAllUpgrade(*Struct.depcache);
+
+ return HandleErrors(Py_None);
+}
+
+static PyObject *PkgDepCacheFixBroken(PyObject *Self,PyObject *Args)
+{
+ PkgDepCacheStruct &Struct = GetCpp<PkgDepCacheStruct>(Self);
+
+ if (PyArg_ParseTuple(Args,"") == 0)
+ return 0;
+
+ pkgFixBroken(*Struct.depcache);
+
+ return HandleErrors(Py_None);
+}
+
+
+static PyObject *PkgDepCacheMarkKeep(PyObject *Self,PyObject *Args)
+{
+ PkgDepCacheStruct &Struct = GetCpp<PkgDepCacheStruct>(Self);
+
+ PyObject *PackageObj;
+ if (PyArg_ParseTuple(Args,"O!",&PackageType,&PackageObj) == 0)
+ return 0;
+
+ pkgCache::PkgIterator &Pkg = GetCpp<pkgCache::PkgIterator>(PackageObj);
+ Struct.depcache->MarkKeep(Pkg);
+
+ return HandleErrors(Py_None);
+}
+
+static PyObject *PkgDepCacheMarkDelete(PyObject *Self,PyObject *Args)
+{
+ PkgDepCacheStruct &Struct = GetCpp<PkgDepCacheStruct>(Self);
+
+ PyObject *PackageObj;
+ char purge = 0;
+ if (PyArg_ParseTuple(Args,"O!|b",&PackageType,&PackageObj, &purge) == 0)
+ return 0;
+
+ pkgCache::PkgIterator &Pkg = GetCpp<pkgCache::PkgIterator>(PackageObj);
+ Struct.depcache->MarkDelete(Pkg,purge);
+
+ return HandleErrors(Py_None);
+}
+
+static PyObject *PkgDepCacheMarkInstall(PyObject *Self,PyObject *Args)
+{
+ PkgDepCacheStruct &Struct = GetCpp<PkgDepCacheStruct>(Self);
+
+ PyObject *PackageObj;
+ if (PyArg_ParseTuple(Args,"O!",&PackageType,&PackageObj) == 0)
+ return 0;
+
+ pkgCache::PkgIterator &Pkg = GetCpp<pkgCache::PkgIterator>(PackageObj);
+ Struct.depcache->MarkInstall(Pkg);
+
+ return HandleErrors(Py_None);
+}
+
+static PyObject *PkgDepCacheIsUpgradable(PyObject *Self,PyObject *Args)
+{
+ PkgDepCacheStruct &Struct = GetCpp<PkgDepCacheStruct>(Self);
+
+ PyObject *PackageObj;
+ if (PyArg_ParseTuple(Args,"O!",&PackageType,&PackageObj) == 0)
+ return 0;
+
+ pkgCache::PkgIterator &Pkg = GetCpp<pkgCache::PkgIterator>(PackageObj);
+ pkgDepCache::StateCache &state = (*Struct.depcache)[Pkg];
+
+ return HandleErrors(Py_BuildValue("b",state.Upgradable()));
+}
+
+static PyObject *PkgDepCacheIsNowBroken(PyObject *Self,PyObject *Args)
+{
+ PkgDepCacheStruct &Struct = GetCpp<PkgDepCacheStruct>(Self);
+
+ PyObject *PackageObj;
+ if (PyArg_ParseTuple(Args,"O!",&PackageType,&PackageObj) == 0)
+ return 0;
+
+ pkgCache::PkgIterator &Pkg = GetCpp<pkgCache::PkgIterator>(PackageObj);
+ pkgDepCache::StateCache &state = (*Struct.depcache)[Pkg];
+
+ return HandleErrors(Py_BuildValue("b",state.NowBroken()));
+}
+
+static PyObject *PkgDepCacheIsInstBroken(PyObject *Self,PyObject *Args)
+{
+ PkgDepCacheStruct &Struct = GetCpp<PkgDepCacheStruct>(Self);
+
+ PyObject *PackageObj;
+ if (PyArg_ParseTuple(Args,"O!",&PackageType,&PackageObj) == 0)
+ return 0;
+
+ pkgCache::PkgIterator &Pkg = GetCpp<pkgCache::PkgIterator>(PackageObj);
+ pkgDepCache::StateCache &state = (*Struct.depcache)[Pkg];
+
+ return HandleErrors(Py_BuildValue("b",state.InstBroken()));
+}
+
+
+static PyObject *PkgDepCacheMarkedInstall(PyObject *Self,PyObject *Args)
+{
+ PkgDepCacheStruct &Struct = GetCpp<PkgDepCacheStruct>(Self);
+
+ PyObject *PackageObj;
+ if (PyArg_ParseTuple(Args,"O!",&PackageType,&PackageObj) == 0)
+ return 0;
+
+ pkgCache::PkgIterator &Pkg = GetCpp<pkgCache::PkgIterator>(PackageObj);
+ pkgDepCache::StateCache &state = (*Struct.depcache)[Pkg];
+
+ return HandleErrors(Py_BuildValue("b",state.Install()));
+}
+
+static PyObject *PkgDepCacheMarkedUpgrade(PyObject *Self,PyObject *Args)
+{
+ PkgDepCacheStruct &Struct = GetCpp<PkgDepCacheStruct>(Self);
+
+ PyObject *PackageObj;
+ if (PyArg_ParseTuple(Args,"O!",&PackageType,&PackageObj) == 0)
+ return 0;
+
+ pkgCache::PkgIterator &Pkg = GetCpp<pkgCache::PkgIterator>(PackageObj);
+ pkgDepCache::StateCache &state = (*Struct.depcache)[Pkg];
+
+ return HandleErrors(Py_BuildValue("b",state.Upgrade()));
+}
+
+static PyObject *PkgDepCacheMarkedDelete(PyObject *Self,PyObject *Args)
+{
+ PkgDepCacheStruct &Struct = GetCpp<PkgDepCacheStruct>(Self);
+
+ PyObject *PackageObj;
+ if (PyArg_ParseTuple(Args,"O!",&PackageType,&PackageObj) == 0)
+ return 0;
+
+ pkgCache::PkgIterator &Pkg = GetCpp<pkgCache::PkgIterator>(PackageObj);
+ pkgDepCache::StateCache &state = (*Struct.depcache)[Pkg];
+
+ return HandleErrors(Py_BuildValue("b",state.Delete()));
+}
+
+static PyObject *PkgDepCacheMarkedKeep(PyObject *Self,PyObject *Args)
+{
+ PkgDepCacheStruct &Struct = GetCpp<PkgDepCacheStruct>(Self);
+
+ PyObject *PackageObj;
+ if (PyArg_ParseTuple(Args,"O!",&PackageType,&PackageObj) == 0)
+ return 0;
+
+ pkgCache::PkgIterator &Pkg = GetCpp<pkgCache::PkgIterator>(PackageObj);
+ pkgDepCache::StateCache &state = (*Struct.depcache)[Pkg];
+
+ return HandleErrors(Py_BuildValue("b",state.Keep()));
+}
+
static PyMethodDef PkgDepCacheMethods[] =
{
- {"Init",PkgDepCacheInit,METH_VARARGS,"Init the depcache"},
+ {"Init",PkgDepCacheInit,METH_VARARGS,"Init the depcache (done on construct automatically)"},
{"GetCandidateVer",PkgDepCacheGetCandidateVer,METH_VARARGS,"Get candidate version"},
+ // global cache operations
+ {"Upgrade",PkgDepCacheUpgrade,METH_VARARGS,"Perform Upgrade (optional boolean argument if dist-upgrade should be performed)"},
+ {"FixBroken",PkgDepCacheFixBroken,METH_VARARGS,"Fix broken packages"},
+ // Manipulators
+ {"MarkKeep",PkgDepCacheMarkKeep,METH_VARARGS,"Mark package for keep"},
+ {"MarkDelete",PkgDepCacheMarkDelete,METH_VARARGS,"Mark package for delete (optional boolean argument if it should be purged)"},
+ {"MarkInstall",PkgDepCacheMarkInstall,METH_VARARGS,"Mark package for Install"},
+ // state information
+ {"IsUpgradable",PkgDepCacheIsUpgradable,METH_VARARGS,"Is pkg upgradable"},
+ {"IsNowBroken",PkgDepCacheIsNowBroken,METH_VARARGS,"Is pkg is now broken"},
+ {"IsInstBroken",PkgDepCacheIsInstBroken,METH_VARARGS,"Is pkg broken on the current install"},
+ {"MarkedInstall",PkgDepCacheMarkedInstall,METH_VARARGS,"Is pkg marked for install"},
+ {"MarkedUpgrade",PkgDepCacheMarkedUpgrade,METH_VARARGS,"Is pkg marked for upgrade"},
+ {"MarkedDelete",PkgDepCacheMarkedDelete,METH_VARARGS,"Is pkg marked for delete"},
+ {"MarkedKeep",PkgDepCacheMarkedDelete,METH_VARARGS,"Is pkg marked for keep"},
{}
};
@@ -85,17 +269,17 @@ static PyObject *DepCacheAttr(PyObject *Self,char *Name)
// size querries
if(strcmp("KeepCount",Name) == 0)
- return Py_BuildValue("i", Struct.depcache.KeepCount());
+ return Py_BuildValue("l", Struct.depcache->KeepCount());
else if(strcmp("InstCount",Name) == 0)
- return Py_BuildValue("i", Struct.depcache.InstCount());
+ return Py_BuildValue("l", Struct.depcache->InstCount());
else if(strcmp("DelCount",Name) == 0)
- return Py_BuildValue("i", Struct.depcache.DelCount());
+ return Py_BuildValue("l", Struct.depcache->DelCount());
else if(strcmp("BrokenCount",Name) == 0)
- return Py_BuildValue("i", Struct.depcache.BrokenCount());
+ return Py_BuildValue("l", Struct.depcache->BrokenCount());
else if(strcmp("UsrSize",Name) == 0)
- return Py_BuildValue("i", Struct.depcache.UsrSize());
+ return Py_BuildValue("d", Struct.depcache->UsrSize());
else if(strcmp("DebSize",Name) == 0)
- return Py_BuildValue("i", Struct.depcache.DebSize());
+ return Py_BuildValue("d", Struct.depcache->DebSize());
return Py_FindMethod(PkgDepCacheMethods,Self,Name);
@@ -128,26 +312,18 @@ PyTypeObject PkgDepCacheType =
PyObject *GetDepCache(PyObject *Self,PyObject *Args)
{
PyObject *Owner;
- PyObject *pyCallbackObj = 0;
- PyObject *pyCallbackArgs = 0;
- if (PyArg_ParseTuple(Args,"O!|OO",&PkgCacheType,&Owner,
- &pyCallbackObj, &pyCallbackArgs) == 0)
+ if (PyArg_ParseTuple(Args,"O!",&PkgCacheType,&Owner) == 0)
return 0;
- PyObject *DepCachePyObj = CppOwnedPyObject_NEW<PkgDepCacheStruct>(Owner,
- &PkgDepCacheType,
- GetCpp<pkgCache *>(Owner));
+ PyObject *DepCachePyObj;
+ DepCachePyObj = CppOwnedPyObject_NEW<PkgDepCacheStruct>(Owner,
+ &PkgDepCacheType,
+ GetCpp<pkgCache *>(Owner));
HandleErrors(DepCachePyObj);
PkgDepCacheStruct &Struct = GetCpp<PkgDepCacheStruct>(DepCachePyObj);
- if(pyCallbackObj != 0) {
- PyOpProgressStruct progress;
-
- progress.py_update_callback_func = pyCallbackObj;
- progress.py_update_callback_args = pyCallbackArgs;
- Struct.depcache.Init(&progress);
- } else {
- Struct.depcache.Init(0);
- }
+
+ // init without progress obj
+ Struct.depcache->Init(0);
return DepCachePyObj;
}
diff --git a/python/tar.cc b/python/tar.cc
index 38844a75..20fb1f5f 100644
--- a/python/tar.cc
+++ b/python/tar.cc
@@ -161,7 +161,7 @@ PyObject *debExtract(PyObject *Self,PyObject *Args)
const ARArchive::Member *Member = Deb.GotoMember(Chunk);
if (Member == 0)
{
- _error->Error("Cannot fund chunk %s",Chunk);
+ _error->Error("Cannot find chunk %s",Chunk);
return HandleErrors();
}