diff --git a/.gitignore b/.gitignore index 82f9275..dcc322a 100644 --- a/.gitignore +++ b/.gitignore @@ -160,3 +160,10 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + + +# Ignore egg-info directory +repo_to_text.egg-info/ + +# Ignore generated repo_structure.txt file +repo_structure.txt diff --git a/repo_to_text/main.py b/repo_to_text/main.py index 559beaa..697123b 100644 --- a/repo_to_text/main.py +++ b/repo_to_text/main.py @@ -1,12 +1,37 @@ import os import subprocess +import pathspec -def get_tree_structure(path='.') -> str: +def get_tree_structure(path='.', gitignore_spec=None) -> str: + # Run the tree command and get its output result = subprocess.run(['tree', path], stdout=subprocess.PIPE) - return result.stdout.decode('utf-8') + tree_output = result.stdout.decode('utf-8') + + if not gitignore_spec: + return tree_output + + # Filter the tree output to exclude files in .gitignore (excluding .gitignore itself) + filtered_lines = [] + for line in tree_output.splitlines(): + parts = line.split() + if not any(gitignore_spec.match_file(os.path.join(path, part)) for part in parts if part != '.gitignore'): + filtered_lines.append(line) + return '\n'.join(filtered_lines) + +def load_gitignore(path='.'): + gitignore_path = os.path.join(path, '.gitignore') + if os.path.exists(gitignore_path): + with open(gitignore_path, 'r') as f: + return pathspec.PathSpec.from_lines('gitwildmatch', f) + return None + +def is_ignored_file(file_path: str) -> bool: + # Check if the file is part of .git or should be ignored according to .gitignore rules + return '.git' in file_path.split(os.sep) or file_path.endswith('.gitignore') def save_repo_to_text(path='.') -> None: - tree_structure: str = get_tree_structure(path) + gitignore_spec = load_gitignore(path) + tree_structure: str = get_tree_structure(path, gitignore_spec) with open('repo_structure.txt', 'w') as file: file.write(tree_structure + '\n') @@ -14,6 +39,11 @@ def save_repo_to_text(path='.') -> None: for filename in files: file_path: str = os.path.join(root, filename) relative_path: str = os.path.relpath(file_path, path) + + # Check if the file should be ignored + if is_ignored_file(file_path) or (gitignore_spec and gitignore_spec.match_file(file_path)): + continue + file.write(f'\n{relative_path}\n') file.write('```\n') try: @@ -27,4 +57,4 @@ def main() -> None: save_repo_to_text() if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/requirements.txt b/requirements.txt index 1d24baf..7273639 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ setuptools==70.0.0 +pathspec==0.12.1 diff --git a/setup.py b/setup.py index 515f622..bbb63dd 100644 --- a/setup.py +++ b/setup.py @@ -1,13 +1,16 @@ from setuptools import setup, find_packages +with open('requirements.txt') as f: + required = f.read().splitlines() + setup( name='repo-to-text', version='0.1', packages=find_packages(), - install_requires=[], + install_requires=required, entry_points={ 'console_scripts': [ 'repo-to-text=repo_to_text.main:main', ], }, -) +) \ No newline at end of file