diff options
author | Zac Medico <zmedico@gentoo.org> | 2008-05-09 03:42:02 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2008-05-09 03:42:02 +0000 |
commit | e3dce69dd238a194ebbd6426a5584f91968bdcac (patch) | |
tree | ef4110a162d3e420b4e3ea248c2c6d193cabc805 | |
parent | 608b022043d0449cf21f6bfb6b84fe9798dd664b (diff) | |
download | portage-e3dce69dd238a194ebbd6426a5584f91968bdcac.tar.gz portage-e3dce69dd238a194ebbd6426a5584f91968bdcac.tar.bz2 portage-e3dce69dd238a194ebbd6426a5584f91968bdcac.zip |
If an uninstall task fails inside MergeTask.merge(), use an UninstallFailure
exception to handle it instead of allowing unmerge() to call exit().
(trunk r10262)
svn path=/main/branches/2.1.2/; revision=10263
-rwxr-xr-x | bin/emerge | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/bin/emerge b/bin/emerge index ef64ef1b3..4c6b76ddd 100755 --- a/bin/emerge +++ b/bin/emerge @@ -5863,11 +5863,16 @@ class MergeTask(object): mergecount += 1 pkg = x metadata = pkg.metadata + if pkg.installed: if not (buildpkgonly or fetchonly or pretend): - unmerge(root_config.settings, self.myopts, - root_config.trees["vartree"], "unmerge", - [pkg.cpv], mtimedb["ldpath"], clean_world=0) + try: + unmerge(root_config.settings, self.myopts, + root_config.trees["vartree"], "unmerge", + [pkg.cpv], mtimedb["ldpath"], clean_world=0, + raise_on_error=1) + except UninstallFailure, e: + return e.status continue if x[0]=="blocks": @@ -6186,8 +6191,20 @@ class MergeTask(object): sys.exit(0) return os.EX_OK -def unmerge(settings, myopts, vartree, unmerge_action, unmerge_files, - ldpath_mtimes, autoclean=0, clean_world=1, ordered=0): +class UninstallFailure(portage_exception.PortageException): + """ + An instance of this class is raised by unmerge() when + an uninstallation fails. + """ + status = 1 + def __init__(self, *pargs): + portage_exception.PortageException.__init__(self, pargs) + if pargs: + self.status = pargs[0] + +def unmerge(settings, myopts, vartree, unmerge_action, + unmerge_files, ldpath_mtimes, autoclean=0, + clean_world=1, ordered=0, raise_on_error=0): candidate_catpkgs=[] global_unmerge=0 xterm_titles = "notitles" not in settings.features @@ -6518,6 +6535,8 @@ def unmerge(settings, myopts, vartree, unmerge_action, unmerge_files, vartree=vartree, ldpath_mtimes=ldpath_mtimes) if retval != os.EX_OK: emergelog(xterm_titles, " !!! unmerge FAILURE: "+y) + if raise_on_error: + raise UninstallFailure(retval) sys.exit(retval) else: if clean_world: |