'Generates the relative filenames.'

def _Generate(self, base_path, relative_components):

    new_base = os.path.join(base_path, *relative_components)
    if (not relative_components):
        (yield new_base)
    try:
        filenames = os.listdir(new_base)
    except OSError as e:
        if (e.errno == errno.EACCES):
            logging.info(e)
        return
    for f in filenames:
        new_components = (relative_components + [f])
        relative_name = os.path.join(*new_components)
        (yield relative_name)
        if (len(new_components) < self.depth):
            try:
                filename = os.path.join(base_path, relative_name)
                stat_entry = os.stat(filename)
                if stat.S_ISDIR(stat_entry.st_mode):
                    if (filename in self.mountpoints_blacklist):
                        continue
                    if (self.follow_links or (not stat.S_ISLNK(os.lstat(filename).st_mode))):
                        for res in self._Generate(base_path, new_components):
                            (yield res)
            except OSError as e:
                if (e.errno not in [errno.ENOENT, errno.ENOTDIR, errno.EINVAL]):
                    logging.info(e)
