def collect_feature_locations(paths, strict=True):
    locations = []
    for path in paths:
        if os.path.isdir(path):
            for dirpath, dirnames, filenames in os.walk(path):
                dirnames.sort()
                for filename in sorted(filenames):
                    if filename.endswith(".feature"):
                        location = FileLocation(os.path.join(dirpath, filename))
                        locations.append(location)
        elif path.startswith('@'):
            # -- USE: behave @list_of_features.txt
            locations.extend(FeatureListParser.parse_file(path[1:]))
        else:
            # -- OTHERWISE: Normal filename or location (schema: filename:line)
            location = FileLocationParser.parse(path)
            if not location.filename.endswith(".feature"):
                raise InvalidFilenameError(location.filename)
            elif location.exists():
                locations.append(location)
            elif strict:
                raise FileNotFoundError(path)
    return locations
Convert a symbolic revision, i.e. 'head' or 'base', into
dataset/ETHPy150Open behave/behave/behave/runner_util.py/collect_feature_locations--crossover with--dataset/ETHPy150Open goFrendiAsgard/kokoropy/kokoropy/packages/alembic/script.py/ScriptDirectory.as_revision_number