diff --git a/git-portfolio b/git-portfolio index ec8d8b3..cf5f101 100755 --- a/git-portfolio +++ b/git-portfolio @@ -1,23 +1,171 @@ #!/usr/bin/bash +function cleanup() { + rm -rf repos tmp-portfolio +} +directory="$1" +if [ ! "$directory" ]; then + echo "Usage: $0 " + 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
-

Projects

+ $portfolio_index +
EOF -curl "$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, - .html_url, - .clone_url, - .website, - .updated_at, - .avatar_url, - .licenses - ]' | -while read project; do - i=0 - name=$(jq -r ".[$i]" <<< "$project"); i=$((i + 1)) - 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, $1}' | - sort -n -r | - cut -d' ' -f2 | grep -v -F -w -f <(printf "%s\n" "${EXCLUDE_LANGUAGES[@]}") - ) - html_url=$(jq -r ".[$i]" <<< "$project"); i=$((i + 1)) - clone_url=$(jq -r ".[$i]" <<< "$project"); i=$((i + 1)) - website=$(jq -r ".[$i]" <<< "$project"); i=$((i + 1)) - updated_at=$(jq -r ".[$i]" <<< "$project"); i=$((i + 1)) - updated_at=$(date -d "$updated_at" +"%B %d, %Y") - avatar_url=$(jq -r ".[$i]" <<< "$project"); i=$((i + 1)) - licenses=$(jq -r '.['$i'] | join(", ")' <<< "$project"); i=$((i + 1)) - cat < - -

$name

-
- - Avatar - -

$description

-
    -EOF - while read -r language; do - echo "
  • $language
  • " - done <<< "$languages_percentages" - cat < -
    git clone $clone_url
    -

    Last Updated: $updated_at

    -

    Licenses: $licenses

    - -EOF -done -echo '' +)" +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/" +rm -rf repos +rm -r tmp-portfolio diff --git a/project-style.css b/project-style.css new file mode 100644 index 0000000..05b81b4 --- /dev/null +++ b/project-style.css @@ -0,0 +1,30 @@ +#quarto-document-content > pre:nth-child(-n+8) { + background: wheat; + border: 3px dashed pink; + padding: 5px; +} +#quarto-document-content { + text-align: center; +} +#quarto-document-content>* { + text-align: initial; +} +#quarto-document-content > ul:nth-child(-n+8) { + display: inline-block; + vertical-align: center; + list-style: none; +} +#quarto-document-content > div.quarto-figure:nth-child(-n+8) { + width: 300px; + display: inline-block; + margin: 0; +} +#quarto-document-content > div.quarto-figure:nth-child(-n+8) figcaption { + display: none; +} +#quarto-document-content > p:nth-child(-n+3) { + display: inline-block; +} +#quarto-document-content > p:first-child { + display: block !important; +}