PraneshJs's picture
added more import file and directory names
4194f1c verified
Raw History Blame Contribute Delete
2.25 kB
from github import Github
from urllib.parse import urlparse
import os
from dotenv import load_dotenv
load_dotenv()
def extract_repo_name(url):
path = urlparse(url).path.strip("/")
return path.split("/")[-2], path.split("/")[-1]
def is_important_file(path):
ignored_dirs = ["node_modules", "test", "__tests__", ".git", "build", ".next", ".vscode"]
important_dirs = ["src", "components", "pages", "hooks", "controller", "service", "frontend", "backend", "db", "database", "api", "ui", "models", "config", "scripts", "static", "templates","utils", "lib", "middleware", "tests", "styles", "public"]
important_exts = [".py", ".js", ".ts", ".jsx", ".tsx", ".java", ".go", ".html", ".php", "Dockerfile", ".env.example",".dart",".cpp",".c",".php", ".css", ".scss", ".json", ".yaml", ".yml", ".md",".sh", ".bat", ".ps1", ".cpp", ".c", ".h", ".hpp",".ipynb", ".onnx", ".pb", ".tflite", "Dockerfile", "Makefile",".gradle", ".jar", ".war"]
if any(ignored in path for ignored in ignored_dirs):
return False
if any(dir_ in path for dir_ in important_dirs) and any(path.endswith(ext) for ext in important_exts):
return True
if path.count("/") <= 1 and any(path.endswith(ext) for ext in important_exts):
return True
return False
def get_filtered_file_contents(repo, path=""):
contents = repo.get_contents(path)
all_files = {}
for content in contents:
if content.type == "dir":
all_files.update(get_filtered_file_contents(repo, content.path))
else:
if is_important_file(content.path):
try:
file_data = content.decoded_content.decode("utf-8")
all_files[content.path] = file_data
except Exception as e:
all_files[content.path] = f"Unable to read: {e}"
return all_files
def analyze_repo(repo_url):
g = Github(os.getenv("GITHUB_TOKEN").strip())
owner, name = extract_repo_name(repo_url)
repo = g.get_repo(f"{owner}/{name}")
info = {
"name": repo.name,
"description": repo.description,
"topics": repo.get_topics(),
"files": get_filtered_file_contents(repo),
"url": repo.html_url
}
return info