Created
August 17, 2024 14:40
-
-
Save drblue/f7055d348846212fecc654e0b0fb2288 to your computer and use it in GitHub Desktop.
Script for cloning all student repos (including support for pagination) from a GitHub Classroom-repo.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 "" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment