#!/usr/bin/bash repos="/tmp/repos-$(cat /dev/urandom | base64 | tr -d '=+/' | head -c 8)" mkdir -p "$repos" tmp_portfolio="/tmp/portfolio-$(cat /dev/urandom | base64 | tr -d '=+/' | head -c 8)" function safely_remove_tmp_repos() { if [ "$repos" ] && [ -d "$repos" ]; then if [ "$(find -name .git -type d | wc -l)" -eq 0 ]; then echo "Warning: No git repositories found in '$repos'. Not deleting to prevent data loss." rmdir "$repos" 2>/dev/null return fi rm -rf "$repos" fi rm -r "$tmp_portfolio" } function cleanup() { safely_remove_tmp_repos } directory="$1" script_dir="$(dirname "$0")" if [ ! "$directory" ]; then echo "Usage: $0 " exit 1 fi if ! command -v pass >/dev/null 2>&1; then echo "Error: 'pass' command not found. Please install 'pass' and set up your Gitea API token." exit 1 fi if ! command -v jq >/dev/null 2>&1; then echo "Error: 'jq' command not found. Please install 'jq' to process JSON data." exit 1 fi if ! command -v Rscript >/dev/null 2>&1; then echo "Error: 'Rscript' command not found. Please install R to generate language distribution plots." exit 1 fi if ! command -v quarto >/dev/null 2>&1; then echo "Error: 'quarto' command not found. Please install Quarto to render project pages." exit 1 fi trap cleanup EXIT GIT_URL='https://git.seanhealy.ie' GIT_USER=sean GITHUB_USER=seanhly GITLAB_USER=seanhly CODEBERG_USER=seanhly TOKEN="$(pass gitea-api-token)" EXCLUDE_LANGUAGES=(Makefile TeX) function my_curl() { curl -s "$GIT_URL/api/v1/users/$GIT_USER/repos" \ -H 'Accept: application/json' \ -H "Authorization: $TOKEN" | jq -c ' sort_by(.updated_at) | reverse | .[] | select(.private == false) | select(.empty == false) | [ .name, .description, .languages_url, .website, .updated_at, .avatar_url, .licenses ]' } mkdir -p "$tmp_portfolio" portfolio_index="" while read project; do i=0 name=$(jq -r ".[$i]" <<< "$project"); i=$((i + 1)) echo "Processing $name..." description=$(jq -r ".[$i]" <<< "$project"); i=$((i + 1)) languages_url=$(jq -r ".[$i]" <<< "$project"); i=$((i + 1)) languages="$(curl -s "$languages_url" -H "Authorization: $TOKEN" | jq -r 'to_entries[]|[.key,.value]|@tsv')" total_bytes=$(echo "$languages" | awk '{sum += $2} END {print sum}') languages_percentages=$(echo "$languages" | awk -v total="$total_bytes" '{print $2 / total"\t"$1}' | sort -n -r ) git clone --depth 1 -b main --single-branch "$GIT_URL/$GIT_USER/$name" "$repos/$name" 2>/dev/null >/dev/null echo $'Percentage\tLanguages' > /tmp/languages.tsv echo "$languages_percentages" >> /tmp/languages.tsv (cat > /tmp/plot.R) < "$name.qmd") <

$name

Avatar

$description

    EOF )" (cd "$repos/$name" && quarto render "$name.qmd" -o "$name.html" >/dev/null 2>/dev/null && mv "$name.html" "$tmp_portfolio/$name.html" ) while read -r language; do portfolio_index+="
  • $language
  • " done <<< "$language_list" portfolio_index+="$( cat <

    Last Updated: $updated_at

    Licenses: $licenses

EOF )" done < <(my_curl) portfolio_index="$( cat <Projects
$portfolio_index
EOF )" echo "$portfolio_index" > "$tmp_portfolio/index.html" if [ -d "$directory" ]; then if [ "$(du -sb "$directory" | cut -f1)" -gt $((1024 * 1024 * 400)) ]; then echo "Error: Directory '$directory' contains more than 400MB of data. Exiting to prevent data loss." exit 1 fi else mkdir -p "$directory" fi rsync -a "$tmp_portfolio/" "$directory/" safely_remove_tmp_repos