Compare commits

..

5 commits
v0.7.0 ... main

Author SHA1 Message Date
Luke Craig
77209f30aa
Add minimal handling for broken symlinks in generate_output_content (#32)
Some checks failed
Run Tests / test (3.11) (push) Has been cancelled
Run Tests / test (3.13) (push) Has been cancelled
Run Tests / test (3.9) (push) Has been cancelled
* Add minimal handling for broken symlinks in generate_output_content

* core: simplify generate_output_content

* pylint adjust no-else-return
2025-10-28 09:27:44 +01:00
Kirill Markin
8a94182b3d
Bump version to 0.8.0
Some checks failed
Run Tests / test (3.11) (push) Has been cancelled
Run Tests / test (3.13) (push) Has been cancelled
Run Tests / test (3.9) (push) Has been cancelled
2025-10-25 15:33:35 +02:00
Kirill Markin
bcb0d82191
refactor: reorganize cursor rules into .cursor directory
- Move cursor rules from .cursorrules to .cursor/index.mdc
- Create CLAUDE.md and AGENTS.md symlinks in project root
- Delete deprecated .cursorrules file
- Symlinks point to .cursor/index.mdc for consistent rule management
2025-10-25 15:11:43 +02:00
Kirill Markin
2807344752
Merge pull request #35 from kirill-markin/fix-issue-26-windows-tree-command
Fix tree command for Windows
2025-10-25 15:02:46 +02:00
Kirill Markin
3721ed45f0
Fix tree command for Windows (fixes #26)
- Add platform detection to run_tree_command
- Use 'cmd /c tree /a /f' syntax on Windows
- Keep 'tree -a -f --noreport' syntax on Unix/Linux/Mac
- Modernize subprocess call with text=True and encoding='utf-8'
- Add stderr=subprocess.PIPE for better error handling

All 43 tests pass successfully.
2025-10-25 15:02:18 +02:00
5 changed files with 47 additions and 14 deletions

View file

@ -1,3 +1,7 @@
---
alwaysApply: true
---
# repo-to-text
## Project Overview

1
AGENTS.md Symbolic link
View file

@ -0,0 +1 @@
.cursor/index.mdc

1
CLAUDE.md Symbolic link
View file

@ -0,0 +1 @@
.cursor/index.mdc

View file

@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project]
name = "repo-to-text"
version = "0.7.0"
version = "0.8.0"
authors = [
{ name = "Kirill Markin", email = "markinkirill@gmail.com" },
]

View file

@ -4,6 +4,7 @@ Core functionality for repo-to-text
import os
import subprocess
import platform
from typing import Tuple, Optional, List, Dict, Any, Set
from datetime import datetime, timezone
from importlib.machinery import ModuleSpec
@ -36,12 +37,20 @@ def get_tree_structure(
def run_tree_command(path: str) -> str:
"""Run the tree command and return its output."""
if platform.system() == "Windows":
cmd = ["cmd", "/c", "tree", "/a", "/f", path]
else:
cmd = ["tree", "-a", "-f", "--noreport", path]
result = subprocess.run(
['tree', '-a', '-f', '--noreport', path],
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
encoding='utf-8',
check=True
)
return result.stdout.decode('utf-8')
return result.stdout
def filter_tree_output(
tree_output: str,
@ -343,6 +352,33 @@ def save_repo_to_text(
return output_filepaths[0]
return ""
def _read_file_content(file_path: str) -> str:
"""Read file content, handling binary files and broken symlinks.
Args:
file_path: Path to the file to read
Returns:
str: File content or appropriate message for special cases
"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
return f.read()
except UnicodeDecodeError:
logging.debug('Handling binary file contents: %s', file_path)
with open(file_path, 'rb') as f_bin:
binary_content: bytes = f_bin.read()
return binary_content.decode('latin1')
except FileNotFoundError as e:
# Minimal handling for bad symlinks
if os.path.islink(file_path) and not os.path.exists(file_path):
try:
target = os.readlink(file_path)
except OSError:
target = ''
return f"[symlink] -> {target}"
raise e
def generate_output_content(
path: str,
@ -417,17 +453,8 @@ def generate_output_content(
cleaned_relative_path = relative_path.replace('./', '', 1)
_add_chunk_to_output(f'\n<content full_path="{cleaned_relative_path}">\n')
try:
with open(file_path, 'r', encoding='utf-8') as f:
file_content = f.read()
_add_chunk_to_output(file_content)
except UnicodeDecodeError:
logging.debug('Handling binary file contents: %s', file_path)
with open(file_path, 'rb') as f_bin:
binary_content: bytes = f_bin.read()
_add_chunk_to_output(binary_content.decode('latin1')) # Add decoded binary
file_content = _read_file_content(file_path)
_add_chunk_to_output(file_content)
_add_chunk_to_output('\n</content>\n')
_add_chunk_to_output('\n</repo-to-text>\n')