mirror of
https://github.com/MuRuLOSE/limoka.git
synced 2026-06-18 07:04:19 +02:00
some fixes
This commit is contained in:
29
.github/workflows/ci.yml
vendored
29
.github/workflows/ci.yml
vendored
@@ -21,7 +21,6 @@ env:
|
|||||||
jobs:
|
jobs:
|
||||||
before:
|
before:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
# Run on schedule or manual dispatch
|
|
||||||
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
||||||
steps:
|
steps:
|
||||||
- name: Configure Git for github-actions[bot]
|
- name: Configure Git for github-actions[bot]
|
||||||
@@ -58,7 +57,6 @@ jobs:
|
|||||||
|
|
||||||
update:
|
update:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
# Run on schedule or manual dispatch
|
|
||||||
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
||||||
needs: before
|
needs: before
|
||||||
steps:
|
steps:
|
||||||
@@ -67,6 +65,8 @@ jobs:
|
|||||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
git config --global user.name "github-actions[bot]"
|
git config --global user.name "github-actions[bot]"
|
||||||
git config --global --list
|
git config --global --list
|
||||||
|
- name: Configure Git to ignore file mode changes
|
||||||
|
run: git config core.fileMode false
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
@@ -78,6 +78,10 @@ jobs:
|
|||||||
python-version: '3.9'
|
python-version: '3.9'
|
||||||
- name: Install Python dependencies
|
- name: Install Python dependencies
|
||||||
run: pip install requests
|
run: pip install requests
|
||||||
|
- name: Debug file changes
|
||||||
|
run: |
|
||||||
|
git status
|
||||||
|
git diff --stat
|
||||||
- name: Clone and update repositories
|
- name: Clone and update repositories
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -92,7 +96,6 @@ jobs:
|
|||||||
|
|
||||||
parse:
|
parse:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
# Run on schedule, manual dispatch, push to main, or merged PR
|
|
||||||
if: |
|
if: |
|
||||||
github.event_name == 'schedule' ||
|
github.event_name == 'schedule' ||
|
||||||
github.event_name == 'workflow_dispatch' ||
|
github.event_name == 'workflow_dispatch' ||
|
||||||
@@ -105,11 +108,13 @@ jobs:
|
|||||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
git config --global user.name "github-actions[bot]"
|
git config --global user.name "github-actions[bot]"
|
||||||
git config --global --list
|
git config --global --list
|
||||||
|
- name: Configure Git to ignore file mode changes
|
||||||
|
run: git config core.fileMode false
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: ${{ env.GIT_DEPTH }}
|
fetch-depth: ${{ env.GIT_DEPTH }}
|
||||||
ref: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' && env.BRANCH_NAME || 'main' }}
|
ref: ${{ (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && env.BRANCH_NAME || 'main' }}
|
||||||
- name: Set up Python 3.9
|
- name: Set up Python 3.9
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
@@ -120,8 +125,8 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
echo "Running parse after update..."
|
echo "Running parse after update..."
|
||||||
git fetch origin
|
git fetch origin
|
||||||
git checkout ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' && env.BRANCH_NAME || 'main' }}
|
git checkout ${{ (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && env.BRANCH_NAME || 'main' }}
|
||||||
git reset --hard origin/${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' && env.BRANCH_NAME || 'main' }}
|
git reset --hard origin/${{ (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && env.BRANCH_NAME || 'main' }}
|
||||||
python3 -m venv venv
|
python3 -m venv venv
|
||||||
source venv/bin/activate
|
source venv/bin/activate
|
||||||
pip install --upgrade pip
|
pip install --upgrade pip
|
||||||
@@ -131,11 +136,10 @@ jobs:
|
|||||||
git add modules.json
|
git add modules.json
|
||||||
git commit -m "Updated modules.json after parse $(date +'%Y-%m-%d %H:%M:%S')" || echo "No changes for modules.json"
|
git commit -m "Updated modules.json after parse $(date +'%Y-%m-%d %H:%M:%S')" || echo "No changes for modules.json"
|
||||||
git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@${REPO_URL}"
|
git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@${REPO_URL}"
|
||||||
git push origin ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' && env.BRANCH_NAME || 'main' }}
|
git push origin ${{ (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && env.BRANCH_NAME || 'main' }}
|
||||||
|
|
||||||
commit:
|
commit:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
# Run on schedule or manual dispatch
|
|
||||||
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
||||||
needs: parse
|
needs: parse
|
||||||
steps:
|
steps:
|
||||||
@@ -144,11 +148,17 @@ jobs:
|
|||||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
git config --global user.name "github-actions[bot]"
|
git config --global user.name "github-actions[bot]"
|
||||||
git config --global --list
|
git config --global --list
|
||||||
|
- name: Configure Git to ignore file mode changes
|
||||||
|
run: git config core.fileMode false
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: ${{ env.GIT_DEPTH }}
|
fetch-depth: ${{ env.GIT_DEPTH }}
|
||||||
ref: ${{ env.BRANCH_NAME }}
|
ref: ${{ env.BRANCH_NAME }}
|
||||||
|
- name: Debug file changes
|
||||||
|
run: |
|
||||||
|
git status
|
||||||
|
git diff --stat
|
||||||
- name: Final commit
|
- name: Final commit
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -161,7 +171,6 @@ jobs:
|
|||||||
|
|
||||||
create_pr:
|
create_pr:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
# Run on schedule or manual dispatch
|
|
||||||
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
||||||
needs: commit
|
needs: commit
|
||||||
steps:
|
steps:
|
||||||
@@ -180,7 +189,6 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
echo "Checking branch status before PR..."
|
echo "Checking branch status before PR..."
|
||||||
git fetch origin
|
git fetch origin
|
||||||
# Check if the branch exists in the remote repository
|
|
||||||
if git ls-remote --exit-code --heads origin ${{ env.BRANCH_NAME }} >/dev/null 2>&1; then
|
if git ls-remote --exit-code --heads origin ${{ env.BRANCH_NAME }} >/dev/null 2>&1; then
|
||||||
echo "Branch ${{ env.BRANCH_NAME }} exists in remote repository."
|
echo "Branch ${{ env.BRANCH_NAME }} exists in remote repository."
|
||||||
git log origin/${{ env.BRANCH_NAME }} -1 || echo "Failed to view log for ${{ env.BRANCH_NAME }}"
|
git log origin/${{ env.BRANCH_NAME }} -1 || echo "Failed to view log for ${{ env.BRANCH_NAME }}"
|
||||||
@@ -193,7 +201,6 @@ jobs:
|
|||||||
|
|
||||||
backup:
|
backup:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
# Run on main branch or manual dispatch
|
|
||||||
if: github.ref == 'refs/heads/main' || github.event_name == 'workflow_dispatch'
|
if: github.ref == 'refs/heads/main' || github.event_name == 'workflow_dispatch'
|
||||||
needs: parse
|
needs: parse
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
@@ -51,7 +51,21 @@ repos = [
|
|||||||
"https://github.com/fiksofficial/python-modules"
|
"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):
|
def is_repo_public(repo_url):
|
||||||
|
"""Check if the repository is accessible."""
|
||||||
result = subprocess.run(
|
result = subprocess.run(
|
||||||
["git", "ls-remote", repo_url],
|
["git", "ls-remote", repo_url],
|
||||||
stdout=subprocess.DEVNULL,
|
stdout=subprocess.DEVNULL,
|
||||||
@@ -60,6 +74,7 @@ def is_repo_public(repo_url):
|
|||||||
return result.returncode == 0
|
return result.returncode == 0
|
||||||
|
|
||||||
def is_repo_accessible(repo_url):
|
def is_repo_accessible(repo_url):
|
||||||
|
"""Check if the repository URL is accessible via HTTP."""
|
||||||
try:
|
try:
|
||||||
response = requests.head(repo_url, timeout=5)
|
response = requests.head(repo_url, timeout=5)
|
||||||
return response.status_code == 200
|
return response.status_code == 200
|
||||||
@@ -67,45 +82,52 @@ def is_repo_accessible(repo_url):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def is_valid_filename(filename):
|
def is_valid_filename(filename):
|
||||||
|
"""Check if the filename contains invalid characters."""
|
||||||
invalid_chars = r'[<>:"/\\|?*]'
|
invalid_chars = r'[<>:"/\\|?*]'
|
||||||
return not re.search(invalid_chars, filename)
|
return not re.search(invalid_chars, filename)
|
||||||
|
|
||||||
def rename_invalid_files(local_path):
|
def rename_invalid_files(local_path):
|
||||||
|
"""Rename files with invalid characters in their names."""
|
||||||
for root, dirs, files in os.walk(local_path):
|
for root, dirs, files in os.walk(local_path):
|
||||||
for file in files:
|
for file in files:
|
||||||
if not is_valid_filename(file):
|
if not is_valid_filename(file):
|
||||||
old_path = os.path.join(root, file)
|
old_path = os.path.join(root, file)
|
||||||
new_file = re.sub(r'[<>:"/\\|?*]', "_", file)
|
new_file = re.sub(r'[<>:"/\\|?*]', "_", file)
|
||||||
new_path = os.path.join(root, new_file)
|
new_path = os.path.join(root, new_file)
|
||||||
os.rename(old_path, new_path)
|
try:
|
||||||
print(f"Переименован файл: {old_path} -> {new_path}")
|
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):
|
def get_repo_path(repo_url):
|
||||||
|
"""Extract the repository path from the URL."""
|
||||||
return repo_url.replace("https://github.com/", "")
|
return repo_url.replace("https://github.com/", "")
|
||||||
|
|
||||||
def clean_unused_repos():
|
def clean_unused_repos():
|
||||||
|
"""Remove directories not in the repos list or for inaccessible repositories."""
|
||||||
current_dir = os.getcwd()
|
current_dir = os.getcwd()
|
||||||
print(f"Текущая директория: {current_dir}")
|
print(f"Current directory: {current_dir}")
|
||||||
|
|
||||||
existing_dirs = {
|
existing_dirs = {
|
||||||
d
|
d
|
||||||
for d in os.listdir(current_dir)
|
for d in os.listdir(current_dir)
|
||||||
if os.path.isdir(os.path.join(current_dir, d))
|
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"}
|
protected_dirs = {".git", ".github", "assets"}
|
||||||
existing_dirs.difference_update(protected_dirs)
|
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}
|
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:
|
for dir_name in existing_dirs:
|
||||||
dir_path = os.path.join(current_dir, dir_name)
|
dir_path = os.path.join(current_dir, dir_name)
|
||||||
if dir_name not in expected_dirs:
|
if dir_name not in expected_dirs:
|
||||||
shutil.rmtree(dir_path, ignore_errors=True)
|
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:
|
for repo_url in repos:
|
||||||
repo_path = get_repo_path(repo_url)
|
repo_path = get_repo_path(repo_url)
|
||||||
@@ -113,9 +135,10 @@ def clean_unused_repos():
|
|||||||
if os.path.exists(local_path):
|
if os.path.exists(local_path):
|
||||||
if not is_repo_accessible(repo_url):
|
if not is_repo_accessible(repo_url):
|
||||||
shutil.rmtree(local_path, ignore_errors=True)
|
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):
|
def clone_or_update_repo(repo_url):
|
||||||
|
"""Clone or update a repository and process its files."""
|
||||||
repo_path = get_repo_path(repo_url)
|
repo_path = get_repo_path(repo_url)
|
||||||
owner, repo_name = repo_path.split("/")
|
owner, repo_name = repo_path.split("/")
|
||||||
local_path = os.path.join(owner, repo_name)
|
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):
|
if os.path.exists(local_path):
|
||||||
shutil.rmtree(local_path)
|
shutil.rmtree(local_path)
|
||||||
print(f"Удалена старая директория: {local_path}")
|
print(f"Removed old directory: {local_path}")
|
||||||
|
|
||||||
if not is_repo_public(repo_url):
|
if not is_repo_public(repo_url):
|
||||||
print(f"Пропускаем закрытый или недоступный репозиторий: {repo_url}")
|
print(f"Skipping private or inaccessible repository: {repo_url}")
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -140,11 +163,12 @@ def clone_or_update_repo(repo_url):
|
|||||||
)
|
)
|
||||||
shutil.rmtree(os.path.join(local_path, ".git"), ignore_errors=True)
|
shutil.rmtree(os.path.join(local_path, ".git"), ignore_errors=True)
|
||||||
rename_invalid_files(local_path)
|
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:
|
except subprocess.CalledProcessError as e:
|
||||||
print(f"Ошибка при клонировании {repo_url}: {e.stderr}, пропускаем.")
|
print(f"Error cloning {repo_url}: {e.stderr}, skipping.")
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
configure_git() # Set Git configuration at the start
|
||||||
clean_unused_repos()
|
clean_unused_repos()
|
||||||
for repo_url in repos:
|
for repo_url in repos:
|
||||||
clone_or_update_repo(repo_url)
|
clone_or_update_repo(repo_url)
|
||||||
Reference in New Issue
Block a user