mercredi 20 juin 2018

Tricher avec les dates de commit de git

A l'origine, je voulais seulement vérifier que les informations user et email d'un repository git étaient présente.

En effet, sur la même machine, je peux être amené à travailler sur un repository personnel (le week-end ou le soir) ou sur un repository de l'entreprise qui m'emploie (en journée).
De là, j'ai découvert qu'on pouvait indiquer la date de commit et la date d'auteur à git... J'ai trouvé ça plus amusant de présenter un script qui modifie l'heure du commit (par defaut 19:00 + X).

Comment le mettre en place


Tout d'abord, dans le fichier .bash_aliases, je crée un alias qui surcharge la commande git :
alias git="~/bin/alias-git.sh"
Ensuite dans le répertoire ~/bin je crée le fichier alias-git.sh avec le contenu suivant :
#!/bin/sh

COUNTER_FILE="${HOME}/bin/.counter_date"

get_counter() {
  # Read counter file
  if [ -f "${COUNTER_FILE}" ]; then
    # Check if file is same day that today
    COUNTER_FILE_DATE=$(date -r "${COUNTER_FILE}" +"%Y%m%d")
    CURRENT_FILE_DATE=$(date +"%Y%m%d")

    if [ "${COUNTER_FILE_DATE}" -eq "${CURRENT_FILE_DATE}" ]; then
      COUNTER=$(cat "${COUNTER_FILE}")

      COUNTER=$(expr ${COUNTER} + 1)
    else
      # Reinit counter file
      COUNTER=0
      rm -f "${COUNTER_FILE}"
    fi
  else
    COUNTER=0
  fi
}

# Check only if git commit
if [ "$1" = "commit" ]; then
  if [ -d '.git' ]; then
    GIT_LOCAL_CONFIG=$(git config --list --local)

    IS_GITHUB_REPOSITORY=$(echo ${GIT_LOCAL_CONFIG} | grep 'github')
    IS_EMAIL=$(echo ${GIT_LOCAL_CONFIG}| grep 'user.email')
    IS_USERNAME=$(echo ${GIT_LOCAL_CONFIG} | grep 'user.name')

    if [ -n "${IS_GITHUB_REPOSITORY}" ]; then
      if [ -n "${IS_EMAIL}" ] && [ -n "${IS_USERNAME}" ]; then
        echo "** Changer happy hour ! **"

        get_counter

        # Take today, set hour to 19:00 and add minutes
        NEW_DATE=$(date -d "19:00 today + ${COUNTER} minutes" +'%Y-%m-%d %H:%M:%S')

        export GIT_COMMITTER_DATE="${NEW_DATE}"
        export GIT_AUTHOR_DATE="${NEW_DATE}"
      else
        echo "fatal: this is github repository without username and email set !" >&2

        exit 255
      fi
    fi
  else
    echo "fatal: not a git repository: .git" >&2

    exit 128
  fi
fi

git "$@"

RESULT=$?

unset GIT_COMMITTER_DATE
unset GIT_AUTHOR_DATE

# Counter set, save it only if git OK
if [ -n "${COUNTER}" ] && [ ${RESULT} -eq 0 ]; then
  echo "${COUNTER}" > "${COUNTER_FILE}"
fi

exit ${RESULT}

Comment ça fonctionne


Le script regarde la commande git qui est exécutée. S'il s'agit de la commande commit, elle fait quelques vérifications :
  • Est-on sur un repository Github ?
  • Est-ce le user et email est configuré ? Si ce n'est pas le cas, le script s'arrête en erreur.
  • Le script va lire un compteur.
  • La date de commit est le jour même mais avec l'heure de départ 19:00 à laquelle j'ajoute le compteur en tant que minute.

Cela signifie donc qu'à chaque commit sur un repository Github, le compteur est incrémenté de 1. Les commits seront horodatés : 19:00, 19:01, 19:02...

Ce que j'ai appris


Ce script m'aura permis d'apprendre de nouvelles choses sur git et comment manipuler/calculer les dates/heures en shell comme je ne l'avais jamais fait.
J'ai pu découvrir qu'il y avait 2 dates pour un commit et qu'on pouvait les spécifier avec GIT_COMMITTER_DATE et GIT_AUTHOR_DATE.

Aucun commentaire:

Enregistrer un commentaire