#!/bin/bash # Clones all student repos from GitHub Classroom using the GitHub CLI with GitHub Classroom extension # Accepts an assignment ID as an argument # If no argument is provided, it will show all assignments and prompt for one # If there are more than 30 repos, it will prompt to continue and clone the next page until all repos are cloned # Function to round up ceil() { num=$1 printf "%.0f\n" $(echo "$num + 0.999" | bc) } # Function to divide and round up ceil_divide() { local num1=$1 local num2=$2 local result=$(echo "scale=10; $num1 / $num2" | bc) local rounded_up=$(echo "$result" | awk '{print ($0 == int($0)) ? $0 : int($0)+1}') echo $rounded_up } # Function to strip colors strip_colors() { sed -E 's/\x1B\[[0-9;]*[mK]//g' } # Check if GitHub CLI is installed if ! command -v gh &> /dev/null then echo "GitHub CLI could not be found. Please install it from https://cli.github.com/" exit fi # Check if GitHub Classroom extension is installed if ! gh extension list | grep -q "gh-classroom" then echo "GitHub Classroom extension could not be found. Please install it by running 'gh extension install classroom'" exit fi # Get the assignment ID if [ -z "$1" ] then gh classroom assignments echo "" echo -n "Enter the assignment ID: " read assignment_id echo "" else assignment_id=$1 fi echo "🔄 Cloning student repos..." echo "" # Get count of repos repos=$(gh classroom assignment -a $assignment_id | /usr/bin/grep --color=never "Accepted" | cut -d " " -f 2 | strip_colors) echo "📚 Total repos: $repos" # We can only clone 30 repos at a time # Calculate the number of pages and round up per_page=30 echo "📃 Per page: $per_page" pages=$(ceil_divide $repos $per_page) echo "📄 Total pages: $pages" echo "" # Start at page 1 page=1 # Clone the repos until all pages are cloned while [ $page -le $pages ] do echo "🔍 Cloning page $page..." gh classroom clone student-repos -a $assignment_id --page $page page=$((page + 1)) echo "" done echo "" echo "🎉 All repos have been cloned" echo ""