some fixes

This commit is contained in:
2025-08-04 14:34:56 +03:00
parent 63ecdf011c
commit 0c37220868
2 changed files with 54 additions and 23 deletions

View File

@@ -51,7 +51,21 @@ repos = [
"https://github.com/fiksofficial/python-modules"
]
def configure_git():
"""Configure Git to ignore file mode changes."""
try:
subprocess.run(
["git", "config", "core.fileMode", "false"],
check=True,
capture_output=True,
text=True,
)
print("Git configured to ignore file mode changes.")
except subprocess.CalledProcessError as e:
print(f"Error configuring Git: {e.stderr}")
def is_repo_public(repo_url):
"""Check if the repository is accessible."""
result = subprocess.run(
["git", "ls-remote", repo_url],
stdout=subprocess.DEVNULL,
@@ -60,6 +74,7 @@ def is_repo_public(repo_url):
return result.returncode == 0
def is_repo_accessible(repo_url):
"""Check if the repository URL is accessible via HTTP."""
try:
response = requests.head(repo_url, timeout=5)
return response.status_code == 200
@@ -67,45 +82,52 @@ def is_repo_accessible(repo_url):
return False
def is_valid_filename(filename):
"""Check if the filename contains invalid characters."""
invalid_chars = r'[<>:"/\\|?*]'
return not re.search(invalid_chars, filename)
def rename_invalid_files(local_path):
"""Rename files with invalid characters in their names."""
for root, dirs, files in os.walk(local_path):
for file in files:
if not is_valid_filename(file):
old_path = os.path.join(root, file)
new_file = re.sub(r'[<>:"/\\|?*]', "_", file)
new_path = os.path.join(root, new_file)
os.rename(old_path, new_path)
print(f"Переименован файл: {old_path} -> {new_path}")
try:
os.rename(old_path, new_path)
print(f"Renamed file: {old_path} -> {new_path}")
except OSError as e:
print(f"Error renaming file {old_path}: {e}")
def get_repo_path(repo_url):
"""Extract the repository path from the URL."""
return repo_url.replace("https://github.com/", "")
def clean_unused_repos():
"""Remove directories not in the repos list or for inaccessible repositories."""
current_dir = os.getcwd()
print(f"Текущая директория: {current_dir}")
print(f"Current directory: {current_dir}")
existing_dirs = {
d
for d in os.listdir(current_dir)
if os.path.isdir(os.path.join(current_dir, d))
}
print(f"Все директории до фильтрации: {existing_dirs}")
print(f"All directories before filtering: {existing_dirs}")
protected_dirs = {".git", ".github", "assets"}
existing_dirs.difference_update(protected_dirs)
print(f"Директории после исключения защищённых: {existing_dirs}")
print(f"Directories after excluding protected: {existing_dirs}")
expected_dirs = {get_repo_path(url).split("/")[0] for url in repos}
print(f"Ожидаемые директории: {expected_dirs}")
print(f"Expected directories: {expected_dirs}")
for dir_name in existing_dirs:
dir_path = os.path.join(current_dir, dir_name)
if dir_name not in expected_dirs:
shutil.rmtree(dir_path, ignore_errors=True)
print(f"Удалена директория, отсутствующая в списке repos: {dir_path}")
print(f"Removed directory not in repos list: {dir_path}")
for repo_url in repos:
repo_path = get_repo_path(repo_url)
@@ -113,9 +135,10 @@ def clean_unused_repos():
if os.path.exists(local_path):
if not is_repo_accessible(repo_url):
shutil.rmtree(local_path, ignore_errors=True)
print(f"Удалена директория недоступного или удалённого репозитория: {local_path}")
print(f"Removed directory for inaccessible repository: {local_path}")
def clone_or_update_repo(repo_url):
"""Clone or update a repository and process its files."""
repo_path = get_repo_path(repo_url)
owner, repo_name = repo_path.split("/")
local_path = os.path.join(owner, repo_name)
@@ -125,10 +148,10 @@ def clone_or_update_repo(repo_url):
if os.path.exists(local_path):
shutil.rmtree(local_path)
print(f"Удалена старая директория: {local_path}")
print(f"Removed old directory: {local_path}")
if not is_repo_public(repo_url):
print(f"Пропускаем закрытый или недоступный репозиторий: {repo_url}")
print(f"Skipping private or inaccessible repository: {repo_url}")
return
try:
@@ -140,11 +163,12 @@ def clone_or_update_repo(repo_url):
)
shutil.rmtree(os.path.join(local_path, ".git"), ignore_errors=True)
rename_invalid_files(local_path)
print(f"Клонирован и обработан репозиторий: {repo_url} -> {local_path}")
print(f"Cloned and processed repository: {repo_url} -> {local_path}")
except subprocess.CalledProcessError as e:
print(f"Ошибка при клонировании {repo_url}: {e.stderr}, пропускаем.")
print(f"Error cloning {repo_url}: {e.stderr}, skipping.")
if __name__ == "__main__":
configure_git() # Set Git configuration at the start
clean_unused_repos()
for repo_url in repos:
clone_or_update_repo(repo_url)