def _remove(self, args):
        '''
        Remove a package
        '''
        if len(args) < 2:
            raise SPMInvocationError('A package must be specified')

        packages = args[1:]
        msg = 'Removing packages:\n\t{0}'.format('\n\t'.join(packages))

        if not self.opts['assume_yes']:
            self.ui.confirm(msg)

        for package in packages:
            self.ui.status('... removing {0}'.format(package))

            if not self._pkgdb_fun('db_exists', self.opts['spm_db']):
                raise SPMDatabaseError('No database at {0}, cannot remove {1}'.format(self.opts['spm_db'], package))

            # Look at local repo index
            pkg_info = self._pkgdb_fun('info', package, self.db_conn)
            if pkg_info is None:
                raise SPMInvocationError('Package {0} not installed'.format(package))

            # Find files that have not changed and remove them
            files = self._pkgdb_fun('list_files', package, self.db_conn)
            dirs = []
            for filerow in files:
                if self._pkgfiles_fun('path_isdir', filerow[0]):
                    dirs.append(filerow[0])
                    continue
                file_hash = hashlib.sha1()
                digest = self._pkgfiles_fun('hash_file', filerow[0], file_hash, self.files_conn)
                if filerow[1] == digest:
                    self._verbose('Removing file {0}'.format(filerow[0]), log.trace)
                    self._pkgfiles_fun('remove_file', filerow[0], self.files_conn)
                else:
                    self._verbose('Not removing file {0}'.format(filerow[0]), log.trace)
                self._pkgdb_fun('unregister_file', filerow[0], package, self.db_conn)

            # Clean up directories
            for dir_ in sorted(dirs, reverse=True):
                self._pkgdb_fun('unregister_file', dir_, package, self.db_conn)
                try:
                    self._verbose('Removing directory {0}'.format(dir_), log.trace)
                    os.rmdir(dir_)
                except OSError:
                    # Leave directories in place that still have files in them
                    self._verbose('Cannot remove directory {0}, probably not empty'.format(dir_), log.trace)

            self._pkgdb_fun('unregister_pkg', package, self.db_conn)
def _remove ( self , args ) : if len ( args ) < 2 : raise SPMInvocationError ( 'A package must be specified' ) packages = args [ 1 : ] msg = 'Removing packages:\n\t{0}' . format ( '\n\t' . join ( packages ) ) if not self . opts [ 'assume_yes' ] : self . ui . confirm ( msg ) for package in packages : self . ui . status ( '... removing {0}' . format ( package ) ) if not self . _pkgdb_fun ( 'db_exists' , self . opts [ 'spm_db' ] ) : raise SPMDatabaseError ( 'No database at {0}, cannot remove {1}' . format ( self . opts [ 'spm_db' ] , package ) ) pkg_info = self . _pkgdb_fun ( 'info' , package , self . db_conn ) if pkg_info is None : raise SPMInvocationError ( 'Package {0} not installed' . format ( package ) ) files = self . _pkgdb_fun ( 'list_files' , package , self . db_conn ) dirs = [ ] for filerow in files : if self . _pkgfiles_fun ( 'path_isdir' , filerow [ 0 ] ) : dirs . append ( filerow [ 0 ] ) continue file_hash = hashlib . sha1 ( ) digest = self . _pkgfiles_fun ( 'hash_file' , filerow [ 0 ] , file_hash , self . files_conn ) if filerow [ 1 ] == digest : self . _verbose ( 'Removing file {0}' . format ( filerow [ 0 ] ) , log . trace ) self . _pkgfiles_fun ( 'remove_file' , filerow [ 0 ] , self . files_conn ) else : self . _verbose ( 'Not removing file {0}' . format ( filerow [ 0 ] ) , log . trace ) self . _pkgdb_fun ( 'unregister_file' , filerow [ 0 ] , package , self . db_conn ) for dir_ in sorted ( dirs , reverse = True ) : self . _pkgdb_fun ( 'unregister_file' , dir_ , package , self . db_conn ) try : self . _verbose ( 'Removing directory {0}' . format ( dir_ ) , log . trace ) os . rmdir ( dir_ ) except OSError : self . _verbose ( 'Cannot remove directory {0}, probably not empty' . format ( dir_ ) , log . trace ) self . _pkgdb_fun ( 'unregister_pkg' , package , self . db_conn )
Remove a package