| #!/bin/bash |
|
|
| |
| |
| |
| |
| |
| |
|
|
| set -e |
|
|
| |
| RED='\033[0;31m' |
| GREEN='\033[0;32m' |
| YELLOW='\033[1;33m' |
| BLUE='\033[0;34m' |
| NC='\033[0m' |
|
|
| |
| PROJECT_ROOT=$(git rev-parse --show-toplevel) |
| FIXED_COUNT=0 |
| SKIPPED_COUNT=0 |
| ERROR_COUNT=0 |
|
|
| |
| log_info() { |
| echo -e "${BLUE}[INFO]${NC} $1" |
| } |
|
|
| log_success() { |
| echo -e "${GREEN}[SUCCESS]${NC} $1" |
| ((FIXED_COUNT++)) |
| } |
|
|
| log_warning() { |
| echo -e "${YELLOW}[WARNING]${NC} $1" |
| ((SKIPPED_COUNT++)) |
| } |
|
|
| log_error() { |
| echo -e "${RED}[ERROR]${NC} $1" |
| ((ERROR_COUNT++)) |
| } |
|
|
| |
| |
| |
| clean_general() { |
| log_info "Starting general file cleanup..." |
| |
| |
| find . -type f -name "*.pyc" -delete |
| find . -type f -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null || true |
| find . -type f -name "*.py.bak" -delete |
| find . -type d -name ".pytest_cache" -exec rm -rf {} + 2>/dev/null || true |
| find . -type d -name "node_modules" -exec rm -rf {} + 2>/dev/null || true |
| find . -type f -name "*.log" -delete 2>/dev/null || true |
| |
| |
| find . -type f -name ".DS_Store" -delete |
| find . -type f -name "Thumbs.db" -delete |
| |
| log_success "General cleanup completed" |
| } |
|
|
| |
| |
| |
| fix_javascript() { |
| log_info "Scanning and fixing JavaScript/TypeScript files..." |
| |
| |
| if [ ! -f "package.json" ]; then |
| log_warning "No package.json found - skipping JavaScript" |
| return |
| fi |
| |
| |
| if [ -f "package-lock.json" ] || [ -f "yarn.lock" ]; then |
| npm ci --prefer-offline --no-audit 2>/dev/null || npm install |
| else |
| npm install |
| fi |
| |
| |
| if command -v npx &> /dev/null; then |
| if [ -f ".prettierrc.js" ] || [ -f ".prettierrc.json" ] || [ -f "prettier.config.js" ]; then |
| npx prettier --write "src/**/*.js" "src/**/*.ts" 2>/dev/null || true |
| npx prettier --write "**/*.js" "**/*.ts" 2>/dev/null || true |
| log_success "JavaScript/TypeScript formatted" |
| fi |
| fi |
| |
| |
| if command -v npx &> /dev/null && grep -q '"eslint"' package.json; then |
| npx eslint --fix "src/**/*.js" "src/**/*.ts" 2>/dev/null || true |
| log_success "ESLint errors fixed" |
| fi |
| } |
|
|
| |
| |
| |
| fix_python() { |
| log_info "Scanning and fixing Python files..." |
| |
| |
| if ! find . -name "*.py" -type f | grep -q .; then |
| log_warning "No Python files found in project" |
| return |
| fi |
| |
| |
| pip install black isort flake8 autoflake 2>/dev/null || true |
| |
| |
| if command -v autoflake &> /dev/null; then |
| autoflake --remove-all-unused-imports --recursive --in-place . 2>/dev/null || true |
| log_success "Unused imports removed" |
| fi |
| |
| |
| if command -v isort &> /dev/null; then |
| isort --profile black --apply --diff . 2>/dev/null || true |
| isort --profile black --apply . 2>/dev/null || true |
| log_success "Imports organized" |
| fi |
| |
| |
| if command -v black &> /dev/null; then |
| black --line-length 100 --target-version py39 --diff . 2>/dev/null || true |
| black --line-length 100 --target-version py39 . 2>/dev/null || true |
| log_success "Code formatted with Black" |
| fi |
| } |
|
|
| |
| |
| |
| fix_go() { |
| log_info "Scanning and fixing Go files..." |
| |
| |
| if ! find . -name "*.go" -type f | grep -q .; then |
| log_warning "No Go files found in project" |
| return |
| fi |
| |
| |
| if command -v gofmt &> /dev/null; then |
| gofmt -w . 2>/dev/null || true |
| log_success "Go formatted" |
| fi |
| |
| |
| if command -v goimports &> /dev/null; then |
| goimports -w . 2>/dev/null || true |
| log_success "Go imports fixed" |
| fi |
| } |
|
|
| |
| |
| |
| fix_java() { |
| log_info "Scanning and fixing Java files..." |
| |
| |
| if ! find . -name "*.java" -type f | grep -q .; then |
| log_warning "No Java files found in project" |
| return |
| fi |
| |
| |
| if [ -f ".google-java-format" ]; then |
| if command -v google-java-format &> /dev/null; then |
| google-java-format -i --replace $(find . -name "*.java") 2>/dev/null || true |
| log_success "Java formatted" |
| fi |
| fi |
| |
| |
| if command -v astyle &> /dev/null; then |
| astyle --style=google --recursive "*.java" 2>/dev/null || true |
| log_success "Java formatted with Astyle" |
| fi |
| } |
|
|
| |
| |
| |
| fix_config_files() { |
| log_info "Scanning and fixing configuration files..." |
| |
| |
| pip install pyyaml 2>/dev/null || true |
| |
| |
| find . -name "*.yaml" -o -name "*.yml" | while read -r file; do |
| if command -v python3 &> /dev/null; then |
| python3 -c " |
| import yaml |
| import sys |
| try: |
| with open('$file', 'r') as f: |
| content = yaml.safe_load(f) |
| with open('$file', 'w') as f: |
| yaml.dump(content, f, default_flow_style=False, allow_unicode=True) |
| print('Fixed: $file') |
| except Exception as e: |
| pass |
| " 2>/dev/null || true |
| fi |
| done |
| |
| |
| find . -name "*.json" | while read -r file; do |
| if command -v python3 &> /dev/null; then |
| python3 -c " |
| import json |
| import sys |
| try: |
| with open('$file', 'r') as f: |
| content = json.load(f) |
| with open('$file', 'w') as f: |
| json.dump(content, f, indent=2, ensure_ascii=False) |
| print('Fixed: $file') |
| except Exception as e: |
| pass |
| " 2>/dev/null || true |
| fi |
| done |
| |
| log_success "Configuration files fixed" |
| } |
|
|
| |
| |
| |
| add_license_headers() { |
| log_info "Scanning license headers..." |
| |
| |
| if [ -f "COPYRIGHT_HEADER.txt" ]; then |
| local header=$(cat COPYRIGHT_HEADER.txt) |
| |
| for ext in "*.py" "*.js" "*.ts" "*.java" "*.go"; do |
| find . -name "$ext" -type f | while read -r file; do |
| |
| if ! head -5 "$file" | grep -q "Copyright"; then |
| |
| if [ "$ext" == "*.py" ]; then |
| echo "# $header" | cat - "$file" > temp && mv temp "$file" |
| elif [ "$ext" == "*.js" ] || [ "$ext" == "*.ts" ]; then |
| echo "// $header" | cat - "$file" > temp && mv temp "$file" |
| elif [ "$ext" == "*.java" ]; then |
| echo "/* $header */" | cat - "$file" > temp && mv temp "$file" |
| elif [ "$ext" == "*.go" ]; then |
| echo "// $header" | cat - "$file" > temp && mv temp "$file" |
| fi |
| log_success "License header added: $file" |
| fi |
| done |
| done |
| fi |
| } |
|
|
| |
| |
| |
| organize_files() { |
| log_info "Improving file organization..." |
| |
| |
| if [ -f "setup.cfg" ] || [ -f "pyproject.toml" ]; then |
| isort --recursive . 2>/dev/null || true |
| log_success "Imports reordered" |
| fi |
| |
| |
| if [ -f "README.md" ]; then |
| |
| if ! grep -q "^## Table of Contents$" README.md && ! grep -q "^## الفهرس$" README.md; then |
| echo -e "\n## Table of Contents\n" | cat - README.md > temp && mv temp README.md |
| log_success "README.md updated" |
| fi |
| fi |
| } |
|
|
| |
| |
| |
| security_check() { |
| log_info "Running basic security check..." |
| |
| |
| local secrets_patterns=( |
| "password\s*=\s*['\"][^'\"]+['\"]" |
| "api_key\s*=\s*['\"][^'\"]+['\"]" |
| "secret\s*=\s*['\"][^'\"]+['\"]" |
| "private_key\s*=\s*['\"][^'\"]+['\"]" |
| "AWS_ACCESS_KEY" |
| "AWS_SECRET_KEY" |
| ) |
| |
| for pattern in "${secrets_patterns[@]}"; do |
| if grep -rqE "$pattern" . --include="*.py" --include="*.js" --include="*.ts" 2>/dev/null; then |
| log_warning "Potential sensitive data found: $pattern" |
| fi |
| done |
| |
| log_success "Security check completed" |
| } |
|
|
| |
| |
| |
| main() { |
| echo "==============================================" |
| echo " Auto-Guardian: Auto-Fix Script" |
| echo "==============================================" |
| echo "" |
| |
| cd "$PROJECT_ROOT" |
| |
| |
| echo "Date: $(date)" |
| echo "Directory: $PROJECT_ROOT" |
| echo "" |
| |
| |
| clean_general |
| fix_javascript |
| fix_python |
| fix_go |
| fix_java |
| fix_config_files |
| add_license_headers |
| organize_files |
| security_check |
| |
| |
| echo "" |
| echo "==============================================" |
| echo " Fix Summary" |
| echo "==============================================" |
| echo -e " Fixed: ${GREEN}$FIXED_COUNT${NC}" |
| echo -e " Skipped: ${YELLOW}$SKIPPED_COUNT${NC}" |
| echo -e " Errors: ${RED}$ERROR_COUNT${NC}" |
| echo "" |
| |
| if [ $ERROR_COUNT -gt 0 ]; then |
| echo "Warning: Some errors occurred during fixing" |
| exit 1 |
| else |
| echo "All fixes completed successfully" |
| exit 0 |
| fi |
| } |
|
|
| |
| main "$@" |
|
|