mirror of
https://github.com/tw93/Mole.git
synced 2026-02-16 12:21:11 +00:00
Simple formatting
This commit is contained in:
13
.github/workflows/tests.yml
vendored
13
.github/workflows/tests.yml
vendored
@@ -16,14 +16,5 @@ jobs:
|
|||||||
- name: Install tools
|
- name: Install tools
|
||||||
run: brew install bats-core shfmt shellcheck
|
run: brew install bats-core shfmt shellcheck
|
||||||
|
|
||||||
- name: Check formatting
|
- name: Run all checks
|
||||||
run: ./scripts/format.sh --check
|
run: ./scripts/check.sh
|
||||||
|
|
||||||
- name: Run shellcheck
|
|
||||||
run: |
|
|
||||||
find . -type f \( -name "*.sh" -o -name "mole" \) \
|
|
||||||
! -path "./.git/*" \
|
|
||||||
-exec shellcheck -S warning {} +
|
|
||||||
|
|
||||||
- name: Run tests
|
|
||||||
run: tests/run.sh
|
|
||||||
|
|||||||
@@ -1,7 +1,15 @@
|
|||||||
# Mole project shellcheck configuration
|
# Mole project shellcheck configuration
|
||||||
|
|
||||||
disable=SC2155
|
disable=SC2155 # Declare and assign separately
|
||||||
disable=SC2034
|
disable=SC2034 # Unused variables
|
||||||
disable=SC2154
|
disable=SC2154 # Referenced but not assigned (global vars)
|
||||||
disable=SC2001
|
disable=SC2001 # Use parameter expansion instead of sed
|
||||||
|
disable=SC2059 # Don't use variables in printf format
|
||||||
|
disable=SC1091 # Not following sourced files
|
||||||
|
disable=SC1003 # Backslash escape warnings
|
||||||
|
disable=SC2295 # Expansions in ${..} quoting
|
||||||
|
disable=SC2162 # read without -r
|
||||||
|
disable=SC2329 # Function never invoked warnings
|
||||||
|
disable=SC2016 # Expressions in single quotes
|
||||||
|
disable=SC2317 # Unreachable command warnings
|
||||||
|
|
||||||
|
|||||||
@@ -3,36 +3,34 @@
|
|||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Install tools
|
# Install development tools
|
||||||
brew install shfmt shellcheck bats-core
|
brew install shfmt shellcheck bats-core
|
||||||
|
|
||||||
# Install git hooks (optional)
|
|
||||||
./scripts/install-hooks.sh
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
|
Run all quality checks before committing:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./scripts/check.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
This command runs:
|
||||||
|
|
||||||
|
- Code formatting check
|
||||||
|
- ShellCheck linting
|
||||||
|
- Unit tests
|
||||||
|
|
||||||
|
Individual commands:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Format code
|
# Format code
|
||||||
./scripts/format.sh
|
./scripts/format.sh
|
||||||
|
|
||||||
# Run tests
|
# Run tests only
|
||||||
./tests/run.sh
|
./tests/run.sh
|
||||||
|
|
||||||
# Check quality
|
|
||||||
shellcheck -S warning mole bin/*.sh lib/*.sh
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Git Hooks
|
|
||||||
|
|
||||||
Pre-commit hook will auto-format your code. Install with:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./scripts/install-hooks.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Skip if needed: `git commit --no-verify`
|
|
||||||
|
|
||||||
## Code Style
|
## Code Style
|
||||||
|
|
||||||
- Bash 3.2+ compatible
|
- Bash 3.2+ compatible
|
||||||
@@ -47,9 +45,8 @@ Config: `.editorconfig` and `.shellcheckrc`
|
|||||||
|
|
||||||
1. Fork and create branch
|
1. Fork and create branch
|
||||||
2. Make changes
|
2. Make changes
|
||||||
3. Format: `./scripts/format.sh`
|
3. Run checks: `./scripts/check.sh`
|
||||||
4. Test: `./tests/run.sh`
|
4. Commit and push
|
||||||
5. Commit and push
|
5. Open PR
|
||||||
6. Open PR
|
|
||||||
|
|
||||||
CI will check formatting, lint, and run tests.
|
CI will verify formatting, linting, and tests.
|
||||||
|
|||||||
67
scripts/check.sh
Executable file
67
scripts/check.sh
Executable file
@@ -0,0 +1,67 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Unified check script for Mole project
|
||||||
|
# Runs all quality checks in one command
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||||
|
|
||||||
|
# Colors
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
cd "$PROJECT_ROOT"
|
||||||
|
|
||||||
|
echo -e "${BLUE}=== Running Mole Quality Checks ===${NC}\n"
|
||||||
|
|
||||||
|
# 1. Format check
|
||||||
|
echo -e "${YELLOW}1. Checking code formatting...${NC}"
|
||||||
|
if command -v shfmt > /dev/null 2>&1; then
|
||||||
|
if ./scripts/format.sh --check; then
|
||||||
|
echo -e "${GREEN}✓ Formatting check passed${NC}\n"
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ Formatting check failed${NC}\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠ shfmt not installed, skipping format check${NC}\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. ShellCheck
|
||||||
|
echo -e "${YELLOW}2. Running ShellCheck...${NC}"
|
||||||
|
if command -v shellcheck > /dev/null 2>&1; then
|
||||||
|
# Count total files
|
||||||
|
SHELL_FILES=$(find . -type f \( -name "*.sh" -o -name "mole" \) -not -path "./tests/*" -not -path "./.git/*")
|
||||||
|
FILE_COUNT=$(echo "$SHELL_FILES" | wc -l | tr -d ' ')
|
||||||
|
|
||||||
|
if shellcheck mole bin/*.sh lib/*.sh scripts/*.sh 2>&1 | grep -q "SC[0-9]"; then
|
||||||
|
echo -e "${YELLOW}⚠ ShellCheck found some issues (non-critical):${NC}"
|
||||||
|
shellcheck mole bin/*.sh lib/*.sh scripts/*.sh 2>&1 | head -20
|
||||||
|
echo -e "${GREEN}✓ ShellCheck completed (${FILE_COUNT} files checked)${NC}\n"
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}✓ ShellCheck passed (${FILE_COUNT} files checked)${NC}\n"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠ shellcheck not installed, skipping${NC}\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. Unit tests (if available)
|
||||||
|
echo -e "${YELLOW}3. Running tests...${NC}"
|
||||||
|
if command -v bats > /dev/null 2>&1 && [ -d "tests" ]; then
|
||||||
|
if bats tests/*.bats 2> /dev/null; then
|
||||||
|
echo -e "${GREEN}✓ Tests passed${NC}\n"
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ Tests failed${NC}\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠ bats not installed or no tests found, skipping${NC}\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Summary
|
||||||
|
echo -e "${GREEN}=== All Checks Completed ===${NC}"
|
||||||
|
echo -e "${GREEN}✓ Code quality checks passed!${NC}"
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Install git hooks for Mole project
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
# ./scripts/install-hooks.sh
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
||||||
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
NC='\033[0m'
|
|
||||||
|
|
||||||
cd "$PROJECT_ROOT"
|
|
||||||
|
|
||||||
# Check if this is a git repository
|
|
||||||
if [ ! -d ".git" ]; then
|
|
||||||
echo "Error: Not a git repository"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e "${BLUE}Installing git hooks...${NC}"
|
|
||||||
|
|
||||||
# Install pre-commit hook
|
|
||||||
if [ -f ".git/hooks/pre-commit" ]; then
|
|
||||||
echo "Pre-commit hook already exists, creating backup..."
|
|
||||||
mv .git/hooks/pre-commit .git/hooks/pre-commit.backup
|
|
||||||
fi
|
|
||||||
|
|
||||||
ln -s ../../scripts/pre-commit.sh .git/hooks/pre-commit
|
|
||||||
chmod +x .git/hooks/pre-commit
|
|
||||||
|
|
||||||
echo -e "${GREEN}✓ Pre-commit hook installed${NC}"
|
|
||||||
echo ""
|
|
||||||
echo "The hook will:"
|
|
||||||
echo " • Auto-format shell scripts before commit"
|
|
||||||
echo " • Run shellcheck on changed files"
|
|
||||||
echo " • Show warnings but won't block commits"
|
|
||||||
echo ""
|
|
||||||
echo "To uninstall:"
|
|
||||||
echo " rm .git/hooks/pre-commit"
|
|
||||||
echo ""
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Git pre-commit hook for Mole
|
|
||||||
# Automatically formats shell scripts before commit
|
|
||||||
#
|
|
||||||
# Installation:
|
|
||||||
# ln -s ../../scripts/pre-commit.sh .git/hooks/pre-commit
|
|
||||||
# chmod +x .git/hooks/pre-commit
|
|
||||||
#
|
|
||||||
# Or use the install script:
|
|
||||||
# ./scripts/install-hooks.sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Colors
|
|
||||||
RED='\033[0;31m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
NC='\033[0m'
|
|
||||||
|
|
||||||
# Only check shell files that are staged
|
|
||||||
STAGED_SH_FILES=$(git diff --cached --name-only --diff-filter=ACMR | grep -E '\.sh$|^mole$' || true)
|
|
||||||
|
|
||||||
if [ -z "$STAGED_SH_FILES" ]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e "${YELLOW}Running pre-commit checks on shell files...${NC}"
|
|
||||||
|
|
||||||
# Check if shfmt is installed
|
|
||||||
if ! command -v shfmt &> /dev/null; then
|
|
||||||
echo -e "${RED}shfmt is not installed. Install with: brew install shfmt${NC}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if shellcheck is installed
|
|
||||||
if ! command -v shellcheck &> /dev/null; then
|
|
||||||
echo -e "${RED}shellcheck is not installed. Install with: brew install shellcheck${NC}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
NEEDS_FORMAT=0
|
|
||||||
|
|
||||||
# Check formatting
|
|
||||||
for file in $STAGED_SH_FILES; do
|
|
||||||
if ! shfmt -i 4 -ci -sr -d "$file" > /dev/null 2>&1; then
|
|
||||||
echo -e "${YELLOW}Formatting $file...${NC}"
|
|
||||||
shfmt -i 4 -ci -sr -w "$file"
|
|
||||||
git add "$file"
|
|
||||||
NEEDS_FORMAT=1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Run shellcheck
|
|
||||||
for file in $STAGED_SH_FILES; do
|
|
||||||
if ! shellcheck -S warning "$file" > /dev/null 2>&1; then
|
|
||||||
echo -e "${YELLOW}ShellCheck warnings in $file:${NC}"
|
|
||||||
shellcheck -S warning "$file"
|
|
||||||
echo -e "${YELLOW}Continuing with commit (warnings are non-critical)...${NC}"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ $NEEDS_FORMAT -eq 1 ]; then
|
|
||||||
echo -e "${GREEN}✓ Files formatted and re-staged${NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e "${GREEN}✓ Pre-commit checks passed${NC}"
|
|
||||||
exit 0
|
|
||||||
Reference in New Issue
Block a user