From c654e79fd18adb0e9f1cae6b783f8c81b39dda61 Mon Sep 17 00:00:00 2001 From: Sebastian Pipping Date: Thu, 28 Jan 2010 00:47:32 +0100 Subject: Fix handling of non-existing overlays --- CHANGES | 2 ++ layman/action.py | 53 ++++++++++++++++++++++++++++------------------------- layman/db.py | 16 ++++++---------- layman/overlay.py | 14 +++++++++++++- 4 files changed, 49 insertions(+), 36 deletions(-) diff --git a/CHANGES b/CHANGES index a9995f4..1e2168e 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,8 @@ Version TODO - Fix handling of CVS overlays (bug #301689) Thanks for the patch to Dmitry Karasik! + - Fix handling of non-existing overlays + Version 1.3.0 - Released 2010/01/19 =================================== diff --git a/layman/action.py b/layman/action.py index d058e9c..0cd55f6 100644 --- a/layman/action.py +++ b/layman/action.py @@ -26,7 +26,7 @@ __version__ = "$Id: action.py 312 2007-04-09 19:45:49Z wrobel $" import os, sys -from layman.db import DB, RemoteDB +from layman.db import DB, RemoteDB, UnknownOverlayException from layman.debug import OUT @@ -112,14 +112,19 @@ class Sync: warnings = [] success = [] for i in self.selection: + try: + odb = self.db.select(i) + except UnknownOverlayException, error: + fatals.append(str(error)) + continue + try: ordb = self.rdb.select(i) - except: + except UnknownOverlayException: warnings.append(\ 'Overlay "%s" could not be found in the remote lists.\n' 'Please check if it has been renamed and re-add if necessary.' % i) else: - odb = self.db.select(i) current_src = odb.sources[0].src available_srcs = set(e.src for e in ordb.sources) if ordb and odb and not current_src in available_srcs: @@ -210,11 +215,13 @@ class Add: result = 0 for i in self.selection: - overlay = self.rdb.select(i) - - OUT.debug('Selected overlay', 7) - - if overlay: + try: + overlay = self.rdb.select(i) + except UnknownOverlayException, error: + OUT.warn(str(error), 2) + result = 1 + else: + OUT.debug('Selected overlay', 7) try: self.db.add(overlay, self.quiet) OUT.info('Successfully added overlay "' + i + '".', 2) @@ -222,9 +229,6 @@ class Add: OUT.warn('Failed to add overlay "' + i + '".\nError was: ' + str(error), 2) result = 1 - else: - OUT.warn('Overlay "' + i + '" does not exist!', 2) - result = 1 return result @@ -258,11 +262,13 @@ class Delete: result = 0 for i in self.selection: - overlay = self.db.select(i) - - OUT.debug('Selected overlay', 7) - - if overlay: + try: + overlay = self.db.select(i) + except UnknownOverlayException, error: + OUT.warn(str(error), 2) + result = 1 + else: + OUT.debug('Selected overlay', 7) try: self.db.delete(overlay) OUT.info('Successfully deleted overlay "' + i + '".', 2) @@ -270,9 +276,6 @@ class Delete: OUT.warn('Failed to delete overlay "' + i + '".\nError was: ' + str(error), 2) result = 1 - else: - OUT.warn('Overlay "' + i + '" does not exist!', 2) - result = 1 return result @@ -337,9 +340,12 @@ class Info: result = 0 for i in self.selection: - overlay = self.rdb.select(i) - - if overlay: + try: + overlay = self.rdb.select(i) + except UnknownOverlayException, error: + OUT.warn(str(error), 2) + result = 1 + else: # Is the overlay supported? OUT.info(overlay.__str__(), 1) if not overlay.is_official(): @@ -347,9 +353,6 @@ class Info: if not overlay.is_supported(): OUT.error('*** You are lacking the necessary tools to install t' 'his overlay ***\n') - else: - OUT.warn('Overlay "' + i + '" does not exist!', 2) - result = 1 return result diff --git a/layman/db.py b/layman/db.py index 3fde214..252e81a 100644 --- a/layman/db.py +++ b/layman/db.py @@ -27,7 +27,7 @@ __version__ = "$Id: db.py 309 2007-04-09 16:23:38Z wrobel $" import os, codecs, os.path, urllib2, re, hashlib from layman.utils import path -from layman.overlay import Overlays +from layman.overlay import Overlays, UnknownOverlayException from layman.debug import OUT @@ -189,15 +189,11 @@ class DB(Overlays): def sync(self, overlay_name, quiet = False): '''Synchronize the given overlay.''' - overlay = self.select(overlay_name) - - if overlay: - result = overlay.sync(self.config['storage'], quiet) - if result: - raise Exception('Syncing overlay "' + overlay_name + - '" returned status ' + str(result) + '!') - else: - raise Exception('No such overlay ("' + overlay_name + '")!') + overlay = self.select(overlay_name) # UnknownOverlayException + result = overlay.sync(self.config['storage'], quiet) + if result: + raise Exception('Syncing overlay "' + overlay_name + + '" returned status ' + str(result) + '!') #=============================================================================== # diff --git a/layman/overlay.py b/layman/overlay.py index 1058723..21bbc70 100644 --- a/layman/overlay.py +++ b/layman/overlay.py @@ -35,6 +35,18 @@ from layman.debug import OUT from layman.utils import indent from layman.overlays.overlay import Overlay +#=============================================================================== +# +# Class UnknownOverlayException +# +#------------------------------------------------------------------------------- + +class UnknownOverlayException(Exception): + def __init__(self, repo_name): + message = 'Overlay "%s" does not exist.' % repo_name + super(UnknownOverlayException, self).__init__(message) + + #=============================================================================== # # Class Overlays @@ -150,7 +162,7 @@ class Overlays: [u'rsync://gunnarwrobel.de/wrobel-stable'] ''' if not overlay in self.overlays.keys(): - raise Exception('No overlay "%s" in database' % overlay) + raise UnknownOverlayException(overlay) return self.overlays[overlay] def list(self, verbose = False, width = 0): -- cgit v1.2.3-1-g7c22