sort
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
#!/usr/bin/env python3
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
from typing import Set
|
||||
|
||||
INDEX_FILE = "index.json"
|
||||
ARCHIVE_FOLDER = "archive"
|
||||
RESERVED_PATHS = {
|
||||
'.git', '.gitignore', '.github', 'node_modules', '.vscode',
|
||||
'archive', '.idea', '__pycache__', '.DS_Store', '.env', '.gitea'
|
||||
}
|
||||
|
||||
|
||||
def load_index() -> Set[str]:
|
||||
try:
|
||||
with open(INDEX_FILE, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
print(f"Loaded {INDEX_FILE}")
|
||||
|
||||
indexed_folders = set()
|
||||
for key in data.keys():
|
||||
folder = key.split('/')[0]
|
||||
indexed_folders.add(folder)
|
||||
|
||||
print(f"Found {len(indexed_folders)} indexed folders")
|
||||
return indexed_folders
|
||||
except FileNotFoundError:
|
||||
print(f"Error: {INDEX_FILE} not found")
|
||||
raise
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"Error parsing {INDEX_FILE}: {e}")
|
||||
raise
|
||||
|
||||
|
||||
def get_all_folders() -> Set[str]:
|
||||
all_folders = set()
|
||||
try:
|
||||
for item in os.listdir('.'):
|
||||
item_path = os.path.join('.', item)
|
||||
if os.path.isdir(item_path) and item not in RESERVED_PATHS:
|
||||
all_folders.add(item)
|
||||
|
||||
print(f"Found {len(all_folders)} total folders in repo")
|
||||
return all_folders
|
||||
except Exception as e:
|
||||
print(f"Error scanning directories: {e}")
|
||||
raise
|
||||
|
||||
|
||||
def create_archive_folder() -> None:
|
||||
if not os.path.exists(ARCHIVE_FOLDER):
|
||||
os.makedirs(ARCHIVE_FOLDER)
|
||||
print(f"Created '{ARCHIVE_FOLDER}' folder")
|
||||
else:
|
||||
print(f"'{ARCHIVE_FOLDER}' folder already exists")
|
||||
|
||||
|
||||
def archive_folders(indexed_folders: Set[str], all_folders: Set[str]) -> None:
|
||||
folders_to_archive = all_folders - indexed_folders
|
||||
|
||||
if not folders_to_archive:
|
||||
print(f"\nAll folders are indexed, nothing to archive")
|
||||
return
|
||||
|
||||
print(f"\nFound {len(folders_to_archive)} folders to archive:")
|
||||
|
||||
for folder in sorted(folders_to_archive):
|
||||
source = os.path.join('.', folder)
|
||||
destination = os.path.join(ARCHIVE_FOLDER, folder)
|
||||
|
||||
try:
|
||||
if os.path.exists(destination):
|
||||
print(f"Skipping '{folder}' (already exists in archive)")
|
||||
continue
|
||||
|
||||
shutil.move(source, destination)
|
||||
print(f"Archived: {folder}")
|
||||
except Exception as e:
|
||||
print(f"Error archiving '{folder}': {e}")
|
||||
|
||||
|
||||
def main():
|
||||
"""Main execution function."""
|
||||
print("=" * 60)
|
||||
print("FOLDER ARCHIVAL SCRIPT")
|
||||
print("=" * 60)
|
||||
print()
|
||||
|
||||
try:
|
||||
indexed_folders = load_index()
|
||||
|
||||
all_folders = get_all_folders()
|
||||
|
||||
create_archive_folder()
|
||||
|
||||
archive_folders(indexed_folders, all_folders)
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print("ARCHIVAL COMPLETE")
|
||||
print("=" * 60)
|
||||
|
||||
except Exception as e:
|
||||
print(f"\nScript failed: {e}")
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
exit(main())
|
||||
Reference in New Issue
Block a user