summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/acquire-item.cc10
-rw-r--r--python/acquire.cc14
-rw-r--r--python/apt_pkgmodule.cc106
-rw-r--r--python/apt_pkgmodule.h8
-rw-r--r--python/arfile.cc12
-rw-r--r--python/cache.cc265
-rw-r--r--python/cachegroup.cc188
-rw-r--r--python/configuration.cc6
-rw-r--r--python/depcache.cc12
-rw-r--r--python/generic.h16
-rw-r--r--python/indexfile.cc2
-rw-r--r--python/indexrecords.cc2
-rw-r--r--python/orderlist.cc317
-rw-r--r--python/pkgmanager.cc279
-rw-r--r--python/pkgsrcrecords.cc10
-rw-r--r--python/policy.cc2
-rw-r--r--python/progress.cc60
-rw-r--r--python/python-apt-helpers.cc2
-rw-r--r--python/python-apt.h16
-rw-r--r--python/string.cc14
-rw-r--r--python/tag.cc5
-rw-r--r--python/tarfile.cc14
22 files changed, 1142 insertions, 218 deletions
diff --git a/python/acquire-item.cc b/python/acquire-item.cc
index 895d4a21..5e7423ab 100644
--- a/python/acquire-item.cc
+++ b/python/acquire-item.cc
@@ -65,13 +65,13 @@ static PyObject *acquireitem_get_error_text(PyObject *self, void *closure)
static PyObject *acquireitem_get_filesize(PyObject *self, void *closure)
{
pkgAcquire::Item *item = acquireitem_tocpp(self);
- return item ? Py_BuildValue("K", item->FileSize) : 0;
+ return item ? MkPyNumber(item->FileSize) : 0;
}
static PyObject *acquireitem_get_id(PyObject *self, void *closure)
{
pkgAcquire::Item *item = acquireitem_tocpp(self);
- return item ? Py_BuildValue("k", item->ID) : 0;
+ return item ? MkPyNumber(item->ID) : 0;
}
static PyObject *acquireitem_get_mode(PyObject *self, void *closure)
@@ -95,13 +95,13 @@ static PyObject *acquireitem_get_local(PyObject *self, void *closure)
static PyObject *acquireitem_get_partialsize(PyObject *self, void *closure)
{
pkgAcquire::Item *item = acquireitem_tocpp(self);
- return item ? Py_BuildValue("K", item->PartialSize) : 0;
+ return item ? MkPyNumber(item->PartialSize) : 0;
}
static PyObject *acquireitem_get_status(PyObject *self, void *closure)
{
pkgAcquire::Item *item = acquireitem_tocpp(self);
- return item ? Py_BuildValue("i", item->Status) : 0;
+ return item ? MkPyNumber(item->Status) : 0;
}
static int acquireitem_set_id(PyObject *self, PyObject *value, void *closure)
@@ -110,7 +110,7 @@ static int acquireitem_set_id(PyObject *self, PyObject *value, void *closure)
if (Itm == 0)
return -1;
if (PyLong_Check(value)) {
- Itm->ID = PyLong_AsLong(value);
+ Itm->ID = PyLong_AsUnsignedLong(value);
}
else if (PyInt_Check(value)) {
Itm->ID = PyInt_AsLong(value);
diff --git a/python/acquire.cc b/python/acquire.cc
index ab90bbdd..6169ff40 100644
--- a/python/acquire.cc
+++ b/python/acquire.cc
@@ -51,17 +51,17 @@ static PyObject *acquireworker_get_status(PyObject *self, void *closure)
static PyObject *acquireworker_get_current_size(PyObject *self, void *closure)
{
- return Py_BuildValue("k",GetCpp<pkgAcquire::Worker*>(self)->CurrentSize);
+ return MkPyNumber(GetCpp<pkgAcquire::Worker*>(self)->CurrentSize);
}
static PyObject *acquireworker_get_total_size(PyObject *self, void *closure)
{
- return Py_BuildValue("k",GetCpp<pkgAcquire::Worker*>(self)->TotalSize);
+ return MkPyNumber(GetCpp<pkgAcquire::Worker*>(self)->TotalSize);
}
static PyObject *acquireworker_get_resumepoint(PyObject *self, void *closure)
{
- return Py_BuildValue("k",GetCpp<pkgAcquire::Worker*>(self)->ResumePoint);
+ return MkPyNumber(GetCpp<pkgAcquire::Worker*>(self)->ResumePoint);
}
static PyGetSetDef acquireworker_getset[] = {
@@ -225,7 +225,7 @@ static PyObject *PkgAcquireRun(PyObject *Self,PyObject *Args)
pkgAcquire::RunResult run = fetcher->Run(pulseInterval);
- return HandleErrors(Py_BuildValue("i",run));
+ return HandleErrors(MkPyNumber(run));
}
@@ -259,15 +259,15 @@ static PyMethodDef PkgAcquireMethods[] = {
#define fetcher (GetCpp<pkgAcquire*>(Self))
static PyObject *PkgAcquireGetTotalNeeded(PyObject *Self,void*)
{
- return Py_BuildValue("L", fetcher->TotalNeeded());
+ return MkPyNumber(fetcher->TotalNeeded());
}
static PyObject *PkgAcquireGetFetchNeeded(PyObject *Self,void*)
{
- return Py_BuildValue("L", fetcher->FetchNeeded());
+ return MkPyNumber(fetcher->FetchNeeded());
}
static PyObject *PkgAcquireGetPartialPresent(PyObject *Self,void*)
{
- return Py_BuildValue("L", fetcher->PartialPresent());
+ return MkPyNumber(fetcher->PartialPresent());
}
#undef fetcher
diff --git a/python/apt_pkgmodule.cc b/python/apt_pkgmodule.cc
index d1ac33e0..e8490b4e 100644
--- a/python/apt_pkgmodule.cc
+++ b/python/apt_pkgmodule.cc
@@ -24,6 +24,7 @@
#include <apt-pkg/sha256.h>
#include <apt-pkg/init.h>
#include <apt-pkg/pkgsystem.h>
+#include <apt-pkg/orderlist.h>
#include <sys/stat.h>
#include <libintl.h>
@@ -83,7 +84,7 @@ static PyObject *VersionCompare(PyObject *Self,PyObject *Args)
return 0;
}
- return Py_BuildValue("i",_system->VS->DoCmpVersion(A,A+LenA,B,B+LenB));
+ return MkPyNumber(_system->VS->DoCmpVersion(A,A+LenA,B,B+LenB));
}
static char *doc_CheckDep =
@@ -459,7 +460,7 @@ static PyObject *GetLock(PyObject *Self,PyObject *Args)
int fd = GetLock(file, errors);
- return HandleErrors(Py_BuildValue("i", fd));
+ return HandleErrors(MkPyNumber(fd));
}
static char *doc_PkgSystemLock =
@@ -732,6 +733,12 @@ static struct _PyAptPkgAPIStruct API = {
&PyVersion_Type, // version_type
&PyVersion_FromCpp, // version_tocpp
&PyVersion_ToCpp, // version_tocpp
+ &PyGroup_Type, // group_type
+ &PyGroup_FromCpp, // group_fromcpp
+ &PyGroup_ToCpp, // group_tocpp
+ &PyOrderList_Type, // orderlist_type
+ &PyOrderList_FromCpp, // orderlist_fromcpp
+ &PyOrderList_ToCpp // orderlist_tocpp
};
@@ -811,6 +818,8 @@ extern "C" void initapt_pkg()
ADDTYPE(Module,"DependencyList",&PyDependencyList_Type); // NO __new__(), internal
ADDTYPE(Module,"Package",&PyPackage_Type); // NO __new__()
ADDTYPE(Module,"Version",&PyVersion_Type); // NO __new__()
+ ADDTYPE(Module,"Group", &PyGroup_Type);
+ ADDTYPE(Module,"GroupList", &PyGroupList_Type);
/* ============================ cdrom.cc ============================ */
ADDTYPE(Module,"Cdrom",&PyCdrom_Type);
/* ========================= configuration.cc ========================= */
@@ -824,7 +833,8 @@ extern "C" void initapt_pkg()
/* ========================= metaindex.cc ========================= */
ADDTYPE(Module,"MetaIndex",&PyMetaIndex_Type); // NO __new__()
/* ========================= pkgmanager.cc ========================= */
- ADDTYPE(Module,"PackageManager",&PyPackageManager_Type);
+ ADDTYPE(Module,"_PackageManager",&PyPackageManager_Type);
+ ADDTYPE(Module,"PackageManager",&PyPackageManager2_Type);
/* ========================= pkgrecords.cc ========================= */
ADDTYPE(Module,"PackageRecords",&PyPackageRecords_Type);
/* ========================= pkgsrcrecords.cc ========================= */
@@ -838,6 +848,7 @@ extern "C" void initapt_pkg()
ADDTYPE(Module,"AcquireItemDesc",&PyAcquireItemDesc_Type);
ADDTYPE(Module,"SystemLock",&PySystemLock_Type);
ADDTYPE(Module,"FileLock",&PyFileLock_Type);
+ ADDTYPE(Module,"OrderList",&PyOrderList_Type);
// Tag file constants
PyModule_AddObject(Module,"REWRITE_PACKAGE_ORDER",
CharCharToList(TFRewritePackageOrder));
@@ -845,86 +856,110 @@ extern "C" void initapt_pkg()
PyModule_AddObject(Module,"REWRITE_SOURCE_ORDER",
CharCharToList(TFRewriteSourceOrder));
+ PyDict_SetItemString(PyOrderList_Type.tp_dict, "FLAG_ADDED", MkPyNumber(pkgOrderList::Added));
+ PyDict_SetItemString(PyOrderList_Type.tp_dict, "FLAG_ADD_PENDIG", MkPyNumber(pkgOrderList::AddPending));
+ PyDict_SetItemString(PyOrderList_Type.tp_dict, "FLAG_IMMEDIATE", MkPyNumber(pkgOrderList::Immediate));
+ PyDict_SetItemString(PyOrderList_Type.tp_dict, "FLAG_LOOP", MkPyNumber(pkgOrderList::Loop));
+ PyDict_SetItemString(PyOrderList_Type.tp_dict, "FLAG_UNPACKED", MkPyNumber(pkgOrderList::UnPacked));
+ PyDict_SetItemString(PyOrderList_Type.tp_dict, "FLAG_CONFIGURED", MkPyNumber(pkgOrderList::Configured));
+ PyDict_SetItemString(PyOrderList_Type.tp_dict, "FLAG_REMOVED", MkPyNumber(pkgOrderList::Removed));
+ PyDict_SetItemString(PyOrderList_Type.tp_dict, "FLAG_IN_LIST", MkPyNumber(pkgOrderList::InList));
+ PyDict_SetItemString(PyOrderList_Type.tp_dict, "FLAG_AFTER", MkPyNumber(pkgOrderList::After));
+ PyDict_SetItemString(PyOrderList_Type.tp_dict, "FLAG_STATES_MASK", MkPyNumber(pkgOrderList::States));
// Acquire constants.
// some constants
PyDict_SetItemString(PyAcquire_Type.tp_dict, "RESULT_CANCELLED",
- Py_BuildValue("i", pkgAcquire::Cancelled));
+ MkPyNumber(pkgAcquire::Cancelled));
PyDict_SetItemString(PyAcquire_Type.tp_dict, "RESULT_CONTINUE",
- Py_BuildValue("i", pkgAcquire::Continue));
+ MkPyNumber(pkgAcquire::Continue));
PyDict_SetItemString(PyAcquire_Type.tp_dict, "RESULT_FAILED",
- Py_BuildValue("i", pkgAcquire::Failed));
+ MkPyNumber(pkgAcquire::Failed));
#ifdef COMPAT_0_7
PyDict_SetItemString(PyAcquire_Type.tp_dict, "ResultCancelled",
- Py_BuildValue("i", pkgAcquire::Cancelled));
+ MkPyNumber(pkgAcquire::Cancelled));
PyDict_SetItemString(PyAcquire_Type.tp_dict, "ResultContinue",
- Py_BuildValue("i", pkgAcquire::Continue));
+ MkPyNumber(pkgAcquire::Continue));
PyDict_SetItemString(PyAcquire_Type.tp_dict, "ResultFailed",
- Py_BuildValue("i", pkgAcquire::Failed));
+ MkPyNumber(pkgAcquire::Failed));
#endif
// Dependency constants
PyDict_SetItemString(PyDependency_Type.tp_dict, "TYPE_DEPENDS",
- Py_BuildValue("i", pkgCache::Dep::Depends));
+ MkPyNumber(pkgCache::Dep::Depends));
PyDict_SetItemString(PyDependency_Type.tp_dict, "TYPE_PREDEPENDS",
- Py_BuildValue("i", pkgCache::Dep::PreDepends));
+ MkPyNumber(pkgCache::Dep::PreDepends));
PyDict_SetItemString(PyDependency_Type.tp_dict, "TYPE_SUGGESTS",
- Py_BuildValue("i", pkgCache::Dep::Suggests));
+ MkPyNumber(pkgCache::Dep::Suggests));
PyDict_SetItemString(PyDependency_Type.tp_dict, "TYPE_RECOMMENDS",
- Py_BuildValue("i", pkgCache::Dep::Suggests));
+ MkPyNumber(pkgCache::Dep::Suggests));
PyDict_SetItemString(PyDependency_Type.tp_dict, "TYPE_CONFLICTS",
- Py_BuildValue("i", pkgCache::Dep::Conflicts));
+ MkPyNumber(pkgCache::Dep::Conflicts));
PyDict_SetItemString(PyDependency_Type.tp_dict, "TYPE_REPLACES",
- Py_BuildValue("i", pkgCache::Dep::Replaces));
+ MkPyNumber(pkgCache::Dep::Replaces));
PyDict_SetItemString(PyDependency_Type.tp_dict, "TYPE_OBSOLETES",
- Py_BuildValue("i", pkgCache::Dep::Obsoletes));
+ MkPyNumber(pkgCache::Dep::Obsoletes));
PyDict_SetItemString(PyDependency_Type.tp_dict, "TYPE_DPKG_BREAKS",
- Py_BuildValue("i", pkgCache::Dep::DpkgBreaks));
+ MkPyNumber(pkgCache::Dep::DpkgBreaks));
PyDict_SetItemString(PyDependency_Type.tp_dict, "TYPE_ENHANCES",
- Py_BuildValue("i", pkgCache::Dep::Enhances));
+ MkPyNumber(pkgCache::Dep::Enhances));
// PackageManager constants
PyDict_SetItemString(PyPackageManager_Type.tp_dict, "RESULT_COMPLETED",
- Py_BuildValue("i", pkgPackageManager::Completed));
+ MkPyNumber(pkgPackageManager::Completed));
PyDict_SetItemString(PyPackageManager_Type.tp_dict, "RESULT_FAILED",
- Py_BuildValue("i", pkgPackageManager::Failed));
+ MkPyNumber(pkgPackageManager::Failed));
PyDict_SetItemString(PyPackageManager_Type.tp_dict, "RESULT_INCOMPLETE",
- Py_BuildValue("i", pkgPackageManager::Incomplete));
+ MkPyNumber(pkgPackageManager::Incomplete));
#ifdef COMPAT_0_7
PyDict_SetItemString(PyPackageManager_Type.tp_dict, "ResultCompleted",
- Py_BuildValue("i", pkgPackageManager::Completed));
+ MkPyNumber(pkgPackageManager::Completed));
PyDict_SetItemString(PyPackageManager_Type.tp_dict, "ResultFailed",
- Py_BuildValue("i", pkgPackageManager::Failed));
+ MkPyNumber(pkgPackageManager::Failed));
PyDict_SetItemString(PyPackageManager_Type.tp_dict, "ResultIncomplete",
- Py_BuildValue("i", pkgPackageManager::Incomplete));
+ MkPyNumber(pkgPackageManager::Incomplete));
#endif
+ PyDict_SetItemString(PyVersion_Type.tp_dict, "MULTI_ARCH_NONE",
+ MkPyNumber(pkgCache::Version::None));
+ PyDict_SetItemString(PyVersion_Type.tp_dict, "MULTI_ARCH_ALL",
+ MkPyNumber(pkgCache::Version::All));
+ PyDict_SetItemString(PyVersion_Type.tp_dict, "MULTI_ARCH_FOREIGN",
+ MkPyNumber(pkgCache::Version::Foreign));
+ PyDict_SetItemString(PyVersion_Type.tp_dict, "MULTI_ARCH_SAME",
+ MkPyNumber(pkgCache::Version::Same));
+ PyDict_SetItemString(PyVersion_Type.tp_dict, "MULTI_ARCH_ALLOWED",
+ MkPyNumber(pkgCache::Version::Allowed));
+ PyDict_SetItemString(PyVersion_Type.tp_dict, "MULTI_ARCH_ALL_FOREIGN",
+ MkPyNumber(pkgCache::Version::AllForeign));
+ PyDict_SetItemString(PyVersion_Type.tp_dict, "MULTI_ARCH_ALL_ALLOWED",
+ MkPyNumber(pkgCache::Version::AllAllowed));
// AcquireItem Constants.
PyDict_SetItemString(PyAcquireItem_Type.tp_dict, "STAT_IDLE",
- Py_BuildValue("i", pkgAcquire::Item::StatIdle));
+ MkPyNumber(pkgAcquire::Item::StatIdle));
PyDict_SetItemString(PyAcquireItem_Type.tp_dict, "STAT_FETCHING",
- Py_BuildValue("i", pkgAcquire::Item::StatFetching));
+ MkPyNumber(pkgAcquire::Item::StatFetching));
PyDict_SetItemString(PyAcquireItem_Type.tp_dict, "STAT_DONE",
- Py_BuildValue("i", pkgAcquire::Item::StatDone));
+ MkPyNumber(pkgAcquire::Item::StatDone));
PyDict_SetItemString(PyAcquireItem_Type.tp_dict, "STAT_TRANSIENT_NETWORK_ERROR",
- Py_BuildValue("i", pkgAcquire::Item::StatTransientNetworkError));
+ MkPyNumber(pkgAcquire::Item::StatTransientNetworkError));
PyDict_SetItemString(PyAcquireItem_Type.tp_dict, "STAT_ERROR",
- Py_BuildValue("i", pkgAcquire::Item::StatError));
+ MkPyNumber(pkgAcquire::Item::StatError));
PyDict_SetItemString(PyAcquireItem_Type.tp_dict, "STAT_AUTH_ERROR",
- Py_BuildValue("i", pkgAcquire::Item::StatAuthError));
+ MkPyNumber(pkgAcquire::Item::StatAuthError));
#ifdef COMPAT_0_7
PyDict_SetItemString(PyAcquireItem_Type.tp_dict, "StatIdle",
- Py_BuildValue("i", pkgAcquire::Item::StatIdle));
+ MkPyNumber(pkgAcquire::Item::StatIdle));
PyDict_SetItemString(PyAcquireItem_Type.tp_dict, "StatFetching",
- Py_BuildValue("i", pkgAcquire::Item::StatFetching));
+ MkPyNumber(pkgAcquire::Item::StatFetching));
PyDict_SetItemString(PyAcquireItem_Type.tp_dict, "StatDone",
- Py_BuildValue("i", pkgAcquire::Item::StatDone));
+ MkPyNumber(pkgAcquire::Item::StatDone));
PyDict_SetItemString(PyAcquireItem_Type.tp_dict, "StatError",
- Py_BuildValue("i", pkgAcquire::Item::StatError));
+ MkPyNumber(pkgAcquire::Item::StatError));
PyDict_SetItemString(PyAcquireItem_Type.tp_dict, "StatAuthError",
- Py_BuildValue("i", pkgAcquire::Item::StatAuthError));
+ MkPyNumber(pkgAcquire::Item::StatAuthError));
#endif
#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 1
@@ -964,6 +999,7 @@ extern "C" void initapt_pkg()
PyModule_AddIntConstant(Module,"INSTSTATE_HOLD",pkgCache::State::Hold);
PyModule_AddIntConstant(Module,"INSTSTATE_HOLD_REINSTREQ",pkgCache::State::HoldReInstReq);
+
// DEPRECATED API
#ifdef COMPAT_0_7
PyModule_AddObject(Module,"RewritePackageOrder",
diff --git a/python/apt_pkgmodule.h b/python/apt_pkgmodule.h
index da647c3f..b3534a30 100644
--- a/python/apt_pkgmodule.h
+++ b/python/apt_pkgmodule.h
@@ -70,6 +70,8 @@ extern PyTypeObject PyCache_Type;
extern PyTypeObject PyCacheFile_Type;
extern PyTypeObject PyPackageList_Type;
extern PyTypeObject PyDescription_Type;
+extern PyTypeObject PyGroup_Type;
+extern PyTypeObject PyGroupList_Type; /* internal */
extern PyTypeObject PyPackage_Type;
extern PyTypeObject PyPackageFile_Type;
extern PyTypeObject PyDependency_Type;
@@ -100,6 +102,7 @@ PyObject *GetPkgAcqFile(PyObject *Self, PyObject *Args, PyObject *kwds);
// packagemanager
extern PyTypeObject PyPackageManager_Type;
+extern PyTypeObject PyPackageManager2_Type;
PyObject *GetPkgManager(PyObject *Self,PyObject *Args);
@@ -132,6 +135,7 @@ extern PyTypeObject PyAcquireItemDesc_Type;
extern PyTypeObject PyAcquireWorker_Type;
extern PyTypeObject PySystemLock_Type;
extern PyTypeObject PyFileLock_Type;
+extern PyTypeObject PyOrderList_Type;
// Functions to be exported in the public API.
@@ -149,6 +153,7 @@ extern PyTypeObject PyFileLock_Type;
# define PyDependency_ToCpp GetCpp<pkgCache::DepIterator>
# define PyDependencyList_ToCpp GetCpp<RDepListStruct> // TODO
# define PyDescription_ToCpp GetCpp<pkgCache::DescIterator>
+# define PyGroup_ToCpp GetCpp<pkgCache::GrpIterator>
# define PyHashes_ToCpp GetCpp<Hashes>
# define PyHashString_ToCpp GetCpp<HashString*>
# define PyIndexRecords_ToCpp GetCpp<indexRecords*>
@@ -156,6 +161,7 @@ extern PyTypeObject PyFileLock_Type;
# define PyPackage_ToCpp GetCpp<pkgCache::PkgIterator>
# define PyPackageFile_ToCpp GetCpp<pkgCache::PkgFileIterator>
# define PyIndexFile_ToCpp GetCpp<pkgIndexFile*>
+# define PyOrderList_ToCpp GetCpp<pkgOrderList*>
# define PyPackageList_ToCpp GetCpp<PkgListStruct> // TODO
# define PyPackageManager_ToCpp GetCpp<pkgPackageManager*>
# define PyPackageRecords_ToCpp GetCpp<PkgRecordsStruct> // TODO
@@ -186,7 +192,9 @@ PyObject* PyHashString_FromCpp(HashString* const &obj, bool Delete, PyObject *Ow
PyObject* PyIndexRecords_FromCpp(indexRecords* const &obj, bool Delete, PyObject *Owner);
PyObject* PyMetaIndex_FromCpp(metaIndex* const &obj, bool Delete, PyObject *Owner);
PyObject* PyPackage_FromCpp(pkgCache::PkgIterator const &obj, bool Delete, PyObject *Owner);
+PyObject* PyGroup_FromCpp(pkgCache::GrpIterator const &obj, bool Delete, PyObject *Owner);
PyObject* PyIndexFile_FromCpp(pkgIndexFile* const &obj, bool Delete, PyObject *Owner);
+PyObject* PyOrderList_FromCpp(pkgOrderList* const &obj, bool Delete, PyObject *Owner);
PyObject* PyPackageFile_FromCpp(pkgCache::PkgFileIterator const &obj, bool Delete, PyObject *Owner);
//PyObject* PyPackageList_FromCpp(PkgListStruct const &obj, bool Delete, PyObject *Owner);
PyObject* PyPackageManager_FromCpp(pkgPackageManager* const &obj, bool Delete, PyObject *Owner);
diff --git a/python/arfile.cc b/python/arfile.cc
index 5377ca8d..c3aa74d1 100644
--- a/python/arfile.cc
+++ b/python/arfile.cc
@@ -39,32 +39,32 @@ static PyObject *armember_get_name(PyObject *self, void *closure)
static PyObject *armember_get_mtime(PyObject *self, void *closure)
{
- return Py_BuildValue("k", GetCpp<ARArchive::Member*>(self)->MTime);
+ return MkPyNumber(GetCpp<ARArchive::Member*>(self)->MTime);
}
static PyObject *armember_get_uid(PyObject *self, void *closure)
{
- return Py_BuildValue("k", GetCpp<ARArchive::Member*>(self)->UID);
+ return MkPyNumber(GetCpp<ARArchive::Member*>(self)->UID);
}
static PyObject *armember_get_gid(PyObject *self, void *closure)
{
- return Py_BuildValue("k", GetCpp<ARArchive::Member*>(self)->GID);
+ return MkPyNumber(GetCpp<ARArchive::Member*>(self)->GID);
}
static PyObject *armember_get_mode(PyObject *self, void *closure)
{
- return Py_BuildValue("k", GetCpp<ARArchive::Member*>(self)->Mode);
+ return MkPyNumber(GetCpp<ARArchive::Member*>(self)->Mode);
}
static PyObject *armember_get_size(PyObject *self, void *closure)
{
- return Py_BuildValue("k", GetCpp<ARArchive::Member*>(self)->Size);
+ return MkPyNumber(GetCpp<ARArchive::Member*>(self)->Size);
}
static PyObject *armember_get_start(PyObject *self, void *closure)
{
- return Py_BuildValue("k", GetCpp<ARArchive::Member*>(self)->Start);
+ return MkPyNumber(GetCpp<ARArchive::Member*>(self)->Start);
}
static PyObject *armember_repr(PyObject *self)
diff --git a/python/cache.cc b/python/cache.cc
index 190d4f27..b263d320 100644
--- a/python/cache.cc
+++ b/python/cache.cc
@@ -39,13 +39,57 @@ const char *UntranslatedDepTypes[] =
};
/*}}}*/
-struct PkgListStruct
+
+template<typename T> struct IterListStruct
{
- pkgCache::PkgIterator Iter;
+ T Iter;
unsigned long LastIndex;
- PkgListStruct(pkgCache::PkgIterator const &I) : Iter(I), LastIndex(0) {}
- PkgListStruct() {abort();}; // G++ Bug..
+ IterListStruct(T const &I) : Iter(I), LastIndex(0) {}
+ IterListStruct() {};
+
+ bool move(unsigned long Index) {
+ if (Index < 0 || (unsigned)Index >= Count())
+ {
+ PyErr_SetNone(PyExc_IndexError);
+ return false;
+ }
+
+ if ((unsigned)Index < LastIndex)
+ {
+ LastIndex = 0;
+ Iter = Begin();
+ }
+
+ while ((unsigned)Index > LastIndex)
+ {
+ LastIndex++;
+ Iter++;
+ if (Iter.end() == true)
+ {
+ PyErr_SetNone(PyExc_IndexError);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ virtual unsigned Count() = 0;
+ virtual T Begin() = 0;
+
+};
+
+struct PkgListStruct : public IterListStruct<pkgCache::PkgIterator> {
+ unsigned Count() { return Iter.Cache()->HeaderP->PackageCount; }
+ pkgCache::PkgIterator Begin() { return Iter.Cache()->PkgBegin(); }
+
+ PkgListStruct(pkgCache::PkgIterator const &I) { Iter = I; }
+};
+
+struct GrpListStruct : public IterListStruct<pkgCache::GrpIterator> {
+ unsigned Count() { return Iter.Cache()->HeaderP->GroupCount; }
+ pkgCache::GrpIterator Begin() { return Iter.Cache()->GrpBegin(); }
+ GrpListStruct(pkgCache::GrpIterator const &I) { Iter = I; }
};
struct RDepListStruct
@@ -175,6 +219,16 @@ static PyMethodDef PkgCacheMethods[] =
{}
};
+static PyObject *PkgCacheGetGroupCount(PyObject *Self, void*) {
+ pkgCache *Cache = GetCpp<pkgCache *>(Self);
+ return MkPyNumber(Cache->HeaderP->GroupCount);
+}
+
+static PyObject *PkgCacheGetGroups(PyObject *Self, void*) {
+ pkgCache *Cache = GetCpp<pkgCache *>(Self);
+ return CppPyObject_NEW<GrpListStruct>(Self,&PyGroupList_Type,Cache->GrpBegin());
+}
+
static PyObject *PkgCacheGetPackages(PyObject *Self, void*) {
pkgCache *Cache = GetCpp<pkgCache *>(Self);
return CppPyObject_NEW<PkgListStruct>(Self,&PyPackageList_Type,Cache->PkgBegin());
@@ -182,31 +236,31 @@ static PyObject *PkgCacheGetPackages(PyObject *Self, void*) {
static PyObject *PkgCacheGetPackageCount(PyObject *Self, void*) {
pkgCache *Cache = GetCpp<pkgCache *>(Self);
- return Py_BuildValue("i",Cache->HeaderP->PackageCount);
+ return MkPyNumber((int)Cache->HeaderP->PackageCount);
}
static PyObject *PkgCacheGetVersionCount(PyObject *Self, void*) {
pkgCache *Cache = GetCpp<pkgCache *>(Self);
- return Py_BuildValue("i",Cache->HeaderP->VersionCount);
+ return MkPyNumber(Cache->HeaderP->VersionCount);
}
static PyObject *PkgCacheGetDependsCount(PyObject *Self, void*) {
pkgCache *Cache = GetCpp<pkgCache *>(Self);
- return Py_BuildValue("i",Cache->HeaderP->DependsCount);
+ return MkPyNumber(Cache->HeaderP->DependsCount);
}
static PyObject *PkgCacheGetPackageFileCount(PyObject *Self, void*) {
pkgCache *Cache = GetCpp<pkgCache *>(Self);
- return Py_BuildValue("i",Cache->HeaderP->PackageFileCount);
+ return MkPyNumber(Cache->HeaderP->PackageFileCount);
}
static PyObject *PkgCacheGetVerFileCount(PyObject *Self, void*) {
pkgCache *Cache = GetCpp<pkgCache *>(Self);
- return Py_BuildValue("i",Cache->HeaderP->VerFileCount);
+ return MkPyNumber(Cache->HeaderP->VerFileCount);
}
static PyObject *PkgCacheGetProvidesCount(PyObject *Self, void*) {
pkgCache *Cache = GetCpp<pkgCache *>(Self);
- return Py_BuildValue("i",Cache->HeaderP->ProvidesCount);
+ return MkPyNumber(Cache->HeaderP->ProvidesCount);
}
static PyObject *PkgCacheGetFileList(PyObject *Self, void*) {
@@ -222,11 +276,21 @@ static PyObject *PkgCacheGetFileList(PyObject *Self, void*) {
return List;
}
+static PyObject *PkgCacheGetIsMultiArch(PyObject *Self, void*) {
+ pkgCache *Cache = GetCpp<pkgCache *>(Self);
+ PyBool_FromLong(Cache->MultiArchCache());
+}
+
static PyGetSetDef PkgCacheGetSet[] = {
{"depends_count",PkgCacheGetDependsCount,0,
"The number of apt_pkg.Dependency objects stored in the cache."},
{"file_list",PkgCacheGetFileList,0,
"A list of apt_pkg.PackageFile objects stored in the cache."},
+ {"group_count",PkgCacheGetGroupCount,0,
+ "The number of apt_pkg.Group objects stored in the cache."},
+ {"groups", PkgCacheGetGroups, 0, "A list of Group objects in the cache"},
+ {"is_multi_arch", PkgCacheGetIsMultiArch, 0,
+ "Whether the cache supports multi-arch."},
{"package_count",PkgCacheGetPackageCount,0,
"The number of apt_pkg.Package objects stored in the cache."},
{"package_file_count",PkgCacheGetPackageFileCount,0,
@@ -242,24 +306,37 @@ static PyGetSetDef PkgCacheGetSet[] = {
{}
};
+// Helper to call FindPkg(name) or FindPkg(name, architecture)
+static pkgCache::PkgIterator CacheFindPkg(PyObject *self, PyObject *arg)
+{
+ const char *name;
+ const char *architecture;
+ pkgCache *cache = GetCpp<pkgCache *>(self);
+ name = PyObject_AsString(arg);
-// Map access, operator []
-static PyObject *CacheMapOp(PyObject *Self,PyObject *Arg)
-{
- pkgCache *Cache = GetCpp<pkgCache *>(Self);
+ if (name != NULL)
+ return cache->FindPkg(name);
- // Get the name of the package, unicode and normal strings.
- const char *Name = PyObject_AsString(Arg);
- if (Name == NULL)
- return 0;
+ PyErr_Clear();
+ if (PyArg_ParseTuple(arg, "ss", &name, &architecture) == 0) {
+ PyErr_Clear();
+ PyErr_Format(PyExc_TypeError, "Expected a string or a pair of strings");
+ return pkgCache::PkgIterator();
+ }
+
+ return cache->FindPkg(name, architecture);
+}
- // Search for the package
- pkgCache::PkgIterator Pkg = Cache->FindPkg(Name);
+// Map access, operator []
+static PyObject *CacheMapOp(PyObject *Self,PyObject *Arg)
+{
+ pkgCache::PkgIterator Pkg = CacheFindPkg(Self, Arg);
if (Pkg.end() == true)
{
- PyErr_SetString(PyExc_KeyError,Name);
+ if (!PyErr_Occurred())
+ PyErr_SetObject(PyExc_KeyError,Arg);
return 0;
}
@@ -269,11 +346,9 @@ static PyObject *CacheMapOp(PyObject *Self,PyObject *Arg)
// Check whether the cache contains a package with a given name.
static int CacheContains(PyObject *Self,PyObject *Arg)
{
- // Get the name of the package, unicode and normal strings.
- const char *Name = PyObject_AsString(Arg);
- if (Name == NULL)
- return 0;
- return (GetCpp<pkgCache *>(Self)->FindPkg(Name).end() == false);
+ bool res = (CacheFindPkg(Self, Arg).end() == false);
+ PyErr_Clear();
+ return res;
}
static PyObject *PkgCacheNew(PyTypeObject *type,PyObject *Args,PyObject *kwds)
@@ -292,7 +367,11 @@ static PyObject *PkgCacheNew(PyTypeObject *type,PyObject *Args,PyObject *kwds)
pkgCacheFile *Cache = new pkgCacheFile();
- if(pyCallbackInst != 0) {
+ if (pyCallbackInst == Py_None) {
+ OpProgress Prog;
+ if (Cache->Open(Prog,false) == false)
+ return HandleErrors();
+ } else if(pyCallbackInst != 0) {
// sanity check for the progress object, see #497049
if (PyObject_HasAttrString(pyCallbackInst, "done") != true) {
PyErr_SetString(PyExc_ValueError,
@@ -342,9 +421,11 @@ static char *doc_PkgCache = "Cache([progress]) -> Cache() object.\n\n"
"apt.progress.base.OpProgress() object (or similar) which reports\n"
"progress information while the cache is being opened. If this\n"
"parameter is not supplied, the progress will be reported in simple,\n"
- "human-readable text to standard output.\n\n"
+ "human-readable text to standard output. If it is None, no output\n"
+ "will be made.\n\n"
"The cache can be used like a mapping from package names to Package\n"
- "objects (although only getting items is supported).";
+ "objects (although only getting items is supported). Instead of a name,\n"
+ "a tuple of a name and an architecture may be used.";
static PySequenceMethods CacheSeq = {0,0,0,0,0,0,0,CacheContains,0,0};
static PyMappingMethods CacheMap = {CacheMapLen,CacheMapOp,0};
PyTypeObject PyCache_Type =
@@ -418,7 +499,7 @@ PyTypeObject PyCacheFile_Type =
0, // tp_as_buffer
Py_TPFLAGS_DEFAULT, // tp_flags
};
- /*}}}*/
+
// Package List Class /*{{{*/
// ---------------------------------------------------------------------
static Py_ssize_t PkgListLen(PyObject *Self)
@@ -429,29 +510,9 @@ static Py_ssize_t PkgListLen(PyObject *Self)
static PyObject *PkgListItem(PyObject *iSelf,Py_ssize_t Index)
{
PkgListStruct &Self = GetCpp<PkgListStruct>(iSelf);
- if (Index < 0 || (unsigned)Index >= Self.Iter.Cache()->HeaderP->PackageCount)
- {
- PyErr_SetNone(PyExc_IndexError);
- return 0;
- }
-
- if ((unsigned)Index < Self.LastIndex)
- {
- Self.LastIndex = 0;
- Self.Iter = Self.Iter.Cache()->PkgBegin();
- }
-
- while ((unsigned)Index > Self.LastIndex)
- {
- Self.LastIndex++;
- Self.Iter++;
- if (Self.Iter.end() == true)
- {
- PyErr_SetNone(PyExc_IndexError);
- return 0;
- }
- }
+ if (!Self.move(Index))
+ return 0;
return CppPyObject_NEW<pkgCache::PkgIterator>(GetOwner<PkgListStruct>(iSelf),&PyPackage_Type,
Self.Iter);
}
@@ -501,6 +562,68 @@ PyTypeObject PyPackageList_Type =
CppClear<PkgListStruct>, // tp_clear
};
+/* The same for groups */
+static Py_ssize_t GrpListLen(PyObject *Self)
+{
+ return GetCpp<GrpListStruct>(Self).Iter.Cache()->HeaderP->GroupCount;
+}
+
+static PyObject *GrpListItem(PyObject *iSelf,Py_ssize_t Index)
+{
+ GrpListStruct &Self = GetCpp<GrpListStruct>(iSelf);
+
+ if (!Self.move(Index))
+ return 0;
+ return CppPyObject_NEW<pkgCache::GrpIterator>(GetOwner<GrpListStruct>(iSelf),&PyGroup_Type,
+ Self.Iter);
+}
+
+static PySequenceMethods GrpListSeq =
+{
+ GrpListLen,
+ 0, // concat
+ 0, // repeat
+ GrpListItem,
+ 0, // slice
+ 0, // assign item
+ 0 // assign slice
+};
+
+static const char *grouplist_doc =
+ "A GroupList is an internally used structure to represent\n"
+ "the 'groups' attribute of apt_pkg.Cache objects in a more\n"
+ "efficient manner by creating Group objects only when they\n"
+ "are accessed.";
+
+PyTypeObject PyGroupList_Type =
+{
+ PyVarObject_HEAD_INIT(&PyType_Type, 0)
+ "apt_pkg.GroupList", // tp_name
+ sizeof(CppPyObject<GrpListStruct>), // tp_basicsize
+ 0, // tp_itemsize
+ // Methods
+ CppDealloc<GrpListStruct>, // tp_dealloc
+ 0, // tp_print
+ 0, // tp_getattr
+ 0, // tp_setattr
+ 0, // tp_compare
+ 0, // tp_repr
+ 0, // tp_as_number
+ &GrpListSeq, // tp_as_sequence
+ 0, // tp_as_mapping
+ 0, // tp_hash
+ 0, // tp_call
+ 0, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, // tp_flags
+ grouplist_doc, // tp_doc
+ CppTraverse<GrpListStruct>, // tp_traverse
+ CppClear<GrpListStruct>, // tp_clear
+};
+
+
#define Owner (GetOwner<pkgCache::PkgIterator>(Self))
#define MkGet(PyFunc,Ret) static PyObject *PyFunc(PyObject *Self,void*) \
{ \
@@ -514,10 +637,10 @@ MkGet(PackageGetSection,Safe_FromString(Pkg.Section()))
MkGet(PackageGetRevDependsList,CppPyObject_NEW<RDepListStruct>(Owner,
&PyDependencyList_Type, Pkg.RevDependsList()))
MkGet(PackageGetProvidesList,CreateProvides(Owner,Pkg.ProvidesList()))
-MkGet(PackageGetSelectedState,Py_BuildValue("i",Pkg->SelectedState))
-MkGet(PackageGetInstState,Py_BuildValue("i",Pkg->InstState))
-MkGet(PackageGetCurrentState,Py_BuildValue("i",Pkg->CurrentState))
-MkGet(PackageGetID,Py_BuildValue("i",Pkg->ID))
+MkGet(PackageGetSelectedState,MkPyNumber(Pkg->SelectedState))
+MkGet(PackageGetInstState,MkPyNumber(Pkg->InstState))
+MkGet(PackageGetCurrentState,MkPyNumber(Pkg->CurrentState))
+MkGet(PackageGetID,MkPyNumber(Pkg->ID))
#
MkGet(PackageGetAuto,PyBool_FromLong((Pkg->Flags & pkgCache::Flag::Auto) != 0))
MkGet(PackageGetEssential,PyBool_FromLong((Pkg->Flags & pkgCache::Flag::Essential) != 0))
@@ -714,7 +837,7 @@ static PyObject *DescriptionGetFileList(PyObject *Self,void*)
PyObject *DescFile;
PyObject *Obj;
DescFile = CppPyObject_NEW<pkgCache::PkgFileIterator>(Owner,&PyPackageFile_Type,I.File());
- Obj = Py_BuildValue("Nl",DescFile,I.Index());
+ Obj = Py_BuildValue("NN",DescFile,MkPyNumber(I.Index()));
PyList_Append(List,Obj);
Py_DECREF(Obj);
}
@@ -869,7 +992,7 @@ static PyObject *VersionGetFileList(PyObject *Self, void*) {
PyObject *PkgFile;
PyObject *Obj;
PkgFile = CppPyObject_NEW<pkgCache::PkgFileIterator>(Owner,&PyPackageFile_Type,I.File());
- Obj = Py_BuildValue("Nl",PkgFile,I.Index());
+ Obj = Py_BuildValue("NN",PkgFile,MkPyNumber(I.Index()));
PyList_Append(List,Obj);
Py_DECREF(Obj);
}
@@ -896,19 +1019,19 @@ static PyObject *VersionGetProvidesList(PyObject *Self, void*) {
return CreateProvides(Owner,Version_GetVer(Self).ProvidesList());
}
static PyObject *VersionGetSize(PyObject *Self, void*) {
- return Py_BuildValue("i", Version_GetVer(Self)->Size);
+ return MkPyNumber(Version_GetVer(Self)->Size);
}
static PyObject *VersionGetInstalledSize(PyObject *Self, void*) {
- return Py_BuildValue("i", Version_GetVer(Self)->InstalledSize);
+ return MkPyNumber(Version_GetVer(Self)->InstalledSize);
}
static PyObject *VersionGetHash(PyObject *Self, void*) {
- return Py_BuildValue("i", Version_GetVer(Self)->Hash);
+ return MkPyNumber(Version_GetVer(Self)->Hash);
}
static PyObject *VersionGetID(PyObject *Self, void*) {
- return Py_BuildValue("i", Version_GetVer(Self)->ID);
+ return MkPyNumber(Version_GetVer(Self)->ID);
}
static PyObject *VersionGetPriority(PyObject *Self, void*) {
- return Py_BuildValue("i",Version_GetVer(Self)->Priority);
+ return MkPyNumber(Version_GetVer(Self)->Priority);
}
static PyObject *VersionGetPriorityStr(PyObject *Self, void*) {
return Safe_FromString(Version_GetVer(Self).PriorityType());
@@ -924,6 +1047,11 @@ static PyObject *VersionGetTranslatedDescription(PyObject *Self, void*) {
Ver.TranslatedDescription());
}
+static PyObject *VersionGetMultiArch(PyObject *Self, void*)
+{
+ return MkPyNumber(Version_GetVer(Self)->MultiArch);
+}
+
#if 0 // FIXME: enable once pkgSourceList is stored somewhere
static PyObject *VersionGetIsTrusted(PyObject *Self, void*) {
else if (strcmp("IsTrusted", Name) == 0)
@@ -999,6 +1127,9 @@ static PyGetSetDef VersionGetSet[] = {
"The numeric ID of the package."},
{"installed_size",VersionGetInstalledSize,0,
"The installed size of this package version."},
+ {"multi_arch",VersionGetMultiArch,0,
+ "Multi-arch state of this package, as an integer. See\n"
+ "the various MULTI_ARCH_* members."},
{"parent_pkg",VersionGetParentPkg,0,
"The parent package of this version."},
{"priority",VersionGetPriority,0,
@@ -1118,7 +1249,7 @@ static PyObject *PackageFile_GetIndexType(PyObject *Self,void*)
static PyObject *PackageFile_GetSize(PyObject *Self,void*)
{
pkgCache::PkgFileIterator &File = GetCpp<pkgCache::PkgFileIterator>(Self);
- return Py_BuildValue("i",File->Size);
+ return MkPyNumber(File->Size);
}
static PyObject *PackageFile_GetNotSource(PyObject *Self,void*)
@@ -1135,7 +1266,7 @@ static PyObject *PackageFile_GetNotAutomatic(PyObject *Self,void*)
static PyObject *PackageFile_GetID(PyObject *Self,void*)
{
pkgCache::PkgFileIterator &File = GetCpp<pkgCache::PkgFileIterator>(Self);
- return Py_BuildValue("i",File->ID);
+ return MkPyNumber(File->ID);
}
#define S(s) (s == NULL ? "" : s)
@@ -1344,13 +1475,13 @@ static PyObject *DependencyGetDepTypeUntranslated(PyObject *Self,void*)
static PyObject *DependencyGetDepTypeEnum(PyObject *Self,void*)
{
pkgCache::DepIterator &Dep = GetCpp<pkgCache::DepIterator>(Self);
- return Py_BuildValue("i", Dep->Type);
+ return MkPyNumber(Dep->Type);
}
static PyObject *DependencyGetID(PyObject *Self,void*)
{
pkgCache::DepIterator &Dep = GetCpp<pkgCache::DepIterator>(Self);
- return Py_BuildValue("i",Dep->ID);
+ return MkPyNumber(Dep->ID);
}
static PyGetSetDef DependencyGetSet[] = {
diff --git a/python/cachegroup.cc b/python/cachegroup.cc
new file mode 100644
index 00000000..4fc6c378
--- /dev/null
+++ b/python/cachegroup.cc
@@ -0,0 +1,188 @@
+/*
+ * cachegroup.cc - Wrapper around pkgCache::GrpIterator
+ *
+ * Copyright 2011 Julian Andres Klode <jak@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+#include <Python.h>
+#include "apt_pkgmodule.h"
+#include "generic.h"
+#include <apt-pkg/pkgcache.h>
+
+struct PyGroup : CppPyObject<pkgCache::GrpIterator> {
+ pkgCache::PkgIterator current;
+ int nextIndex;
+};
+
+static PyObject *group_new(PyTypeObject *type,PyObject *args,
+ PyObject *kwds)
+{
+ PyObject *pyCache;
+ char *name;
+ char *kwlist[] = {"cache", "name", NULL};
+ if (PyArg_ParseTupleAndKeywords(args, kwds, "O!s", kwlist,
+ &PyCache_Type, &pyCache,
+ &name) == 0)
+ return 0;
+
+ pkgCache *cache = GetCpp<pkgCache *>(pyCache);
+
+ pkgCache::GrpIterator grp = cache->FindGrp(name);
+
+ if (!grp.end()) {
+ return PyGroup_FromCpp(grp, true, pyCache);
+ } else {
+ PyErr_SetString(PyExc_KeyError, name);
+ return NULL;
+ }
+}
+
+static const char group_find_package_doc[] =
+ "find_package(architecture: str) -> Package\n\n"
+ "Return a package for the given architecture, or None if none exists";
+static PyObject *group_find_package(PyObject *self,PyObject *args)
+{
+ pkgCache::GrpIterator grp = GetCpp<pkgCache::GrpIterator>(self);
+ PyObject *owner = GetOwner<pkgCache::GrpIterator>(self);
+
+ char *architecture;
+ if (PyArg_ParseTuple(args, "s", &architecture) == 0)
+ return 0;
+
+ pkgCache::PkgIterator pkg = grp.FindPkg(architecture);
+
+ if (pkg.end()) {
+ Py_RETURN_NONE;
+ } else {
+ return PyPackage_FromCpp(pkg, true, owner ? owner : self);
+ }
+}
+
+static const char group_find_preferred_package_doc[] =
+ "find_preferred_package(prefer_non_virtual: bool = True) -> Package\n\n"
+ "Return a package for the best architecture, either the native one\n"
+ "or the first found one. If none exists, return None. If non_virtual\n"
+ "is True, prefer non-virtual packages over virtual ones.";
+static PyObject *group_find_preferred_package(PyObject *self,PyObject *args,
+ PyObject *kwds)
+{
+ pkgCache::GrpIterator grp = GetCpp<pkgCache::GrpIterator>(self);
+ PyObject *owner = GetOwner<pkgCache::GrpIterator>(self);
+ char nonvirtual = 1;
+ char *kwlist[] = {"prefer_non_virtual", NULL};
+ if (PyArg_ParseTupleAndKeywords(args, kwds, "|b", kwlist, &nonvirtual) == 0)
+ return 0;
+ pkgCache::PkgIterator pkg = grp.FindPreferredPkg(nonvirtual);
+
+ if (pkg.end()) {
+ Py_RETURN_NONE;
+ } else {
+ return PyPackage_FromCpp(pkg, true, owner);
+ }
+}
+
+static PyMethodDef group_methods[] = {
+ {"find_package",group_find_package,METH_VARARGS,group_find_package_doc},
+ {"find_preferred_package",(PyCFunction) group_find_preferred_package,
+ METH_VARARGS|METH_KEYWORDS,group_find_preferred_package_doc},
+ {}
+};
+
+static PyObject *group_seq_item(PyObject *pySelf,Py_ssize_t index)
+{
+ PyGroup *self = static_cast<PyGroup *>(pySelf);
+ pkgCache::GrpIterator grp = GetCpp<pkgCache::GrpIterator>(self);
+ PyObject *owner = GetOwner<pkgCache::GrpIterator>(self);
+
+ if (self->nextIndex > index || self->nextIndex == 0) {
+ self->nextIndex = 1;
+ new (&self->current) pkgCache::PkgIterator(grp.PackageList());
+ }
+
+ if (self->nextIndex != index + 1) {
+ while (self->nextIndex <= index && !self->current.end()) {
+ self->current = grp.NextPkg(self->current);
+ self->nextIndex++;
+ }
+ }
+
+ if (self->current.end())
+ return PyErr_Format(PyExc_IndexError, "Out of range: %zd", index);
+
+ return PyPackage_FromCpp(self->current, true, owner);
+}
+
+
+static PySequenceMethods group_as_sequence =
+{
+ 0,
+ 0, // concat
+ 0, // repeat
+ group_seq_item,
+ 0, // slice
+ 0, // assign item
+ 0 // assign slice
+};
+
+
+static const char group_doc[] = "Group(cache, name)\n\n"
+ "Group of packages with the same name.\n\n"
+ "Provides access to all packages sharing a name. Can be used this\n"
+ "like a list, or by using the special find_*() methods. If you use\n"
+ "it as a sequence, make sure to access it linearly, as this uses a\n"
+ "linked list internally.";
+PyTypeObject PyGroup_Type = {
+ PyVarObject_HEAD_INIT(&PyType_Type, 0)
+ "apt_pkg.Group", // tp_name
+ sizeof(PyGroup), // tp_basicsize
+ 0, // tp_itemsize
+ // Methods
+ CppDealloc<pkgCache::GrpIterator>, // tp_dealloc
+ 0, // tp_print
+ 0, // tp_getattr
+ 0, // tp_setattr
+ 0, // tp_compare
+ 0, // tp_repr
+ 0, // tp_as_number
+ &group_as_sequence, // tp_as_sequence
+ 0, // tp_as_mapping
+ 0, // tp_hash
+ 0, // tp_call
+ 0, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ Py_TPFLAGS_DEFAULT, // tp_flags
+ group_doc, // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ 0, // tp_iter
+ 0, // tp_iternext
+ group_methods, // tp_methods
+ 0, // tp_members
+ 0, // tp_getset
+ 0, // tp_base
+ 0, // tp_dict
+ 0, // tp_descr_get
+ 0, // tp_descr_set
+ 0, // tp_dictoffset
+ 0, // tp_init
+ 0, // tp_alloc
+ group_new, // tp_new
+};
diff --git a/python/configuration.cc b/python/configuration.cc
index 93e92efa..9000f71f 100644
--- a/python/configuration.cc
+++ b/python/configuration.cc
@@ -92,7 +92,7 @@ static PyObject *CnfFindI(PyObject *Self,PyObject *Args)
int Default = 0;
if (PyArg_ParseTuple(Args,"s|i",&Name,&Default) == 0)
return 0;
- return Py_BuildValue("i",GetSelf(Self).FindI(Name,Default));
+ return MkPyNumber(GetSelf(Self).FindI(Name,Default));
}
static const char *doc_FindB =
@@ -438,6 +438,10 @@ PyObject *ParseCommandLine(PyObject *Self,PyObject *Args)
return 0;
}
+ if (PySequence_Length(Pargv) < 1) {
+ PyErr_SetString(PyExc_ValueError,"argv is an empty sequence");
+ return 0;
+ }
// Convert the option list
int Length = PySequence_Length(POList);
CommandLine::Args *OList = new CommandLine::Args[Length+1];
diff --git a/python/depcache.cc b/python/depcache.cc
index 12c13a73..e6113429 100644
--- a/python/depcache.cc
+++ b/python/depcache.cc
@@ -668,22 +668,22 @@ static PyMethodDef PkgDepCacheMethods[] =
#define depcache (GetCpp<pkgDepCache *>(Self))
static PyObject *PkgDepCacheGetKeepCount(PyObject *Self,void*) {
- return Py_BuildValue("l", depcache->KeepCount());
+ return MkPyNumber(depcache->KeepCount());
}
static PyObject *PkgDepCacheGetInstCount(PyObject *Self,void*) {
- return Py_BuildValue("l", depcache->InstCount());
+ return MkPyNumber(depcache->InstCount());
}
static PyObject *PkgDepCacheGetDelCount(PyObject *Self,void*) {
- return Py_BuildValue("l", depcache->DelCount());
+ return MkPyNumber(depcache->DelCount());
}
static PyObject *PkgDepCacheGetBrokenCount(PyObject *Self,void*) {
- return Py_BuildValue("l", depcache->BrokenCount());
+ return MkPyNumber(depcache->BrokenCount());
}
static PyObject *PkgDepCacheGetUsrSize(PyObject *Self,void*) {
- return Py_BuildValue("L", depcache->UsrSize());
+ return MkPyNumber(depcache->UsrSize());
}
static PyObject *PkgDepCacheGetDebSize(PyObject *Self,void*) {
- return Py_BuildValue("L", depcache->DebSize());
+ return MkPyNumber(depcache->DebSize());
}
#undef depcache
diff --git a/python/generic.h b/python/generic.h
index ce9e5091..f9680ca5 100644
--- a/python/generic.h
+++ b/python/generic.h
@@ -57,6 +57,7 @@ typedef int Py_ssize_t;
#define PyString_Type PyUnicode_Type
#define PyInt_Check PyLong_Check
#define PyInt_AsLong PyLong_AsLong
+#define PyInt_FromLong PyLong_FromLong
// Force 0.7 compatibility to be off in Python 3 builds
#undef COMPAT_0_7
#else
@@ -231,6 +232,21 @@ PyObject *HandleErrors(PyObject *Res = 0);
const char **ListToCharChar(PyObject *List,bool NullTerm = false);
PyObject *CharCharToList(const char **List,unsigned long Size = 0);
+/* Happy number conversion, thanks to overloading */
+inline PyObject *MkPyNumber(unsigned long long o) { return PyLong_FromUnsignedLongLong(o); }
+inline PyObject *MkPyNumber(unsigned long o) { return PyLong_FromUnsignedLong(o); }
+inline PyObject *MkPyNumber(unsigned int o) { return PyLong_FromUnsignedLong(o); }
+inline PyObject *MkPyNumber(unsigned short o) { return PyInt_FromLong(o); }
+inline PyObject *MkPyNumber(unsigned char o) { return PyInt_FromLong(o); }
+
+inline PyObject *MkPyNumber(long long o) { return PyLong_FromLongLong(o); }
+inline PyObject *MkPyNumber(long o) { return PyInt_FromLong(o); }
+inline PyObject *MkPyNumber(int o) { return PyInt_FromLong(o); }
+inline PyObject *MkPyNumber(short o) { return PyInt_FromLong(o); }
+inline PyObject *MkPyNumber(char o) { return PyInt_FromLong(o); }
+
+inline PyObject *MkPyNumber(double o) { return PyFloat_FromDouble(o); }
+
# ifdef COMPAT_0_7
PyObject *_PyAptObject_getattro(PyObject *self, PyObject *attr);
# else
diff --git a/python/indexfile.cc b/python/indexfile.cc
index 037be210..bf0df516 100644
--- a/python/indexfile.cc
+++ b/python/indexfile.cc
@@ -47,7 +47,7 @@ static PyObject *IndexFileGetHasPackages(PyObject *Self,void*) {
return PyBool_FromLong((File->HasPackages()));
}
static PyObject *IndexFileGetSize(PyObject *Self,void*) {
- return Py_BuildValue("i",(File->Size()));
+ return MkPyNumber((File->Size()));
}
static PyObject *IndexFileGetIsTrusted(PyObject *Self,void*) {
return PyBool_FromLong((File->IsTrusted()));
diff --git a/python/indexrecords.cc b/python/indexrecords.cc
index d6a3263c..c7623cfd 100644
--- a/python/indexrecords.cc
+++ b/python/indexrecords.cc
@@ -63,7 +63,7 @@ static PyObject *indexrecords_lookup(PyObject *self,PyObject *args)
// Copy the HashString(), to prevent crashes and to not require the
// indexRecords object to exist.
PyObject *py_hash = PyHashString_FromCpp(new HashString(result->Hash), true, NULL);
- PyObject *value = Py_BuildValue("(Oi)",py_hash,result->Size);
+ PyObject *value = Py_BuildValue("(ON)",py_hash,MkPyNumber(result->Size));
Py_DECREF(py_hash);
return value;
}
diff --git a/python/orderlist.cc b/python/orderlist.cc
new file mode 100644
index 00000000..9fbed5f2
--- /dev/null
+++ b/python/orderlist.cc
@@ -0,0 +1,317 @@
+/*
+ * orderlist.cc - Wrapper around pkgOrderList
+ *
+ * Copyright 2011 Julian Andres Klode <jak@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+
+#include <Python.h>
+#include "apt_pkgmodule.h"
+#include "generic.h"
+#include <apt-pkg/orderlist.h>
+
+struct PyOrderList : CppPyObject<pkgOrderList*> {
+ pkgCache::PkgIterator current;
+ int nextIndex;
+};
+
+static PyObject *order_list_new(PyTypeObject *type,PyObject *args,
+ PyObject *kwds)
+{
+ PyObject *pyDepCache = NULL;
+ char *kwlist[] = {"depcache", NULL};
+ if (PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist,
+ &PyDepCache_Type, &pyDepCache)
+ == 0)
+ return 0;
+
+ pkgDepCache *depCache = PyDepCache_ToCpp(pyDepCache);
+ return PyOrderList_FromCpp(new pkgOrderList(depCache), true,
+ pyDepCache);
+}
+
+static const char order_list_append_doc[] =
+ "append(pkg: Package)\n\n"
+ "Append a package to the end of the list.";
+static PyObject *order_list_append(PyObject *self,PyObject *args)
+{
+ pkgOrderList *list = GetCpp<pkgOrderList*>(self);
+ PyObject *pyPackage = NULL;
+ if (PyArg_ParseTuple(args, "O!", &PyPackage_Type, &pyPackage) == 0)
+ return 0;
+
+ list->push_back(PyPackage_ToCpp(pyPackage));
+ Py_RETURN_NONE;
+}
+
+static const char order_list_score_doc[] =
+ "score(pkg: Package) -> int\n\n"
+ "Return the score of the package.";
+static PyObject *order_list_score(PyObject *self,PyObject *args)
+{
+ pkgOrderList *list = GetCpp<pkgOrderList*>(self);
+ PyObject *pyPackage = NULL;
+ if (PyArg_ParseTuple(args, "O!", &PyPackage_Type, &pyPackage) == 0)
+ return 0;
+
+ return MkPyNumber(list->Score(PyPackage_ToCpp(pyPackage)));
+}
+
+static const char order_list_order_critical_doc[] =
+ "order_critical()\n\n"
+ "Order by PreDepends only (critical unpack order).";
+static PyObject *order_list_order_critical(PyObject *self,PyObject *args)
+{
+ pkgOrderList *list = GetCpp<pkgOrderList*>(self);
+ if (PyArg_ParseTuple(args, "") == 0)
+ return 0;
+
+ list->OrderCritical();
+
+ Py_INCREF(Py_None);
+ return HandleErrors(Py_None);
+}
+
+static const char order_list_order_unpack_doc[] =
+ "order_unpack()\n\n"
+ "Order the packages for unpacking (see Debian Policy).";
+static PyObject *order_list_order_unpack(PyObject *self,PyObject *args)
+{
+ pkgOrderList *list = GetCpp<pkgOrderList*>(self);
+ if (PyArg_ParseTuple(args, "") == 0)
+ return 0;
+
+ list->OrderUnpack();
+ Py_INCREF(Py_None);
+ return HandleErrors(Py_None);
+}
+
+static const char order_list_order_configure_doc[] =
+ "order_configure()\n\n"
+ "Order the packages for configuration (see Debian Policy).";
+static PyObject *order_list_order_configure(PyObject *self,PyObject *args)
+{
+ pkgOrderList *list = GetCpp<pkgOrderList*>(self);
+ if (PyArg_ParseTuple(args, "") == 0)
+ return 0;
+
+ list->OrderConfigure();
+
+ Py_INCREF(Py_None);
+ return HandleErrors(Py_None);
+}
+
+static bool valid_flags(unsigned int flags) {
+ return (flags & ~pkgOrderList::Added
+ & ~pkgOrderList::AddPending
+ & ~pkgOrderList::Immediate
+ & ~pkgOrderList::Loop
+ & ~pkgOrderList::UnPacked
+ & ~pkgOrderList::Configured
+ & ~pkgOrderList::Removed
+ & ~pkgOrderList::InList
+ & ~pkgOrderList::After
+ & ~pkgOrderList::States) == 0;
+}
+
+static const char order_list_flag_doc[] =
+ "flag(pkg: Package, flag: int[, unset_flags: int])\n\n"
+ "Flag the package, set flags in 'flag' and remove flags in\n"
+ "'unset_flags'.";
+static PyObject *order_list_flag(PyObject *self,PyObject *args)
+{
+ pkgOrderList *list = GetCpp<pkgOrderList*>(self);
+
+ PyObject *pyPkg = NULL;
+ unsigned int flags = 0;
+ unsigned int unset_flags = 0;
+ if (PyArg_ParseTuple(args, "O!I|I", &PyPackage_Type, &pyPkg,
+ &flags, &unset_flags) == 0)
+ return 0;
+
+ if (!valid_flags(flags))
+ return PyErr_Format(PyExc_ValueError, "flags (%u) is"
+ " not a valid combination of flags.",
+ flags);
+ if (!valid_flags(unset_flags))
+ return PyErr_Format(PyExc_ValueError, "unset_flags (%u) is"
+ " not a valid combination of flags.",
+ unset_flags);
+
+ list->Flag(PyPackage_ToCpp(pyPkg), flags, unset_flags);
+
+ Py_RETURN_NONE;
+}
+
+static const char order_list_is_flag_doc[] =
+ "is_flag(pkg: Package, flag: int)\n\n"
+ "Check if the flag(s) are set.";
+static PyObject *order_list_is_flag(PyObject *self,PyObject *args)
+{
+ pkgOrderList *list = GetCpp<pkgOrderList*>(self);
+ PyObject *pyPkg = NULL;
+ unsigned int flags = 0;
+ if (PyArg_ParseTuple(args, "O!I", &PyPackage_Type, &pyPkg,
+ &flags) == 0)
+ return 0;
+
+ if (!valid_flags(flags))
+ return PyErr_Format(PyExc_ValueError, "flags (%u) is"
+ " not a valid combination of flags.",
+ flags);
+
+ return PyBool_FromLong(list->IsFlag(PyPackage_ToCpp(pyPkg), flags));
+}
+
+static const char order_list_wipe_flags_doc[] =
+ "wipe_flags(flags: int)\n\n"
+ "Remove the flags in 'flags' from all packages in this list";
+static PyObject *order_list_wipe_flags(PyObject *self,PyObject *args)
+{
+ pkgOrderList *list = GetCpp<pkgOrderList*>(self);
+ unsigned int flags = 0;
+ if (PyArg_ParseTuple(args, "I", &flags) == 0)
+ return 0;
+
+ if (!valid_flags(flags))
+ return PyErr_Format(PyExc_ValueError, "flags (%u) is"
+ " not a valid combination of flags.",
+ flags);
+
+ list->WipeFlags(flags);
+ Py_RETURN_NONE;
+}
+
+static const char order_list_is_now_doc[] =
+ "is_now(pkg: Package)\n\n"
+ "Check if the package is flagged for any state but removal.";
+static PyObject *order_list_is_now(PyObject *self,PyObject *args)
+{
+ pkgOrderList *list = GetCpp<pkgOrderList*>(self);
+ PyObject *pyPkg = NULL;
+ if (PyArg_ParseTuple(args, "O!", &PyPackage_Type, &pyPkg) == 0)
+ return 0;
+
+ return PyBool_FromLong(list->IsNow(PyPackage_ToCpp(pyPkg)));
+}
+
+static const char order_list_is_missing_doc[] =
+ "is_now(pkg: Package)\n\n"
+ "Check if the package is marked for install.";
+static PyObject *order_list_is_missing(PyObject *self,PyObject *args)
+{
+ pkgOrderList *list = GetCpp<pkgOrderList*>(self);
+ PyObject *pyPkg = NULL;
+ if (PyArg_ParseTuple(args, "O!", &PyPackage_Type, &pyPkg) == 0)
+ return 0;
+
+ return PyBool_FromLong(list->IsMissing(PyPackage_ToCpp(pyPkg)));
+}
+
+
+#define METHOD(name) {#name, order_list_##name, METH_VARARGS,\
+ order_list_##name##_doc}
+
+static PyMethodDef order_list_methods[] = {
+ METHOD(append),
+ METHOD(score),
+ METHOD(order_critical),
+ METHOD(order_unpack),
+ METHOD(order_configure),
+ METHOD(flag),
+ METHOD(is_flag),
+ METHOD(is_now),
+ METHOD(is_missing),
+ METHOD(wipe_flags),
+ {}
+};
+
+static PyObject *order_list_seq_item(PyObject *self,Py_ssize_t index)
+{
+ pkgOrderList *list = GetCpp<pkgOrderList*>(self);
+ PyObject *owner = GetOwner<pkgOrderList*>(self);
+ PyObject *pycache = GetOwner<pkgOrderList*>(owner);
+ pkgCache *cache = PyCache_ToCpp(pycache);
+
+ if (index < 0 || index >= list->size())
+ return PyErr_Format(PyExc_IndexError, "Out of range: %zd", index);
+
+ return PyPackage_FromCpp(pkgCache::PkgIterator(*cache,
+ *(list->begin() + index)),
+ true, owner);
+}
+
+Py_ssize_t order_list_seq_length(PyObject *self)
+{
+ return GetCpp<pkgOrderList*>(self)->size();
+}
+
+static PySequenceMethods order_list_as_sequence =
+{
+ order_list_seq_length, // sq_length
+ 0, // sq_concat
+ 0, // sq_repeat
+ order_list_seq_item, // sq_item
+ 0, // sq_ass_item
+ 0, // sq_contains
+ 0, // sq_inplace_concat
+ 0 // sq_inplace_repeat
+};
+
+static const char order_list_doc[] = "OrderList(depcache: DepCache)\n\n"
+ "Sequence type for packages with special ordering methods.";
+PyTypeObject PyOrderList_Type = {
+ PyVarObject_HEAD_INIT(&PyType_Type, 0)
+ "apt_pkg.OrderList", // tp_name
+ sizeof(CppPyObject<pkgOrderList*>), // tp_basicsize
+ 0, // tp_itemsize
+ // Methods
+ CppDeallocPtr<pkgOrderList*>, // tp_dealloc
+ 0, // tp_print
+ 0, // tp_getattr
+ 0, // tp_setattr
+ 0, // tp_compare
+ 0, // tp_repr
+ 0, // tp_as_number
+ &order_list_as_sequence, // tp_as_sequence
+ 0, // tp_as_mapping
+ 0, // tp_hash
+ 0, // tp_call
+ 0, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ Py_TPFLAGS_DEFAULT, // tp_flags
+ order_list_doc, // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ 0, // tp_iter
+ 0, // tp_iternext
+ order_list_methods, // tp_methods
+ 0, // tp_members
+ 0, // tp_getset
+ 0, // tp_base
+ 0, // tp_dict
+ 0, // tp_descr_get
+ 0, // tp_descr_set
+ 0, // tp_dictoffset
+ 0, // tp_init
+ 0, // tp_alloc
+ order_list_new, // tp_new
+};
diff --git a/python/pkgmanager.cc b/python/pkgmanager.cc
index 95e8c27e..b7bed658 100644
--- a/python/pkgmanager.cc
+++ b/python/pkgmanager.cc
@@ -17,36 +17,10 @@
#include <apt-pkg/acquire.h>
#include <apt-pkg/init.h>
#include <apt-pkg/configuration.h>
+#include <apt-pkg/dpkgpm.h>
#include <iostream>
-static PyObject *PkgManagerNew(PyTypeObject *type,PyObject *Args,PyObject *kwds)
-{
- PyObject *Owner;
- char *kwlist[] = {"depcache",0};
- if (PyArg_ParseTupleAndKeywords(Args,kwds,"O!",kwlist,&PyDepCache_Type,
- &Owner) == 0)
- return 0;
-
- pkgPackageManager *pm = _system->CreatePM(GetCpp<pkgDepCache*>(Owner));
-
- CppPyObject<pkgPackageManager*> *PkgManagerObj =
- CppPyObject_NEW<pkgPackageManager*>(NULL, type,pm);
-
- return PkgManagerObj;
-}
-
-#ifdef COMPAT_0_7
-PyObject *GetPkgManager(PyObject *Self,PyObject *Args)
-{
- PyErr_WarnEx(PyExc_DeprecationWarning, "apt_pkg.GetPackageManager() is "
- "deprecated. Please see apt_pkg.PackageManager() for the "
- "replacement.", 1);
- return PkgManagerNew(&PyPackageManager_Type,Args,0);
-}
-#endif
-
-
static PyObject *PkgManagerGetArchives(PyObject *Self,PyObject *Args)
{
pkgPackageManager *pm = GetCpp<pkgPackageManager*>(Self);
@@ -79,7 +53,7 @@ static PyObject *PkgManagerDoInstall(PyObject *Self,PyObject *Args)
pkgPackageManager::OrderResult res = pm->DoInstall(status_fd);
- return HandleErrors(Py_BuildValue("i",res));
+ return HandleErrors(MkPyNumber(res));
}
static PyObject *PkgManagerFixMissing(PyObject *Self,PyObject *Args)
@@ -114,17 +88,16 @@ static PyMethodDef PkgManagerMethods[] =
{}
};
-
static const char *packagemanager_doc =
- "PackageManager(depcache: apt_pkg.DepCache)\n\n"
- "PackageManager objects allow the fetching of packages marked for\n"
- "installation and the installation of those packages. The parameter\n"
- "'depcache' specifies an apt_pkg.DepCache object where information\n"
- "about the package selections is retrieved from.";
+ "_PackageManager objects allow the fetching of packages marked for\n"
+ "installation and the installation of those packages.\n"
+ "This is an abstract base class that cannot be subclassed\n"
+ "in Python. The only subclass is apt_pkg.PackageManager. This\n"
+ "class is an implementation-detail and not part of the API.";
PyTypeObject PyPackageManager_Type =
{
PyVarObject_HEAD_INIT(&PyType_Type, 0)
- "apt_pkg.PackageManager", // tp_name
+ "apt_pkg._PackageManager", // tp_name
sizeof(CppPyObject<pkgPackageManager*>), // tp_basicsize
0, // tp_itemsize
// Methods
@@ -143,8 +116,7 @@ PyTypeObject PyPackageManager_Type =
_PyAptObject_getattro, // tp_getattro
0, // tp_setattro
0, // tp_as_buffer
- (Py_TPFLAGS_DEFAULT | // tp_flags
- Py_TPFLAGS_BASETYPE),
+ Py_TPFLAGS_DEFAULT, // tp_flag,
packagemanager_doc, // tp_doc
0, // tp_traverse
0, // tp_clear
@@ -162,9 +134,240 @@ PyTypeObject PyPackageManager_Type =
0, // tp_dictoffset
0, // tp_init
0, // tp_alloc
- PkgManagerNew, // tp_new
+ 0, // tp_new
+};
+
+
+struct CppPyRef {
+ PyObject *o;
+ CppPyRef(const CppPyRef &o) { Py_XINCREF(o); this->o = o; }
+ CppPyRef(PyObject *o) : o(o) {}
+ ~CppPyRef() { Py_XDECREF(o); }
+ operator PyObject *() const { return o; }
+ PyObject *operator->() const { return o; }
};
+class PyPkgManager : public pkgDPkgPM {
+ bool res(CppPyRef result) {
+ if (result == NULL) {
+ std::cerr << "Error in function: " << std::endl;
+ PyErr_Print();
+ PyErr_Clear();
+ return false;
+ }
+ return (result != NULL &&
+ (result == Py_None || PyObject_IsTrue(result) == 1));
+ }
+
+
+ PyObject *GetPyPkg(const PkgIterator &Pkg) {
+ PyObject *depcache = NULL;
+ PyObject *cache = NULL;
+
+ depcache = GetOwner<PyPkgManager*>(pyinst);
+ if (depcache != NULL && PyDepCache_Check(depcache))
+ cache = GetOwner<pkgDepCache*>(depcache);
+
+ return PyPackage_FromCpp(Pkg, true, cache);
+ }
+
+ /* Call through to Python */
+ virtual bool Install(PkgIterator Pkg,string File) {
+ return res(PyObject_CallMethod(pyinst, "install", "(NN)",
+ GetPyPkg(Pkg),
+ CppPyString(File)));
+ }
+ virtual bool Configure(PkgIterator Pkg) {
+ return res(PyObject_CallMethod(pyinst, "configure", "(N)",
+ GetPyPkg(Pkg)));
+ }
+ virtual bool Remove(PkgIterator Pkg,bool Purge = false) {
+ return res(PyObject_CallMethod(pyinst, "remove", "(NN)",
+ GetPyPkg(Pkg),
+ PyBool_FromLong(Purge)));
+ }
+ virtual bool Go(int StatusFd=-1) {
+ return res(PyObject_CallMethod(pyinst, "go", "(i)",
+ StatusFd));
+ }
+ virtual void Reset() {
+ CppPyRef(PyObject_CallMethod(pyinst, "reset", NULL));
+ }
+
+public:
+ /* Those call the protected functions from the parent class */
+ bool callInstall(PkgIterator Pkg,string File) { return pkgDPkgPM::Install(Pkg, File); }
+ bool callRemove(PkgIterator Pkg, bool Purge) { return pkgDPkgPM::Remove(Pkg, Purge); }
+ bool callGo(int StatusFd=-1) { return pkgDPkgPM::Go(StatusFd); }
+ void callReset() { return pkgDPkgPM::Reset(); }
+ bool callConfigure(PkgIterator Pkg) { return pkgDPkgPM::Configure(Pkg); }
+ pkgOrderList *getOrderList() { return pkgPackageManager::List; }
+
+ PyPkgManager(pkgDepCache *Cache) : pkgDPkgPM(Cache) {};
+ PyObject *pyinst;
+};
+
+static PyObject *PkgManagerNew(PyTypeObject *type,PyObject *Args,PyObject *kwds)
+{
+ PyObject *Owner;
+ char *kwlist[] = {"depcache",0};
+ if (PyArg_ParseTupleAndKeywords(Args,kwds,"O!",kwlist,&PyDepCache_Type,
+ &Owner) == 0)
+ return 0;
+
+ PyPkgManager *pm = new PyPkgManager(GetCpp<pkgDepCache*>(Owner));
+
+ CppPyObject<PyPkgManager*> *PkgManagerObj =
+ CppPyObject_NEW<PyPkgManager*>(NULL, type,pm);
+
+ pm->pyinst = PkgManagerObj;
+
+ return PkgManagerObj;
+}
+
+#ifdef COMPAT_0_7
+PyObject *GetPkgManager(PyObject *Self,PyObject *Args)
+{
+ PyErr_WarnEx(PyExc_DeprecationWarning, "apt_pkg.GetPackageManager() is "
+ "deprecated. Please see apt_pkg.PackageManager() for the "
+ "replacement.", 1);
+ return PkgManagerNew(&PyPackageManager2_Type,Args,0);
+}
+#endif
+
+static PyObject *PkgManagerInstall(PyObject *Self,PyObject *Args)
+{
+ PyPkgManager *pm = GetCpp<PyPkgManager*>(Self);
+ PyObject *pkg;
+ const char *file;
+
+ if (PyArg_ParseTuple(Args, "O!s", &PyPackage_Type,&pkg, &file) == 0)
+ return 0;
+
+ return HandleErrors(PyBool_FromLong(pm->callInstall(PyPackage_ToCpp(pkg), file)));
+}
+
+
+static PyObject *PkgManagerConfigure(PyObject *Self,PyObject *Args)
+{
+ PyPkgManager *pm = GetCpp<PyPkgManager*>(Self);
+ PyObject *pkg;
+
+ if (PyArg_ParseTuple(Args, "O!", &PyPackage_Type,&pkg) == 0)
+ return 0;
+
+ return HandleErrors(PyBool_FromLong(pm->callConfigure(PyPackage_ToCpp(pkg))));
+}
+
+static PyObject *PkgManagerRemove(PyObject *Self,PyObject *Args)
+{
+ PyPkgManager *pm = GetCpp<PyPkgManager*>(Self);
+ PyObject *pkg;
+ char purge;
+
+ if (PyArg_ParseTuple(Args, "O!b", &PyPackage_Type,&pkg, &purge) == 0)
+ return 0;
+
+ return HandleErrors(PyBool_FromLong(pm->callRemove(PyPackage_ToCpp(pkg), purge)));
+}
+
+static PyObject *PkgManagerGo(PyObject *Self,PyObject *Args)
+{
+ PyPkgManager *pm = GetCpp<PyPkgManager*>(Self);
+ int fd;
+
+ if (PyArg_ParseTuple(Args, "i", &fd) == 0)
+ return 0;
+
+ return HandleErrors(PyBool_FromLong(pm->callGo(fd)));
+}
+
+static PyObject *PkgManagerReset(PyObject *Self,PyObject *Args)
+{
+ PyPkgManager *pm = GetCpp<PyPkgManager*>(Self);
+
+ pm->callReset();
+ Py_INCREF(Py_None);
+ return HandleErrors(Py_None);
+}
+
+static PyMethodDef PkgManager2Methods[] =
+{
+ {"install",PkgManagerInstall,METH_VARARGS,
+ "install(pkg: Package, filename: str) -> bool \n\n"
+ "Add a install action. Can be overriden in subclasses.\n\n"
+ "New in version 0.8.0."},
+ {"configure",PkgManagerConfigure,METH_VARARGS,
+ "configure(pkg: Package) -> bool \n\n"
+ "Add a configure action. Can be overriden in subclasses.\n\n"
+ "New in version 0.8.0."},
+ {"remove",PkgManagerRemove,METH_VARARGS,
+ "remove(pkg: Package, purge: bool) -> bool \n\n"
+ "Add a removal action. Can be overriden in subclasses.\n\n"
+ "New in version 0.8.0."},
+ {"go",PkgManagerGo,METH_VARARGS,
+ "go(status_fd: int) -> bool \n\n"
+ "Start dpkg. Can be overriden in subclasses.\n\n"
+ "New in version 0.8.0."},
+ {"reset",PkgManagerReset,METH_VARARGS,
+ "reset()\n\n"
+ "Reset the package manager for a new round.\n"
+ "Can be overriden in subclasses.\n\n"
+ "New in version 0.8.0."},
+ {}
+};
+
+static const char *packagemanager2_doc =
+ "PackageManager(depcache: apt_pkg.DepCache)\n\n"
+ "PackageManager objects allow the fetching of packages marked for\n"
+ "installation and the installation of those packages. The parameter\n"
+ "'depcache' specifies an apt_pkg.DepCache object where information\n"
+ "about the package selections is retrieved from.\n\n"
+ "Methods in this class can be overriden in sub classes\n"
+ "to implement behavior different from APT's dpkg implementation.";
+PyTypeObject PyPackageManager2_Type =
+{
+ PyVarObject_HEAD_INIT(&PyType_Type, 0)
+ "apt_pkg.PackageManager", // tp_name
+ sizeof(CppPyObject<PyPkgManager*>), // tp_basicsize
+ 0, // tp_itemsize
+ // Methods
+ CppDeallocPtr<PyPkgManager*>, // tp_dealloc
+ 0, // tp_print
+ 0, // tp_getattr
+ 0, // tp_setattr
+ 0, // tp_compare
+ 0, // tp_repr
+ 0, // tp_as_number
+ 0, // tp_as_sequence
+ 0, // tp_as_mapping
+ 0, // tp_hash
+ 0, // tp_call
+ 0, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ (Py_TPFLAGS_DEFAULT | // tp_flags
+ Py_TPFLAGS_BASETYPE),
+ packagemanager2_doc, // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ 0, // tp_iter
+ 0, // tp_iternext
+ PkgManager2Methods, // tp_methods
+ 0, // tp_members
+ 0, // tp_getset
+ &PyPackageManager_Type, // tp_base
+ 0, // tp_dict
+ 0, // tp_descr_get
+ 0, // tp_descr_set
+ 0, // tp_dictoffset
+ 0, // tp_init
+ 0, // tp_alloc
+ PkgManagerNew, // tp_new
+};
/*}}}*/
diff --git a/python/pkgsrcrecords.cc b/python/pkgsrcrecords.cc
index aad3ef7e..4c889129 100644
--- a/python/pkgsrcrecords.cc
+++ b/python/pkgsrcrecords.cc
@@ -147,9 +147,9 @@ static PyObject *PkgSrcRecordsGetFiles(PyObject *Self,void*) {
PyObject *v;
for(unsigned int i=0;i<f.size();i++) {
- v = Py_BuildValue("(siss)",
+ v = Py_BuildValue("(sNss)",
f[i].MD5Hash.c_str(),
- f[i].Size,
+ MkPyNumber(f[i].Size),
f[i].Path.c_str(),
f[i].Type.c_str());
PyList_Append(List, v);
@@ -218,8 +218,10 @@ static PyObject *PkgSrcRecordsGetBuildDepends_old(PyObject *Self,void*) {
PyObject *v;
for(unsigned int i=0;i<bd.size();i++) {
- v = Py_BuildValue("(ssii)", bd[i].Package.c_str(),
- bd[i].Version.c_str(), bd[i].Op, bd[i].Type);
+ v = Py_BuildValue("(ssNN)", bd[i].Package.c_str(),
+ bd[i].Version.c_str(),
+ MkPyNumber(bd[i].Op),
+ MkPyNumber(bd[i].Type));
PyList_Append(List, v);
Py_DECREF(v);
}
diff --git a/python/policy.cc b/python/policy.cc
index 7eccb30c..b11e4dde 100644
--- a/python/policy.cc
+++ b/python/policy.cc
@@ -45,7 +45,7 @@ PyObject *policy_get_priority(PyObject *self, PyObject *arg) {
pkgPolicy *policy = GetCpp<pkgPolicy *>(self);
if (PyObject_TypeCheck(arg, &PyPackage_Type)) {
pkgCache::PkgIterator pkg = GetCpp<pkgCache::PkgIterator>(arg);
- return Py_BuildValue("i", policy->GetPriority(pkg));
+ return MkPyNumber(policy->GetPriority(pkg));
} else {
PyErr_SetString(PyExc_TypeError,"Argument must be of Package().");
return 0;
diff --git a/python/progress.cc b/python/progress.cc
index 5700a1b6..bd3c2ad6 100644
--- a/python/progress.cc
+++ b/python/progress.cc
@@ -92,12 +92,12 @@ void PyOpProgress::Update()
setattr(callbackInst, "op", "s", Op.c_str());
setattr(callbackInst, "subop", "s", SubOp.c_str());
setattr(callbackInst, "major_change", "b", MajorChange);
- setattr(callbackInst, "percent", "f", Percent);
+ setattr(callbackInst, "percent", "N", MkPyNumber(Percent));
#ifdef COMPAT_0_7
setattr(callbackInst, "Op", "s", Op.c_str());
setattr(callbackInst, "subOp", "s", SubOp.c_str());
setattr(callbackInst, "majorChange", "b", MajorChange);
- PyObject *arglist = Py_BuildValue("(f)", Percent);
+ PyObject *arglist = Py_BuildValue("(N)", MkPyNumber(Percent));
RunSimpleCallback("update", arglist);
#else
RunSimpleCallback("update");
@@ -156,19 +156,19 @@ void PyFetchProgress::UpdateStatus(pkgAcquire::ItemDesc &Itm, int status)
// Added object file size and object partial size to
// parameters that are passed to updateStatus.
// -- Stephan
- PyObject *arglist = Py_BuildValue("(sssikk)", Itm.URI.c_str(),
+ PyObject *arglist = Py_BuildValue("(sssNNN)", Itm.URI.c_str(),
Itm.Description.c_str(),
Itm.ShortDesc.c_str(),
- status,
- Itm.Owner->FileSize,
- Itm.Owner->PartialSize);
+ MkPyNumber(status),
+ MkPyNumber(Itm.Owner->FileSize),
+ MkPyNumber(Itm.Owner->PartialSize));
RunSimpleCallback("update_status_full", arglist);
// legacy version of the interface
- arglist = Py_BuildValue("(sssi)", Itm.URI.c_str(), Itm.Description.c_str(),
- Itm.ShortDesc.c_str(), status);
+ arglist = Py_BuildValue("(sssN)", Itm.URI.c_str(), Itm.Description.c_str(),
+ Itm.ShortDesc.c_str(), MkPyNumber(status));
if(PyObject_HasAttrString(callbackInst, "updateStatus"))
RunSimpleCallback("updateStatus", arglist);
@@ -240,11 +240,11 @@ void PyFetchProgress::Start()
pkgAcquireStatus::Start();
#ifdef COMPAT_0_7
- setattr(callbackInst, "currentCPS", "d", 0);
- setattr(callbackInst, "currentBytes", "d", 0);
- setattr(callbackInst, "currentItems", "k", 0);
- setattr(callbackInst, "totalItems", "k", 0);
- setattr(callbackInst, "totalBytes", "d", 0);
+ setattr(callbackInst, "currentCPS", "N", MkPyNumber(0));
+ setattr(callbackInst, "currentBytes", "N", MkPyNumber(0));
+ setattr(callbackInst, "currentItems", "N", MkPyNumber(0));
+ setattr(callbackInst, "totalItems", "N", MkPyNumber(0));
+ setattr(callbackInst, "totalBytes", "N", MkPyNumber(0));
#endif
RunSimpleCallback("start");
@@ -280,14 +280,14 @@ bool PyFetchProgress::Pulse(pkgAcquire * Owner)
return false;
}
- setattr(callbackInst, "last_bytes", "d", LastBytes);
- setattr(callbackInst, "current_cps", "d", CurrentCPS);
- setattr(callbackInst, "current_bytes", "d", CurrentBytes);
- setattr(callbackInst, "total_bytes", "d", TotalBytes);
- setattr(callbackInst, "fetched_bytes", "d", FetchedBytes);
- setattr(callbackInst, "elapsed_time", "k", ElapsedTime);
- setattr(callbackInst, "current_items", "k", CurrentItems);
- setattr(callbackInst, "total_items", "k", TotalItems);
+ setattr(callbackInst, "last_bytes", "N", MkPyNumber(LastBytes));
+ setattr(callbackInst, "current_cps", "N", MkPyNumber(CurrentCPS));
+ setattr(callbackInst, "current_bytes", "N", MkPyNumber(CurrentBytes));
+ setattr(callbackInst, "total_bytes", "N", MkPyNumber(TotalBytes));
+ setattr(callbackInst, "fetched_bytes", "N", MkPyNumber(FetchedBytes));
+ setattr(callbackInst, "elapsed_time", "N", MkPyNumber(ElapsedTime));
+ setattr(callbackInst, "current_items", "N", MkPyNumber(CurrentItems));
+ setattr(callbackInst, "total_items", "N", MkPyNumber(TotalItems));
// New style
if (!PyObject_HasAttrString(callbackInst, "updateStatus")) {
@@ -313,12 +313,12 @@ bool PyFetchProgress::Pulse(pkgAcquire * Owner)
return true;
}
#ifdef COMPAT_0_7
- setattr(callbackInst, "currentCPS", "d", CurrentCPS);
- setattr(callbackInst, "currentBytes", "d", CurrentBytes);
- setattr(callbackInst, "totalBytes", "d", TotalBytes);
- setattr(callbackInst, "fetchedBytes", "d", FetchedBytes);
- setattr(callbackInst, "currentItems", "k", CurrentItems);
- setattr(callbackInst, "totalItems", "k", TotalItems);
+ setattr(callbackInst, "currentCPS", "N", MkPyNumber(CurrentCPS));
+ setattr(callbackInst, "currentBytes", "N", MkPyNumber(CurrentBytes));
+ setattr(callbackInst, "totalBytes", "N", MkPyNumber(TotalBytes));
+ setattr(callbackInst, "fetchedBytes", "N", MkPyNumber(FetchedBytes));
+ setattr(callbackInst, "currentItems", "N", MkPyNumber(CurrentItems));
+ setattr(callbackInst, "totalItems", "N", MkPyNumber(TotalItems));
// Go through the list of items and add active items to the
// activeItems vector.
map<pkgAcquire::Worker *, pkgAcquire::ItemDesc *> activeItemMap;
@@ -351,11 +351,11 @@ bool PyFetchProgress::Pulse(pkgAcquire * Owner)
pkgAcquire::Worker *worker = iter->first;
pkgAcquire::ItemDesc *itm = iter->second;
- PyObject *itmTuple = Py_BuildValue("(ssskk)", itm->URI.c_str(),
+ PyObject *itmTuple = Py_BuildValue("(sssNN)", itm->URI.c_str(),
itm->Description.c_str(),
itm->ShortDesc.c_str(),
- worker->TotalSize,
- worker->CurrentSize);
+ MkPyNumber(worker->TotalSize),
+ MkPyNumber(worker->CurrentSize));
PyTuple_SetItem(itemsTuple, tuplePos, itmTuple);
}
diff --git a/python/python-apt-helpers.cc b/python/python-apt-helpers.cc
index 7a0f20c4..079b93cf 100644
--- a/python/python-apt-helpers.cc
+++ b/python/python-apt-helpers.cc
@@ -52,7 +52,9 @@ NEW_FROM(PyHashString_FromCpp,&PyHashString_Type,HashString*)
NEW_FROM(PyIndexRecords_FromCpp,&PyIndexRecords_Type,indexRecords*)
NEW_FROM(PyMetaIndex_FromCpp,&PyMetaIndex_Type,metaIndex*)
NEW_FROM(PyPackage_FromCpp,&PyPackage_Type,pkgCache::PkgIterator)
+NEW_FROM(PyGroup_FromCpp,&PyGroup_Type,pkgCache::GrpIterator)
NEW_FROM(PyIndexFile_FromCpp,&PyIndexFile_Type,pkgIndexFile*)
+NEW_FROM(PyOrderList_FromCpp,&PyOrderList_Type,pkgOrderList*)
NEW_FROM(PyPackageFile_FromCpp,&PyPackageFile_Type,pkgCache::PkgFileIterator)
//NEW_FROM(PyPackageList_FromCpp,&PyPackageList_Type,PkgListStruct)
NEW_FROM(PyPackageManager_FromCpp,&PyPackageManager_Type,pkgPackageManager*)
diff --git a/python/python-apt.h b/python/python-apt.h
index b9fc9212..6f2a02df 100644
--- a/python/python-apt.h
+++ b/python/python-apt.h
@@ -167,6 +167,13 @@ struct _PyAptPkgAPIStruct {
PyObject* (*version_fromcpp)(pkgCache::VerIterator const &obj, bool Delete, PyObject *Owner);
pkgCache::VerIterator& (*version_tocpp)(PyObject *self);
+ PyTypeObject *group_type;
+ PyObject* (*group_fromcpp)(pkgCache::GrpIterator const &obj, bool Delete, PyObject *Owner);
+ pkgCache::GrpIterator& (*group_tocpp)(PyObject *self);
+
+ PyTypeObject *orderlist_type;
+ PyObject* (*orderlist_fromcpp)(pkgOrderList* const &obj, bool Delete, PyObject *Owner);
+ pkgOrderList*& (*orderlist_tocpp)(PyObject *self);
};
// Checking macros.
@@ -184,6 +191,7 @@ struct _PyAptPkgAPIStruct {
# define PyDependency_Check(op) PyObject_TypeCheck(op, &PyDependency_Type)
# define PyDependencyList_Check(op) PyObject_TypeCheck(op, &PyDependencyList_Type)
# define PyDescription_Check(op) PyObject_TypeCheck(op, &PyDescription_Type)
+# define PyGroup_Check(op) PyObject_TypeCheck(op, &PyGroup_Type)
# define PyHashes_Check(op) PyObject_TypeCheck(op, &PyHashes_Type)
# define PyHashString_Check(op) PyObject_TypeCheck(op, &PyHashString_Type)
# define PyIndexRecords_Check(op) PyObject_TypeCheck(op, &PyIndexRecords_Type)
@@ -217,12 +225,14 @@ struct _PyAptPkgAPIStruct {
# define PyDependencyList_CheckExact(op) (op->op_type == &PyDependencyList_Type)
# define PyDescription_CheckExact(op) (op->op_type == &PyDescription_Type)
# define PyHashes_CheckExact(op) (op->op_type == &PyHashes_Type)
+# define PyGroup_CheckExact(op) (op->op_type == &PyGroup_Type)
# define PyHashString_CheckExact(op) (op->op_type == &PyHashString_Type)
# define PyIndexRecords_CheckExact(op) (op->op_type == &PyIndexRecords_Type)
# define PyMetaIndex_CheckExact(op) (op->op_type == &PyMetaIndex_Type)
# define PyPackage_CheckExact(op) (op->op_type == &PyPackage_Type)
# define PyPackageFile_CheckExact(op) (op->op_type == &PyPackageFile_Type)
# define PyIndexFile_CheckExact(op) (op->op_type == &PyIndexFile_Type)
+# define PyOrderList_CheckExact(op) (op->op_type == &PyOrderList_Type)
# define PyPackageList_CheckExact(op) (op->op_type == &PyPackageList_Type)
# define PyPackageManager_CheckExact(op) (op->op_type == &PyPackageManager_Type)
# define PyPackageRecords_CheckExact(op) (op->op_type == &PyPackageRecords_Type)
@@ -260,6 +270,7 @@ static int import_apt_pkg(void) {
# define PyDependency_Type *(_PyAptPkg_API->dependency_type)
# define PyDependencyList_Type *(_PyAptPkg_API->dependencylist_type)
# define PyDescription_Type *(_PyAptPkg_API->description_type)
+# define PyGroup_Type *(_PyAptPkg_API->group_type)
# define PyHashes_Type *(_PyAptPkg_API->hashes_type)
# define PyHashString_Type *(_PyAptPkg_API->hashstring_type)
# define PyIndexRecords_Type *(_PyAptPkg_API->indexrecords_type)
@@ -267,6 +278,7 @@ static int import_apt_pkg(void) {
# define PyPackage_Type *(_PyAptPkg_API->package_type)
# define PyPackageFile_Type *(_PyAptPkg_API->packagefile_type)
# define PyIndexFile_Type *(_PyAptPkg_API->packageindexfile_type)
+# define PyOrderList_Type *(_PyAptPkg_API->orderlist_type)
# define PyPackageList_Type *(_PyAptPkg_API->packagelist_type)
# define PyPackageManager_Type *(_PyAptPkg_API->packagemanager_type)
# define PyPackageRecords_Type *(_PyAptPkg_API->packagerecords_type)
@@ -292,6 +304,7 @@ static int import_apt_pkg(void) {
# define PyDependency_ToCpp _PyAptPkg_API->dependency_tocpp
# define PyDependencyList_ToCpp _PyAptPkg_API->dependencylist_tocpp // NULL
# define PyDescription_ToCpp _PyAptPkg_API->description_tocpp
+# define PyGroup_ToCpp _PyAptPkg_API->group_tocpp
# define PyHashes_ToCpp _PyAptPkg_API->hashes_tocpp
# define PyHashString_ToCpp _PyAptPkg_API->hashstring_tocpp
# define PyIndexRecords_ToCpp _PyAptPkg_API->indexrecords_tocpp
@@ -299,6 +312,7 @@ static int import_apt_pkg(void) {
# define PyPackage_ToCpp _PyAptPkg_API->package_tocpp
# define PyPackageFile_ToCpp _PyAptPkg_API->packagefile_tocpp
# define PyIndexFile_ToCpp _PyAptPkg_API->packageindexfile_tocpp
+# define PyOrderList_ToCpp _PyAptPkg_API->orderlist_tocpp // NULL
# define PyPackageList_ToCpp _PyAptPkg_API->packagelist_tocpp // NULL
# define PyPackageManager_ToCpp _PyAptPkg_API->packagemanager_tocpp
# define PyPackageRecords_ToCpp _PyAptPkg_API->packagerecords_tocpp
@@ -324,6 +338,7 @@ static int import_apt_pkg(void) {
# define PyDependency_FromCpp _PyAptPkg_API->dependency_fromcpp
# define PyDependencyList_FromCpp _PyAptPkg_API->dependencylist_fromcpp // NULL
# define PyDescription_FromCpp _PyAptPkg_API->description_fromcpp
+# define PyGroup_FromCpp _PyAptPkg_API->group_fromcpp
# define PyHashes_FromCpp _PyAptPkg_API->hashes_fromcpp
# define PyHashString_FromCpp _PyAptPkg_API->hashstring_fromcpp
# define PyIndexRecords_FromCpp _PyAptPkg_API->indexrecords_fromcpp
@@ -331,6 +346,7 @@ static int import_apt_pkg(void) {
# define PyPackage_FromCpp _PyAptPkg_API->package_fromcpp
# define PyPackageFile_FromCpp _PyAptPkg_API->packagefile_fromcpp
# define PyIndexFile_FromCpp _PyAptPkg_API->packageindexfile_fromcpp
+# define PyOrderList_FromCpp _PyAptPkg_API->orderlist_fromcpp // NULL
# define PyPackageList_FromCpp _PyAptPkg_API->packagelist_fromcpp // NULL
# define PyPackageManager_FromCpp _PyAptPkg_API->packagemanager_fromcpp
# define PyPackageRecords_FromCpp _PyAptPkg_API->packagerecords_fromcpp
diff --git a/python/string.cc b/python/string.cc
index 6a1ce4e2..7abe2d17 100644
--- a/python/string.cc
+++ b/python/string.cc
@@ -28,11 +28,11 @@ PyObject *Python(PyObject *Self,PyObject *Args) \
return CppPyString(CFunc(Str)); \
}
-#define MkInt(Python,CFunc) \
+#define MkInt(Python,CFunc, ctype, pytype) \
PyObject *Python(PyObject *Self,PyObject *Args) \
{ \
- int Val = 0; \
- if (PyArg_ParseTuple(Args,"i",&Val) == 0) \
+ ctype Val = 0; \
+ if (PyArg_ParseTuple(Args,pytype,&Val) == 0) \
return 0; \
return CppPyString(CFunc(Val)); \
}
@@ -56,8 +56,8 @@ PyObject *StrBase64Encode(PyObject *Self,PyObject *Args) {
MkStr(StrURItoFileName,URItoFileName);
//MkFloat(StrSizeToStr,SizeToStr);
-MkInt(StrTimeToStr,TimeToStr);
-MkInt(StrTimeRFC1123,TimeRFC1123);
+MkInt(StrTimeToStr,TimeToStr, unsigned long, "k");
+MkInt(StrTimeRFC1123,TimeRFC1123, long long, "L");
/*}}}*/
// Other String functions /*{{{*/
@@ -91,7 +91,7 @@ PyObject *StrStringToBool(PyObject *Self,PyObject *Args)
char *Str = 0;
if (PyArg_ParseTuple(Args,"s",&Str) == 0)
return 0;
- return Py_BuildValue("i",StringToBool(Str));
+ return MkPyNumber(StringToBool(Str));
}
PyObject *StrStrToTime(PyObject *Self,PyObject *Args)
@@ -107,7 +107,7 @@ PyObject *StrStrToTime(PyObject *Self,PyObject *Args)
return Py_None;
}
- return Py_BuildValue("i",Result);
+ return MkPyNumber(Result);
}
PyObject *StrCheckDomainList(PyObject *Self,PyObject *Args)
diff --git a/python/tag.cc b/python/tag.cc
index 44cd06af..94554400 100644
--- a/python/tag.cc
+++ b/python/tag.cc
@@ -247,7 +247,7 @@ static PyObject *TagSecBytes(PyObject *Self,PyObject *Args)
if (PyArg_ParseTuple(Args,"") == 0)
return 0;
- return Py_BuildValue("i",GetCpp<pkgTagSection>(Self).size());
+ return MkPyNumber(GetCpp<pkgTagSection>(Self).size());
}
static PyObject *TagSecStr(PyObject *Self)
@@ -319,7 +319,8 @@ static PyObject *TagFileOffset(PyObject *Self,PyObject *Args)
{
if (PyArg_ParseTuple(Args,"") == 0)
return 0;
- return Py_BuildValue("i",((TagFileData *)Self)->Object.Offset());
+ return MkPyNumber(((TagFileData *)Self)->Object.Offset());
+
}
static char *doc_Jump =
diff --git a/python/tarfile.cc b/python/tarfile.cc
index 215d3a8c..cdfe0a7c 100644
--- a/python/tarfile.cc
+++ b/python/tarfile.cc
@@ -189,35 +189,35 @@ static PyObject *tarmember_get_linkname(PyObject *self, void *closure)
static PyObject *tarmember_get_mode(PyObject *self, void *closure)
{
- return Py_BuildValue("k", GetCpp<pkgDirStream::Item>(self).Mode);
+ return MkPyNumber(GetCpp<pkgDirStream::Item>(self).Mode);
}
static PyObject *tarmember_get_uid(PyObject *self, void *closure)
{
- return Py_BuildValue("k", GetCpp<pkgDirStream::Item>(self).UID);
+ return MkPyNumber(GetCpp<pkgDirStream::Item>(self).UID);
}
static PyObject *tarmember_get_gid(PyObject *self, void *closure)
{
- return Py_BuildValue("k", GetCpp<pkgDirStream::Item>(self).GID);
+ return MkPyNumber(GetCpp<pkgDirStream::Item>(self).GID);
}
static PyObject *tarmember_get_size(PyObject *self, void *closure)
{
- return Py_BuildValue("k", GetCpp<pkgDirStream::Item>(self).Size);
+ return MkPyNumber(GetCpp<pkgDirStream::Item>(self).Size);
}
static PyObject *tarmember_get_mtime(PyObject *self, void *closure)
{
- return Py_BuildValue("k", GetCpp<pkgDirStream::Item>(self).MTime);
+ return MkPyNumber(GetCpp<pkgDirStream::Item>(self).MTime);
}
static PyObject *tarmember_get_major(PyObject *self, void *closure)
{
- return Py_BuildValue("k", GetCpp<pkgDirStream::Item>(self).Major);
+ return MkPyNumber(GetCpp<pkgDirStream::Item>(self).Major);
}
static PyObject *tarmember_get_minor(PyObject *self, void *closure)
{
- return Py_BuildValue("k", GetCpp<pkgDirStream::Item>(self).Minor);
+ return MkPyNumber(GetCpp<pkgDirStream::Item>(self).Minor);
}
static PyObject *tarmember_repr(PyObject *self)