diff options
| author | Michael Vogt <michael.vogt@ubuntu.com> | 2005-04-08 15:09:41 +0000 |
|---|---|---|
| committer | Michael Vogt <michael.vogt@ubuntu.com> | 2005-04-08 15:09:41 +0000 |
| commit | 19fb3bc6a6fc6328dfa90dac3e4066d931eaf129 (patch) | |
| tree | b8b7c147b37055a2319e6f7b71e7cb96aa9286a9 | |
| parent | 08ea34d6a28b4b17d0146535e85d61ab7bda341d (diff) | |
| download | python-apt-19fb3bc6a6fc6328dfa90dac3e4066d931eaf129.tar.gz | |
* InstallProgress has overridable fork interface now, added example for the use of a vte terminal
| -rw-r--r-- | doc/examples/gui-inst.py | 68 | ||||
| -rw-r--r-- | doc/examples/inst.py | 110 | ||||
| -rw-r--r-- | doc/examples/progress.py | 1 | ||||
| -rw-r--r-- | python/depcache.cc | 23 | ||||
| -rw-r--r-- | python/progress.cc | 31 |
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); |
