| | #!/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 "$@" |
| |
|