summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/examples/gui-inst.py68
-rw-r--r--doc/examples/inst.py110
-rw-r--r--doc/examples/progress.py1
-rw-r--r--python/depcache.cc23
-rw-r--r--python/progress.cc31
5 files changed, 117 insertions, 116 deletions
diff --git a/doc/examples/gui-inst.py b/doc/examples/gui-inst.py
new file mode 100644
index 00000000..ededab5f
--- /dev/null
+++ b/doc/examples/gui-inst.py
@@ -0,0 +1,68 @@
+#!/usr/bin/python
+# example how to install in a custom terminal widget
+
+import apt_pkg
+import sys, os
+import copy
+
+import pygtk
+pygtk.require('2.0')
+import gtk
+import vte
+import time
+
+from progress import OpProgress, FetchProgress, InstallProgress
+
+class TermInstallProgress(InstallProgress):
+ def UpdateInterface(self):
+ while gtk.events_pending():
+ gtk.main_iteration()
+ def FinishUpdate(self):
+ sys.stdin.readline()
+
+# init
+apt_pkg.init()
+
+progress = OpProgress()
+cache = apt_pkg.GetCache(progress)
+print "Available packages: %s " % cache.PackageCount
+
+# get depcache
+depcache = apt_pkg.GetDepCache(cache)
+depcache.ReadPinFile()
+depcache.Init(progress)
+
+# do something
+fprogress = FetchProgress()
+iprogress = TermInstallProgress()
+
+
+window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+window.show()
+term = vte.Terminal()
+term.show()
+window.add(term)
+# can be used to set a custom fork method (like vte.Terminal.forkpty)
+# see also gnome bug: #169201
+iprogress.fork = term.forkpty
+
+# show the interface
+while gtk.events_pending():
+ gtk.main_iteration()
+
+
+iter = cache["3dchess"]
+print "\n%s"%iter
+
+# install or remove, the importend thing is to keep us busy :)
+if iter.CurrentVer == None:
+ depcache.MarkInstall(iter)
+else:
+ depcache.MarkDelete(iter)
+depcache.Commit(fprogress, iprogress)
+
+print "Exiting"
+sys.exit(0)
+
+
+
diff --git a/doc/examples/inst.py b/doc/examples/inst.py
index 3269900f..e4c96983 100644
--- a/doc/examples/inst.py
+++ b/doc/examples/inst.py
@@ -2,7 +2,7 @@
# example how to deal with the depcache
import apt_pkg
-import sys
+import sys, os
import copy
from progress import OpProgress, FetchProgress, InstallProgress
@@ -23,7 +23,11 @@ depcache.Init(progress)
# do something
fprogress = FetchProgress()
iprogress = InstallProgress()
-iter = cache["base-config"]
+
+# can be used to set a custom fork method (like vte.Terminal.forkpty)
+#iprogress.fork = os.fork
+
+iter = cache["3dchess"]
print "\n%s"%iter
# install or remove, the importend thing is to keep us busy :)
@@ -31,7 +35,8 @@ if iter.CurrentVer == None:
depcache.MarkInstall(iter)
else:
depcache.MarkDelete(iter)
-depcache.Commit(fprogress, iprogress)
+res = depcache.Commit(fprogress, iprogress)
+print res
print "Exiting"
sys.exit(0)
@@ -39,102 +44,3 @@ sys.exit(0)
-
-
-
-
-
-
-
-
-
-iter = cache["base-config"]
-print "example package iter: %s" % iter
-
-# get depcache
-print "\n\n depcache"
-depcache = apt_pkg.GetDepCache(cache, progress)
-depcache.ReadPinFile()
-print "got a depcache: %s " % depcache
-print "Marked for install: %s " % depcache.InstCount
-
-print "\n\n Reinit"
-depcache.Init(progress)
-
-#sys.exit()
-
-
-# get a canidate version
-ver= depcache.GetCandidateVer(iter)
-print "Candidate version: %s " % ver
-
-print "\n\nQuerry interface"
-print "%s.IsUpgradable(): %s" % (iter.Name, depcache.IsUpgradable(iter))
-
-print "\nMarking interface"
-print "Marking '%s' for install" % iter.Name
-depcache.MarkInstall(iter)
-print "Install count: %s " % depcache.InstCount
-print "%s.MarkedInstall(): %s" % (iter.Name, depcache.MarkedInstall(iter))
-print "%s.MarkedUpgrade(): %s" % (iter.Name, depcache.MarkedUpgrade(iter))
-print "%s.MarkedDelete(): %s" % (iter.Name, depcache.MarkedDelete(iter))
-
-print "Marking %s for delete" % iter.Name
-depcache.MarkDelete(iter)
-print "DelCount: %s " % depcache.DelCount
-print "%s.MarkedDelete(): %s" % (iter.Name, depcache.MarkedDelete(iter))
-
-
-iter = cache["3dchess"]
-print "\nMarking '%s' for install" % iter.Name
-depcache.MarkInstall(iter)
-print "Install count: %s " % depcache.InstCount
-print "%s.MarkedInstall(): %s" % (iter.Name, depcache.MarkedInstall(iter))
-print "%s.MarkedUpgrade(): %s" % (iter.Name, depcache.MarkedUpgrade(iter))
-print "%s.MarkedDelete(): %s" % (iter.Name, depcache.MarkedDelete(iter))
-
-print "Marking %s for keep" % iter.Name
-depcache.MarkKeep(iter)
-print "Install: %s " % depcache.InstCount
-
-iter = cache["3dwm-server"]
-print "\nMarking '%s' for install" % iter.Name
-depcache.MarkInstall(iter)
-print "Install: %s " % depcache.InstCount
-print "Broken count: %s" % depcache.BrokenCount
-print "FixBroken() "
-depcache.FixBroken()
-print "Broken count: %s" % depcache.BrokenCount
-
-print "\nPerforming Upgrade"
-depcache.Upgrade()
-print "Keep: %s " % depcache.KeepCount
-print "Install: %s " % depcache.InstCount
-print "Delete: %s " % depcache.DelCount
-print "UsrSize: %s " % apt_pkg.SizeToStr(depcache.UsrSize)
-print "DebSize: %s " % apt_pkg.SizeToStr(depcache.DebSize)
-
-for pkg in cache.Packages:
- if pkg.CurrentVer != None and not depcache.MarkedInstall(pkg) and depcache.IsUpgradable(pkg):
- print "Upgrade didn't upgrade (kept): %s" % pkg.Name
-
-
-print "\nPerforming DistUpgrade"
-depcache.Upgrade(True)
-print "Keep: %s " % depcache.KeepCount
-print "Install: %s " % depcache.InstCount
-print "Delete: %s " % depcache.DelCount
-print "UsrSize: %s " % apt_pkg.SizeToStr(depcache.UsrSize)
-print "DebSize: %s " % apt_pkg.SizeToStr(depcache.DebSize)
-
-# overview about what would happen
-for pkg in cache.Packages:
- if depcache.MarkedInstall(pkg):
- if pkg.CurrentVer != None:
- print "Marked upgrade: %s " % pkg.Name
- else:
- print "Marked install: %s" % pkg.Name
- elif depcache.MarkedDelete(pkg):
- print "Marked delete: %s" % pkg.Name
- elif depcache.MarkedKeep(pkg):
- print "Marked keep: %s" % pkg.Name
diff --git a/doc/examples/progress.py b/doc/examples/progress.py
index 0dec95d1..c37de70d 100644
--- a/doc/examples/progress.py
+++ b/doc/examples/progress.py
@@ -48,4 +48,3 @@ class InstallProgress:
def UpdateInterface(self):
# usefull to e.g. redraw a GUI
time.sleep(0.1)
-
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);