in tools/url-checker/url_checker.py [0:0]
def find_path_case_insensitive(base_path, rel_path):
"""
Find a path with case-insensitive matching, handling multi-level paths.
Args:
base_path: Starting directory for the search
rel_path: Relative path to find (can include multiple directories)
Returns:
Full corrected path if found, None otherwise
"""
# Handle empty path
if not rel_path:
return base_path
# Split the path into components, handling both forward and back slashes
path_parts = re.split(r'[/\\]', rel_path)
path_parts = [part for part in path_parts if part] # Remove empty parts
current_path = base_path
print(f"Starting case-insensitive path search from: {current_path}")
print(f"Looking for path components: {path_parts}")
# Process each path component
for i, part in enumerate(path_parts):
# Skip if the component is '.' (current directory)
if part == '.':
continue
# Handle '..' (parent directory) - just use it directly as it doesn't need case correction
if part == '..':
current_path = os.path.dirname(current_path)
print(f"Going up to parent directory: {current_path}")
continue
# Try to find a case-insensitive match for this component
found = False
try:
if os.path.exists(os.path.join(current_path, part)):
# Exact match exists, use it directly
current_path = os.path.join(current_path, part)
found = True
print(f"Exact match found for '{part}': {current_path}")
else:
# Try case-insensitive match
for entry in os.listdir(current_path):
if entry.lower() == part.lower():
current_path = os.path.join(current_path, entry)
found = True
print(f"Case-insensitive match found for '{part}': {entry} at {current_path}")
break
except (PermissionError, FileNotFoundError, NotADirectoryError) as e:
print(f"Error accessing {current_path}: {str(e)}")
return None
if not found:
print(f"No match found for component '{part}' in {current_path}")
return None
# Add trailing slash if the original path had one
if rel_path.endswith('/') and not current_path.endswith(os.sep):
current_path += os.sep
print(f"Final resolved path: {current_path}")
return current_path