From d1567bdbde0f8e4159e0ac4eb8cb577cebeb1c53 Mon Sep 17 00:00:00 2001 From: lxnay Date: Fri, 28 Mar 2008 16:32:25 +0000 Subject: [PATCH] Entropy/Equo/Spritz: - made package conflicts removal non critical anymore, they are now removed through the installation process git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@1529 cd1c1023-2f26-0410-ae45-c471fc1f0318 --- TODO | 1 - client/text_ui.py | 16 +++++---- libraries/databaseTools.py | 2 +- libraries/entropy.py | 68 +++++++++++++++++++++++++++-------- libraries/entropyTools.py | 2 ++ spritz/src/entropyapi.py | 14 +++----- spritz/src/etpgui/__init__.py | 3 -- 7 files changed, 71 insertions(+), 35 deletions(-) diff --git a/TODO b/TODO index b7e374142..446545544 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,4 @@ TODO list - - remove conflicting packages right before the conflict (*) - Socket Interface, use SSL - http://docs.python.org/lib/socket-example.html (*) - http://www.shipyard.com.au/articles/webdevelopment/sslxmlrpc.py - migrate server code to ServerInterface diff --git a/client/text_ui.py b/client/text_ui.py index db497f8ab..6019bc635 100644 --- a/client/text_ui.py +++ b/client/text_ui.py @@ -580,7 +580,7 @@ def installPackages(packages = [], atomsdata = [], deps = True, emptydeps = Fals # store resume information if not tbz2: # .tbz2 install resume not supported resume_cache = {} - resume_cache['removalQueue'] = removalQueue[:] + #resume_cache['removalQueue'] = removalQueue[:] resume_cache['runQueue'] = runQueue[:] resume_cache['onlyfetch'] = onlyfetch resume_cache['emptydeps'] = emptydeps @@ -599,7 +599,7 @@ def installPackages(packages = [], atomsdata = [], deps = True, emptydeps = Fals else: try: - removalQueue = resume_cache['removalQueue'][:] + #removalQueue = resume_cache['removalQueue'][:] runQueue = resume_cache['runQueue'][:] onlyfetch = resume_cache['onlyfetch'] emptydeps = resume_cache['emptydeps'] @@ -611,17 +611,18 @@ def installPackages(packages = [], atomsdata = [], deps = True, emptydeps = Fals return 128,-1 if skipfirst and runQueue: - runQueue, removalQueue, status = Equo.retrieveInstallQueue(runQueue[1:], emptydeps, deepdeps) + runQueue, x, status = Equo.retrieveInstallQueue(runQueue[1:], emptydeps, deepdeps) + del x # was removalQueue # save new queues resume_cache['runQueue'] = runQueue[:] - resume_cache['removalQueue'] = removalQueue[:] + #resume_cache['removalQueue'] = removalQueue[:] Equo.dumpTools.dumpobj(etpCache['install'],resume_cache) # running tasks totalqueue = str(len(runQueue)) - totalremovalqueue = str(len(removalQueue)) + #totalremovalqueue = str(len(removalQueue)) currentqueue = 0 - currentremovalqueue = 0 + #currentremovalqueue = 0 def read_lic_selection(): print_info(darkred(" Please choose an action")) @@ -702,6 +703,8 @@ def installPackages(packages = [], atomsdata = [], deps = True, emptydeps = Fals print_info(red(" @@ ")+blue("Fetch Complete.")) return 0,0 + # XXX packages are now removed through the install process + ''' for idpackage in removalQueue: currentremovalqueue += 1 @@ -726,6 +729,7 @@ def installPackages(packages = [], atomsdata = [], deps = True, emptydeps = Fals Package.kill() del metaopts del Package + ''' for packageInfo in runQueue: currentqueue += 1 diff --git a/libraries/databaseTools.py b/libraries/databaseTools.py index 1e0232a6c..5e4c51624 100644 --- a/libraries/databaseTools.py +++ b/libraries/databaseTools.py @@ -2286,7 +2286,7 @@ class etpDatabase: deps = self.retrieveDependencies(idpackage) conflicts = self.retrieveConflicts(idpackage) for x in conflicts: - if x[0] != "!": # workaround for my mistake + if x[0] != "!": x = "!"+x deps.add(x) del conflicts diff --git a/libraries/entropy.py b/libraries/entropy.py index a32387f1f..deaff4db6 100644 --- a/libraries/entropy.py +++ b/libraries/entropy.py @@ -1913,6 +1913,16 @@ class EquoInterface(TextInterface): pass return update, remove, fine + def get_match_conflicts(self, match): + dbconn = self.openRepositoryDatabase(match[1]) + conflicts = dbconn.retrieveConflicts(match[0]) + found_conflicts = set() + for conflict in conflicts: + match = self.clientDbconn.atomMatch(conflict) + if match[0] != -1: + found_conflicts.add(match[0]) + return found_conflicts + def is_match_masked(self, match): dbconn = self.openRepositoryDatabase(match[1]) idpackage, idreason = dbconn.idpackageValidator(match[0]) @@ -4131,6 +4141,20 @@ class PackageInterface: del remdata return 0 + def removeconflict_step(self, idpackage): + + for idpackage in self.infoDict['conflicts']: + if not self.Entropy.clientDbconn.isIDPackageAvailable(idpackage): + continue + Package = self.Entropy.Package() + Package.prepare((idpackage,),"remove", self.infoDict['remove_metaopts']) + rc = Package.run(xterm_header = self.xterm_title) + Package.kill() + if rc != 0: + return rc + + return 0 + def _run_create_lock(self): self.Entropy.create_pid_file_lock(etpConst['locks']['packagehandling']) @@ -4148,33 +4172,36 @@ class PackageInterface: rc = 0 for step in self.infoDict['steps']: - self.xterm_title = xterm_header+' ' + self.xterm_title = xterm_header if step == "fetch": - self.xterm_title += 'Fetching: '+os.path.basename(self.infoDict['download']) + self.xterm_title += ' Fetching: '+os.path.basename(self.infoDict['download']) self.Entropy.setTitle(self.xterm_title) rc = self.fetch_step() elif step == "checksum": - self.xterm_title += 'Verifying: '+os.path.basename(self.infoDict['download']) + self.xterm_title += ' Verifying: '+os.path.basename(self.infoDict['download']) self.Entropy.setTitle(self.xterm_title) rc = self.checksum_step() elif step == "unpack": if not self.infoDict['merge_from']: - self.xterm_title += 'Unpacking: '+os.path.basename(self.infoDict['download']) + self.xterm_title += ' Unpacking: '+os.path.basename(self.infoDict['download']) else: - self.xterm_title += 'Merging: '+os.path.basename(self.infoDict['atom']) + self.xterm_title += ' Merging: '+os.path.basename(self.infoDict['atom']) self.Entropy.setTitle(self.xterm_title) rc = self.unpack_step() + elif step == "remove_conflicts": + rc = self.removeconflict_step() + elif step == "install": - self.xterm_title += 'Installing: '+self.infoDict['atom'] + self.xterm_title += ' Installing: '+self.infoDict['atom'] self.Entropy.setTitle(self.xterm_title) rc = self.install_step() elif step == "remove": - self.xterm_title += 'Removing: '+self.infoDict['removeatom'] + self.xterm_title += ' Removing: '+self.infoDict['removeatom'] self.Entropy.setTitle(self.xterm_title) rc = self.remove_step() @@ -4182,27 +4209,27 @@ class PackageInterface: rc = self.messages_step() elif step == "cleanup": - self.xterm_title += 'Cleaning: '+self.infoDict['atom'] + self.xterm_title += ' Cleaning: '+self.infoDict['atom'] self.Entropy.setTitle(self.xterm_title) rc = self.cleanup_step() elif step == "postinstall": - self.xterm_title += 'Postinstall: '+self.infoDict['atom'] + self.xterm_title += ' Postinstall: '+self.infoDict['atom'] self.Entropy.setTitle(self.xterm_title) rc = self.postinstall_step() elif step == "preinstall": - self.xterm_title += 'Preinstall: '+self.infoDict['atom'] + self.xterm_title += ' Preinstall: '+self.infoDict['atom'] self.Entropy.setTitle(self.xterm_title) rc = self.preinstall_step() elif step == "preremove": - self.xterm_title += 'Preremove: '+self.infoDict['removeatom'] + self.xterm_title += ' Preremove: '+self.infoDict['removeatom'] self.Entropy.setTitle(self.xterm_title) rc = self.preremove_step() elif step == "postremove": - self.xterm_title += 'Postremove: '+self.infoDict['removeatom'] + self.xterm_title += ' Postremove: '+self.infoDict['removeatom'] self.Entropy.setTitle(self.xterm_title) rc = self.postremove_step() @@ -4325,16 +4352,26 @@ class PackageInterface: self.infoDict['messages'] = dbconn.retrieveMessages(idpackage) self.infoDict['checksum'] = dbconn.retrieveDigest(idpackage) self.infoDict['accept_license'] = dbconn.retrieveLicensedataKeys(idpackage) + self.infoDict['conflicts'] = self.Entropy.get_match_conflicts(self.matched_atom) + # fill action queue self.infoDict['removeidpackage'] = -1 removeConfig = False if self.metaopts.has_key('removeconfig'): removeConfig = self.metaopts.get('removeconfig') + + self.infoDict['remove_metaopts'] = { + 'removeconfig': True, + } + if self.metaopts.has_key('remove_metaopts'): + self.infoDict['remove_metaopts'] = self.metaopts.get('remove_metaopts') + self.infoDict['merge_from'] = None mf = self.metaopts.get('merge_from') if mf != None: self.infoDict['merge_from'] = unicode(mf) self.infoDict['removeconfig'] = removeConfig + self.infoDict['removeidpackage'] = self.Entropy.retrieveInstalledIdPackage( self.Entropy.entropyTools.dep_getkey(self.infoDict['atom']), self.infoDict['slot'] @@ -4401,6 +4438,8 @@ class PackageInterface: # set steps self.infoDict['steps'] = [] + if self.infoDict['conflicts']: + self.infoDict['steps'].append("remove_conflicts") # install if (self.infoDict['removeidpackage'] != -1): self.infoDict['steps'].append("preremove") @@ -9893,8 +9932,9 @@ class SocketHostInterface: return rng def update_session_time(self, session): - self.sessions[session]['t'] = time.time() - self.updateProgress('session time updated for %s' % (session,) ) + if self.sessions.has_key(session): + self.sessions[session]['t'] = time.time() + self.updateProgress('session time updated for %s' % (session,) ) def set_session_running(self, session): if self.sessions.has_key(session): diff --git a/libraries/entropyTools.py b/libraries/entropyTools.py index b7501bfb8..09b322222 100644 --- a/libraries/entropyTools.py +++ b/libraries/entropyTools.py @@ -44,6 +44,8 @@ def isRoot(): def is_user_in_entropy_group(): import grp uid = os.getuid() + if uid == 0: + return True etp_gid = None try: etp_gid = grp.getgrnam(etpConst['sysgroup'])[2] diff --git a/spritz/src/entropyapi.py b/spritz/src/entropyapi.py index 2b081a9ef..2b5de009f 100644 --- a/spritz/src/entropyapi.py +++ b/spritz/src/entropyapi.py @@ -53,13 +53,11 @@ class QueueExecutor: def run(self, install_queue, removal_queue, do_purge_cache = []): removalQueue = [] runQueue = [] + conflicts_queue = [] if install_queue: - #import pdb; pdb.set_trace() - runQueue, removalQueue, status = self.Entropy.retrieveInstallQueue(install_queue,False,False) - removalQueue = [(x,True) for x in removalQueue] - # XXX handle status + runQueue, conflicts_queue, status = self.Entropy.retrieveInstallQueue(install_queue,False,False) if removal_queue: - removalQueue += [(x,False) for x in removal_queue if (x,True) not in removalQueue] + removalQueue += [(x,False) for x in removal_queue if x not in conflicts_queue] # XXX handle for eva too, move db configuration to LicenseDialog and forget rc, licenses = self.handle_licenses(runQueue) @@ -90,7 +88,6 @@ class QueueExecutor: importance = 2, count = (fetchqueue,totalqueue) ) - # XXX handle status rc = Package.run() if rc != 0: return -1,rc @@ -99,6 +96,7 @@ class QueueExecutor: self.Entropy.cycleDone() # then removalQueue + # NOT conflicts! :-) totalremovalqueue = len(removalQueue) currentremovalqueue = 0 for rem_data in removalQueue: @@ -118,7 +116,6 @@ class QueueExecutor: count = (currentremovalqueue,totalremovalqueue) ) - # XXX handle status rc = Package.run() if rc != 0: return -1,rc @@ -128,7 +125,6 @@ class QueueExecutor: del metaopts del Package - # then runQueue totalqueue = len(runQueue) currentqueue = 0 for packageInfo in runQueue: @@ -145,7 +141,6 @@ class QueueExecutor: count = (currentqueue,totalqueue) ) - # XXX handle status rc = Package.run() if rc != 0: return -1,rc @@ -202,7 +197,6 @@ class Equo(EquoInterface): self.progress.total.setup( range(total) ) class GuiUrlFetcher(urlFetcher): - """ hello my highness """ def connect_to_gui(self, progress): self.progress = progress diff --git a/spritz/src/etpgui/__init__.py b/spritz/src/etpgui/__init__.py index 87c434136..9954a7f15 100644 --- a/spritz/src/etpgui/__init__.py +++ b/spritz/src/etpgui/__init__.py @@ -55,13 +55,10 @@ class ProcessGtkEventsThread(Thread): def run(self): while self.__quit == False: - import time while not self.__active.isSet(): self.__active.wait() - time.sleep(0.1) while gtk.events_pending(): # process gtk events gtk.main_iteration() - time.sleep(0.1) def doQuit(self): self.__quit = True