#!/bin/bash

token=$(</etc/github_token)

dest="/mnt/github/"

function rcurl {
  i=10
  while ! curl --fail --silent --show-error "$@" && [ "$i" != 0 ]
  do
    sleep 6
    i="$(expr "$i" - 1)"
  done
  return $?
}

function inlist {
  v="$(printf '%s\n' "$2" | while IFS= read -r entry
  do
    if [ "$(basename "$entry")" = "$1" ]
    then
      echo 1
      break
    fi
  done)"
  [ ! -z "$v" ]
  return $?
}

repos="$(rcurl -H 'Authorization: token '"$token" --url 'https://api.github.com/user/repos')"
if [ "$?" != 0 ]
then
  echo "Failed to request github repos" >&2
  exit 1
fi

repos="$(printf "%s" "$repos" | grep '"ssh_url": ' | grep -o '[^"]*\.git')"

set -e
cd "$dest"
set +e

printf '%s\n' "$repos" | while IFS= read -r repo
do
  name="$(basename "$repo")"
  echo "Updating $name from $repo";
  if [ ! -e "$name" ]
  then
    git clone --mirror "$repo" "$name"
  else
    bash -e -c "cd $name; git remote update"
  fi
done

for dir in */
do
  if ! inlist "$(basename "$dir")" "$repos"
  then
    echo "Removing $(basename "$dir")"
    rm -r "$dir"
  fi
done

exit 0
