docs: 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)