summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorMichael Vogt <michael.vogt@ubuntu.com>2005-04-08 15:09:41 +0000
committerMichael Vogt <michael.vogt@ubuntu.com>2005-04-08 15:09:41 +0000
commit19fb3bc6a6fc6328dfa90dac3e4066d931eaf129 (patch)
treeb8b7c147b37055a2319e6f7b71e7cb96aa9286a9 /python
parent08ea34d6a28b4b17d0146535e85d61ab7bda341d (diff)
downloadpython-apt-19fb3bc6a6fc6328dfa90dac3e4066d931eaf129.tar.gz
* InstallProgress has overridable fork interface now, added example for the use of a vte terminal
Diffstat (limited to 'python')
-rw-r--r--python/depcache.cc23
-rw-r--r--python/progress.cc31
2 files changed, 41 insertions, 13 deletions
diff --git a/python/depcache.cc b/python/depcache.cc
index 89974358..8a8cb22d 100644
--- a/python/depcache.cc
+++ b/python/depcache.cc
@@ -72,6 +72,8 @@ static PyObject *PkgDepCacheInit(PyObject *Self,PyObject *Args)
static PyObject *PkgDepCacheCommit(PyObject *Self,PyObject *Args)
{
+ PyObject *result;
+
PkgDepCacheStruct &Struct = GetCpp<PkgDepCacheStruct>(Self);
PyObject *pyInstallProgressInst = 0;
@@ -158,16 +160,21 @@ static PyObject *PkgDepCacheCommit(PyObject *Self,PyObject *Args)
pkgPackageManager::OrderResult Res = iprogress.Run(PM);
//FIXME: return usefull values here
- if (Res == pkgPackageManager::Failed || _error->PendingError() == true)
- return Py_None/*false;*/;
- if (Res == pkgPackageManager::Completed)
- return Py_None /*true;*/;
-
+ if (Res == pkgPackageManager::Failed || _error->PendingError() == true) {
+ result = Py_BuildValue("b", false);
+ return result;
+ }
+ if (Res == pkgPackageManager::Completed) {
+ result = Py_BuildValue("b", true);
+ return result;
+ }
+
// Reload the fetcher object and loop again for media swapping
Fetcher.Shutdown();
- if (PM->GetArchives(&Fetcher,&List,&Recs) == false)
- return Py_None /*false;*/;
-
+ if (PM->GetArchives(&Fetcher,&List,&Recs) == false) {
+ result = Py_BuildValue("b", false);
+ return result;
+ }
_system->Lock();
}
diff --git a/python/progress.cc b/python/progress.cc
index 310d9569..43490247 100644
--- a/python/progress.cc
+++ b/python/progress.cc
@@ -31,6 +31,8 @@ bool PyCallbackObj::RunSimpleCallback(const char* method_name,
if(result == NULL) {
// exception happend
std::cerr << "Error in function " << method_name << std::endl;
+ PyErr_Print();
+
return NULL;
}
@@ -171,7 +173,7 @@ pkgPackageManager::OrderResult PyInstallProgress::Run(pkgPackageManager *pm)
void *dummy;
pkgPackageManager::OrderResult res;
int ret;
- pid_t _child_id;
+ pid_t child_id;
#if 0 // FIXME: this needs to be merged into apt to support medium swaping
res = pm->DoInstallPreFork();
@@ -179,21 +181,40 @@ pkgPackageManager::OrderResult PyInstallProgress::Run(pkgPackageManager *pm)
return res;
#endif
- _child_id = fork();
+ // support custom fork methods
+ if(PyObject_HasAttrString(callbackInst, "fork")) {
+ PyObject *method = PyObject_GetAttrString(callbackInst, "fork");
+ //std::cerr << "custom fork found" << std::endl;
+ PyObject *arglist = Py_BuildValue("()");
+ PyObject *result = PyEval_CallObject(method, arglist);
+ Py_DECREF(arglist);
+ if (result == NULL) {
+ std::cerr << "fork method invalid" << std::endl;
+ PyErr_Print();
+ return pkgPackageManager::Failed;
+ }
+ if(!PyArg_Parse(result, "i", &child_id) )
+ std::cerr << "result could not be parsed?"<< std::endl;
+ //std::cerr << "got: " << child_id << std::endl;
+ } else {
+ //std::cerr << "using build-in fork()" << std::endl;
+ child_id = fork();
+ }
+
#if 0 // FIXME: this needs to be merged into apt to support medium swaping
- if (_child_id == 0) {
+ if (child_id == 0) {
res = pm->DoInstallPostFork();
_exit(res);
}
#endif
- if (_child_id == 0) {
+ if (child_id == 0) {
res = pm->DoInstall();
_exit(res);
}
StartUpdate();
- while (waitpid(_child_id, &ret, WNOHANG) == 0)
+ while (waitpid(child_id, &ret, WNOHANG) == 0)
UpdateInterface();
res = (pkgPackageManager::OrderResult) WEXITSTATUS(ret);