testsAndMisc/scripts/utils/download_exercism_bulk.sh
Copilot faff8ba349 Fix shell script formatting and add PR workflow validation (#3)
* Initial plan

* fix: format shell scripts with shfmt (convert tabs to 2 spaces)

Co-authored-by: kuhyx <147418882+kuhyx@users.noreply.github.com>

* feat: enhance shell-check workflow for PR pre-merge validation

- Add pull_request_target trigger to check PRs from forks
- Add explicit failure message with instructions
- Create BRANCH_PROTECTION.md with setup guide
- Ensure workflow runs on all PRs targeting main/master

Co-authored-by: kuhyx <147418882+kuhyx@users.noreply.github.com>

* refactor: improve workflow security and remove redundant exit code

- Remove pull_request_target to avoid executing untrusted fork code
- Remove redundant exit 1 from failure step
- Update documentation to reflect changes
- Standard pull_request trigger handles forks securely

Co-authored-by: kuhyx <147418882+kuhyx@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: kuhyx <147418882+kuhyx@users.noreply.github.com>
2026-01-07 22:52:20 +01:00

107 lines
3.2 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# Download ALL Exercism exercises for offline practice
#
# This clones the official Exercism track repositories which contain
# ALL exercises with their test suites - no need to unlock one by one!
#
# Exercises are in: exercises/practice/<exercise-name>/
# Each exercise has tests you can run locally.
set -euo pipefail
TRACKS_DIR="${HOME}/exercism-tracks"
# Colors
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
success() { echo -e "${GREEN}$1${NC}"; }
info() { echo -e "${BLUE} $1${NC}"; }
warn() { echo -e "${YELLOW}$1${NC}"; }
echo "=============================================="
echo " Exercism Bulk Exercise Downloader"
echo " Download ALL exercises for offline practice"
echo "=============================================="
echo ""
mkdir -p "$TRACKS_DIR"
cd "$TRACKS_DIR"
# Tracks to download (add/remove as needed)
declare -A TRACKS=(
["python"]="https://github.com/exercism/python.git"
["c"]="https://github.com/exercism/c.git"
["cpp"]="https://github.com/exercism/cpp.git"
["javascript"]="https://github.com/exercism/javascript.git"
["typescript"]="https://github.com/exercism/typescript.git"
["rust"]="https://github.com/exercism/rust.git"
["go"]="https://github.com/exercism/go.git"
["bash"]="https://github.com/exercism/bash.git"
)
# Optional tracks (uncomment to include)
# TRACKS["java"]="https://github.com/exercism/java.git"
# TRACKS["ruby"]="https://github.com/exercism/ruby.git"
# TRACKS["haskell"]="https://github.com/exercism/haskell.git"
# TRACKS["elixir"]="https://github.com/exercism/elixir.git"
echo "Downloading ${#TRACKS[@]} tracks to: $TRACKS_DIR"
echo ""
for track in "${!TRACKS[@]}"; do
url="${TRACKS[$track]}"
if [[ -d $track ]]; then
info "Updating $track..."
(cd "$track" && git pull --quiet) && success "$track updated"
else
info "Cloning $track..."
git clone --depth 1 "$url" && success "$track cloned"
fi
# Show exercise count
if [[ -d "$track/exercises/practice" ]]; then
count=$(ls "$track/exercises/practice" | wc -l)
echo "$count practice exercises available"
fi
echo ""
done
echo "=============================================="
echo " Download Complete!"
echo "=============================================="
echo ""
echo "Exercises location: $TRACKS_DIR/<track>/exercises/practice/"
echo ""
echo "Example - Running Python exercises:"
echo " cd $TRACKS_DIR/python/exercises/practice/hello-world"
echo " python -m pytest -v"
echo ""
echo "Example - Running C exercises:"
echo " cd $TRACKS_DIR/c/exercises/practice/hello-world"
echo " make test"
echo ""
echo "Example - Running JavaScript exercises:"
echo " cd $TRACKS_DIR/javascript/exercises/practice/hello-world"
echo " npm install && npm test"
echo ""
echo "Each exercise folder contains:"
echo " - README.md (instructions)"
echo " - *_test.* (test file - run these!)"
echo " - .meta/exemplar.* (reference solution - don't peek!)"
echo ""
echo "=============================================="
# Summary
echo ""
echo "Track summary:"
for track in "${!TRACKS[@]}"; do
if [[ -d "$track/exercises/practice" ]]; then
count=$(ls "$track/exercises/practice" 2> /dev/null | wc -l)
printf " %-15s %3d exercises\n" "$track" "$count"
fi
done | sort