Spaces:
Running
on
Zero
Running
on
Zero
import os | |
import shutil | |
import fnmatch | |
def parse_gitignore(gitignore_path): | |
"""Parse a .gitignore file and return a list of patterns.""" | |
patterns = [] | |
with open(gitignore_path, "r") as f: | |
for line in f: | |
# Ignore comments and blank lines | |
line = line.strip() | |
if not line or line.startswith("#"): | |
continue | |
# Handle wildcards and directory separators | |
patterns.append(line) | |
return patterns | |
def file_matches_patterns(file_path, patterns): | |
"""Check if a file matches any of the patterns in .gitignore.""" | |
for pattern in patterns: | |
if fnmatch.fnmatch(file_path, pattern): | |
return True | |
return False | |
def copy_codebase(src, dst, max_size_mb=5, gitignore_path=None): | |
""" Copy files from src to dst, skipping files larger than max_size_mb and matching .gitignore patterns. """ | |
if gitignore_path and os.path.exists(gitignore_path): | |
patterns = parse_gitignore(gitignore_path) | |
else: | |
patterns = [] | |
print("patterns to ignore: ", patterns) | |
os.makedirs(dst, exist_ok=True) | |
for root, dirs, files in os.walk(src): | |
for file in files: | |
file_path = os.path.join(root, file) | |
relative_path = os.path.relpath(file_path, src) | |
dst_path = os.path.join(dst, relative_path) | |
# ignore .git because of permission issues | |
if "/.git/" in file_path: | |
continue | |
# Check .gitignore patterns | |
if file_matches_patterns(file_path, patterns): | |
# print(f"Skipping {file_path} because it matches a pattern in .gitignore") | |
continue | |
# Check file size | |
if os.path.getsize(file_path) > max_size_mb * 1024 * 1024: | |
print(f"Skipping {file_path} because it's larger than {max_size_mb}MB") | |
continue | |
# Make sure the destination directory exists | |
os.makedirs(os.path.dirname(dst_path), exist_ok=True) | |
shutil.copy(file_path, dst_path) | |