Skip to article frontmatterSkip to article content

TP5 : Gestion des erreurs et intégration Git dans VSCodium

IUT d'Orsay, Université Paris-Saclay

Le but de ce TP est de comprendre les points suivants :

Exercice 1 : Error handling

  1. Créez un répertoire error-handling dans TP5, puis ajoutez les fichiers suivants : level1, level2, level3 et play.cpp.

  2. Dans le fichier play.cpp, copiez le code suivant.

play.cpp
#include <iostream>
#include <string>
#include <fstream>

int getLevelFromUser() {
    int userInput;
    std::cout << "Enter a game level: ";
    std::cin >> userInput;
    return userInput;
}

std::string getLevelData(int level) {
    std::string filepath = "level" + std::to_string(level);
    std::ifstream file(filepath);
    std::string levelData;
    levelData.assign((std::istreambuf_iterator<char>(file)),std::istreambuf_iterator<char>());
    file.close();
    return levelData;
}

void play() {
    int level = getLevelFromUser();
    getLevelData(level);
    std::cout << "You are playing level " + std::to_string(level) + ".\n";
}

int main() {
    play();
    return 0;
}
  1. Compilez et exécutez le code pour observer son comportement en fonction de l’entrée utilisateur.

  2. Dans getLevelFromUser, implémentez un validateur d’entrée qui autorise seulement 3 tentatives, avec un entier compris entre firstLevel et lastLevel (par exemple, de 1 à 5). Après 3 tentatives échouées, la fonction doit lancer une exception.

Nous ne gérerons pas cette erreur tout de suite car nous souhaitons, dans ce cas, revenir au menu principal du jeu, ce qui ne doit pas être accessible depuis getLevelFromUser. La gestion des erreurs sans interrompre le programme est toujours préférable à l’arrêt du programme avec un code d’erreur.

  1. Attrapez l’erreur dans play et simulez un retour au menu principal avec un message dans cout indiquant Returning to main menu.

  2. Dans getLevelData, nous allons vérifier si le fichier correspondant au niveau existe. S’il n’existe pas (if(!file) {...}), nous retournons le message "Resources not found for level <numéro du niveau>." et arrêtons le programme avec le code EXIT_FAILURE.

Il s’agit d’une gestion d’erreur locale, évitant de lancer l’exception pour la gérer ailleurs, ce qui simplifie la logique du code.

Exercice 2 : Intégration Git

Créez un répertoire git-integration.

Git sans IDE

Tout d’abord, nous allons apprendre à utiliser les commandes suivantes dans le terminal.

log

  1. Exécutez git log --oneline pour afficher l’historique du dépôt où chaque commit correspond à une ligne commençant par un code, appelé commit hash, permettant d’identifier le commit, suivi du message du commit.
  1. Exécutez git log --oneline --graph pour voir le graphe (dessiné en ASCII dans le terminal) associé à ces commits, où chaque sommet est représenté par une étoile.

Votre graphe devrait être plutôt linéaire (un chemin), sauf aux endroits où vous avez eu des conflits, créant ainsi des branches divergentes.

alias

Lorsque vous apprendrez à gérer plusieurs branches dans votre dépôt, vous pourrez ajouter les options --decorate (pour afficher le nom de la branche à côté des commits) et --all (pour voir toutes les branches) à la commande git log --oneline --graph.

  1. Définissez la commande git graph en tant qu’alias de la manière suivante :
git config --global alias.graph "log --oneline --graph --decorate --all"
  1. Exécutez git graph.

show

  1. Vous pouvez voir tous les détails d’un commit particulier avec git show <commit hash>.

checkout

Nous pouvons naviguer à travers les différents sommets de ce graphe, ce qui signifie que nous pouvons revenir à différents états de notre dépôt, enregistrés par les commits.

  1. Exécutez git checkout <commit hash> avec le commit hash d’un ancien commit. Votre commande pourrait ressembler à git checkout abc0123 par exemple.
  1. Observez l’état de votre (ancien) dépôt.

  2. Revenez au sommet le plus récent (et quittez l’état detached HEAD) en exécutant git checkout main.

revert

  1. Créez un fichier revert.txt contenant la ligne Hello World! et effectuez un commit avec ce changement.

  2. Ajoutez une deuxième ligne à revert.txt contenant Hi! et effectuez un commit avec ce changement.

Imaginons que la deuxième ligne ajoutée soit une erreur. Nous allons revert ce commit tout en conservant l’historique, car il se peut que ce commit erroné contienne des informations utiles ou qu’il soit déjà synchronisé avec le dépôt distant (si vous avez effectué un push).

  1. Exécutez git revert HEAD --no-edit, puis vérifiez le contenu de revert.txt.

Vous constaterez qu’un nouveau commit a été créé avec le message par défaut Revert "<message du commit annulé>". Vous auriez aussi pu utiliser git revert HEAD -m "<message>" pour personnaliser le message au lieu d’utiliser le message par défaut.

Nous pouvons également effectuer un revert de plusieurs commits. Chaque reverted commit sera accompagné d’un commit de revert.

  1. Exécutez git revert HEAD~3..HEAD --no-edit pour revert les trois derniers commits.

Vous pouvez omettre l’option --no-edit pour ajouter un message pour chaque reverted commit. Vous auriez aussi pu utiliser git revert -n HEAD~3..HEAD, ce qui ne crée pas automatiquement plusieurs commits, puis exécuter git commit -m "<message>" pour créer un seul commit (au lieu de trois) avec le message que vous souhaitez.

reset

  1. Créez un fichier reset.txt contenant Hello World! et effectuez un commit de ce changement sans push.

  2. Ajoutez une deuxième ligne à reset.txt disant Hi! et effectuez un commit de ce changement sans push.

