Reorganize the uninstall code for #3151

(Make it so you can build a Bundle object from the zip file but still use
its uninstall() method to uninstall the unzipped version.)
This commit is contained in:
Dan Winship 2007-10-04 14:58:43 -04:00
parent 380f3a2275
commit b82c9c2c2f
3 changed files with 31 additions and 21 deletions

View File

@ -252,8 +252,13 @@ class ActivityBundle(Bundle):
raise RegistrationException raise RegistrationException
def uninstall(self): def uninstall(self):
if not self.is_installed(): if self._unpacked:
raise NotInstalledException install_path = self._path
else:
if not self.is_installed():
raise NotInstalledException
install_path = os.path.join(env.get_user_activities_path(),
self._zip_root_dir)
xdg_data_home = os.getenv('XDG_DATA_HOME', os.path.expanduser('~/.local/share')) xdg_data_home = os.getenv('XDG_DATA_HOME', os.path.expanduser('~/.local/share'))
@ -271,10 +276,10 @@ class ActivityBundle(Bundle):
for file in os.listdir(installed_icons_dir): for file in os.listdir(installed_icons_dir):
path = os.path.join(installed_icons_dir, file) path = os.path.join(installed_icons_dir, file)
if os.path.islink(path) and \ if os.path.islink(path) and \
os.readlink(path).startswith(self._path): os.readlink(path).startswith(install_path):
os.remove(path) os.remove(path)
self._uninstall() self._uninstall(install_path)
# FIXME: notify shell # FIXME: notify shell

View File

@ -130,19 +130,17 @@ class Bundle:
zip.write(filename, os.path.join(base_dir, filename)) zip.write(filename, os.path.join(base_dir, filename))
zip.close() zip.close()
def _uninstall(self): def _uninstall(self, install_path):
ext = os.path.splitext(self._path)[1] if not os.path.isdir(install_path):
if self._unpacked: raise InvalidPathException
if not os.path.isdir(self._path) or ext != self._unzipped_extension: if self._unzipped_extension is not None:
ext = os.path.splitext(install_path)[1]
if ext != self._unzipped_extension:
raise InvalidPathException raise InvalidPathException
for root, dirs, files in os.walk(self._path, topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))
os.rmdir(self._path)
else:
if not os.path.isfile(self._path) or ext != self._zipped_extension:
raise InvalidPathException
os.remove(self._path)
for root, dirs, files in os.walk(install_path, topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))
os.rmdir(install_path)

View File

@ -21,7 +21,7 @@ from ConfigParser import ConfigParser
import os import os
from sugar import env from sugar import env
from sugar.bundle.bundle import Bundle from sugar.bundle.bundle import Bundle, NotInstalledException
class ContentBundle(Bundle): class ContentBundle(Bundle):
"""A Sugar content bundle """A Sugar content bundle
@ -178,5 +178,12 @@ class ContentBundle(Bundle):
self._run_indexer() self._run_indexer()
def uninstall(self): def uninstall(self):
self._uninstall() if self._unpacked:
if not self.is_installed():
raise NotInstalledException
install_dir = self._path
else:
install_dir = os.path.join(env.get_user_library_path(),
self._zip_root_dir)
self._uninstall(install_dir)
self._run_indexer() self._run_indexer()