mirror of
https://github.com/MuRuLOSE/limoka.git
synced 2026-06-16 14:34:17 +02:00
some fixes
This commit is contained in:
@@ -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)
|
||||
Reference in New Issue
Block a user