La commande git reset fonctionne de manière similaire à git revert, mais elle supprime un commit A de l’historique au lieu de créer un commit supplémentaire pour annuler A.

  1. Exécutez git reset HEAD~1 pour annuler le dernier commit.

Vous pouvez également exécuter git reset HEAD~<nombre> pour annuler les <nombre> derniers commits.

Git avec IDE

Vous pouvez maintenant ouvrir votre dépôt Git avec VSCodium.
Si VSCodium vous demande si vous souhaitez effectuer régulièrement un git fetch, vous pouvez répondre oui. Si vous avez répondu non, ce n’est pas grave, nous expliquerons ce que fait git fetch ci-dessous.

  1. Dans la barre verticale à gauche, vous trouverez Extensions. Si vous voyez l’erreur Error while fetching extensions. XHR failed sous Debian à l’IUT, consultez le soutien technique sur VSCodium pour configurer le proxy.

  2. Cherchez et installez l’extension Git Graph de mhutchie.

log

  1. Ouvrez Git Graph en cliquant sur le bouton Git Graph en bas de votre écran ou en sélectionnant View > Command Palette (raccourci F1 ou Ctrl + Shift + P), puis tapez Git Graph et choisissez l’option Git Graph: View Git Graph.

Le graphe affiché par l’extension Git Graph représente votre log, avec les hash des commits à droite.

show

  1. Cliquez sur un sommet du graphe pour voir tous les détails du commit correspondant.

  2. Cliquez sur un fichier modifié d’un commit pour voir les changements spécifiques (comme avec git diff).

status

  1. Vous pouvez voir le statut de votre dépôt dans Source Control dans la barre verticale à gauche.

add

  1. Créez un nouveau fichier.

  2. Vous pouvez ajouter le nouveau changement dans Source Control en cliquant sur + à côté du changement ou ajouter tous les changements en cliquant sur + en haut.

restore

  1. Pour ne plus suivre un changement (unstage), vous pouvez cliquer sur - à côté d’un changement suivi.

  2. Pour supprimer les nouveaux changements non suivis dans un fichier, vous pouvez cliquer sur la flèche à gauche de +, indiquant Discard Changes.

commit

  1. Dans la boîte Message en haut de Source Control, écrivez votre message de commit.

  2. Cliquez sur le bouton Commit pour effectuer le commit.

push

  1. Cliquez sur Sync Changes pour pousser vos changements.

pull

  1. Dans Source Control, juste au-dessus de la boîte de message, survolez avec votre souris ... pour afficher More Actions.

  2. Dans ce menu déroulant, vous trouverez Pull parmi d’autres commandes Git.

Vous pouvez aussi utiliser la Command Palette (F1), tapez pull et sélectionnez l’option Git: Pull.

clone

  1. De manière similaire à pull, vous pouvez cloner un dépôt de la même façon en entrant l’adresse du dépôt (avec le PAT).

config

  1. Dans les boutons à droite de Git Graph, vous trouverez un bouton Repository Settings où vous pourrez configurer les paramètres de votre dépôt.

fetch/remote update

git fetch fait (presque) la même chose que git remote update, mais permet d’être plus précis avec git fetch <branche> si vous souhaitez récupérer les informations d’une branche spécifique.

Par défaut, git fetch récupère uniquement les informations du dépôt distant nommé origin. Dans le futur, si vous contribuez à des projets existants développés par d’autres personnes, vous devrez probablement effectuer des forks, qui sont des copies de ces projets avec vos propres dépôts distants et locaux. Dans ce cas, il est utile de récupérer les changements de plusieurs dépôts distants. Cela se fait avec git remote update (ou de manière équivalente, git fetch --all).

  1. Cliquez sur le bouton Fetch from Remote(s) parmi les boutons à droite de Git Graph.

Parfois, il est utile de faire un Refresh pour mettre à jour la vue du graphe si des changements ont eu lieu récemment.

checkout

  1. Dans Git Graph, faites un clic droit sur un message à côté d’un commit et choisissez l’option Checkout.

  2. Revenez au commit le plus récent en faisant un clic droit sur l’icône de la branche main (à côté du commit le plus récent) et choisissez l’option Checkout Branch.

revert

  1. Dans Git Graph, faites un clic droit sur le message du commit le plus récent et choisissez Revert.

reset

  1. Dans Git Graph, faites un clic droit sur le message d’un ancien commit et choisissez Reset current branch to this Commit..., puis sélectionnez l’option Soft, Mixed ou Hard (préférablement Soft ou Mixed).

merge

  1. Créez un fichier merge.txt vide et synchronisez ce fichier pour l’avoir dans vos deux dépôts.

  2. Localement, ajoutez Hello World! sur la première ligne du fichier.

  3. Sur GitLab, utilisez le Web IDE pour ajouter Hi! sur la première ligne du fichier.

  1. Effectuez un fetch dans Git Graph et observez les branches divergentes.

  2. Faites un clic droit sur le message du commit de la branche du dépôt distant et choisissez Merge into current branch... avec l’option No commit.

  3. Ouvrez le fichier merge.txt.

  4. Vous pouvez choisir une des options proposées au-dessus du conflit, ou ne pas en choisir et résoudre le conflit vous-même avec un texte qui remplace les deux autres comme Bye!.

Vous pouvez également choisir l’option Open in merge editor qui s’affiche en bas à droite. Cela ouvrira trois écrans : deux avec les versions du fichier ayant un conflit et un troisième avec la version finale que vous écrirez.

  1. Terminez la synchronisation avec la version fusionnée.

Retournez aux objectifs et cochez les points que vous avez maîtrisés. Reprenez les points que vous n’avez pas encore bien compris. Appelez votre encadrant si besoin.