TP5 : Gestion des erreurs et intégration Git dans VSCodium
Le but de ce TP est de comprendre les points suivants :
Exercice 1 : Error handling¶
Disclaimer
Nous allons nous concentrer sur l’écriture et le fonctionnement des gestionnaires d’erreurs dans cet exercice, sans nous préoccuper de la réorganisation du code, des fichiers et de la compilation automatique.
Créez un répertoire
error-handling
dansTP5
, puis ajoutez les fichiers suivants :level1
,level2
,level3
etplay.cpp
.Dans le fichier
play.cpp
, copiez le code suivant.
#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;
}
Que fait ce code ?
Nous allons simuler une partie du code d’un jeu où :
getLevelFromUser
récupère le niveau du jeu à partir de l’entrée utilisateur.getLevelData(int level)
obtient les ressources pour le niveaulevel
en ouvrant le fichierlevel1
par exemple silevel
vaut1
. Le contenu delevel1
est ensuite copié dansstring levelData
à l’aide de la fonctionassign
. Le fichier est ensuite fermé avecfile.close()
et nous retournonslevelData
.play
récupère le numéro du niveau et les ressources associées, puis simule le gameplay avec le messageYou are playing level 1.
(silevel
est 1). Les fichierslevel1
,level2
etlevel3
doivent simplement exister pour cette simulation.
Compilez et exécutez le code pour observer son comportement en fonction de l’entrée utilisateur.
Dans
getLevelFromUser
, implémentez un validateur d’entrée qui autorise seulement 3 tentatives, avec un entier compris entrefirstLevel
etlastLevel
(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.
Attrapez l’erreur dans
play
et simulez un retour au menu principal avec un message danscout
indiquantReturning to main menu.
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 codeEXIT_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¶
- 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.
q
q
Petit rappel : q
pour quitter le log.
- 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
.
- 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"
- Exécutez
git graph
.
show¶
- 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.
- Exécutez
git checkout <commit hash>
avec le commit hash d’un ancien commit. Votre commande pourrait ressembler àgit checkout abc0123
par exemple.
Observez l’état de votre (ancien) dépôt.
Revenez au sommet le plus récent (et quittez l’état detached HEAD) en exécutant
git checkout main
.
git checkout -
git checkout -
La commande git checkout -
permet de revenir au dernier sommet visité (avant le sommet courant où se trouve HEAD).
revert¶
Créez un fichier
revert.txt
contenant la ligneHello World!
et effectuez un commit avec ce changement.Ajoutez une deuxième ligne à
revert.txt
contenantHi!
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).
- Exécutez
git revert HEAD --no-edit
, puis vérifiez le contenu derevert.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.
- 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¶
Créez un fichier
reset.txt
contenantHello World!
et effectuez un commit de ce changement sans push.Ajoutez une deuxième ligne à
reset.txt
disantHi!
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
.
- 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.
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.
Cherchez et installez l’extension Git Graph de mhutchie.
log¶
- 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 tapezGit Graph
et choisissez l’option Git Graph: View Git Graph.
Command Palette
Vous pouvez effectuer toutes les actions dans VSCodium via la Command Palette, y compris toutes les commandes Git.
Le graphe affiché par l’extension Git Graph représente votre log, avec les hash des commits à droite.
show¶
Cliquez sur un sommet du graphe pour voir tous les détails du commit correspondant.
Cliquez sur un fichier modifié d’un commit pour voir les changements spécifiques (comme avec
git diff
).
status¶
- Vous pouvez voir le statut de votre dépôt dans Source Control dans la barre verticale à gauche.
add¶
Créez un nouveau fichier.
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¶
Pour ne plus suivre un changement (unstage), vous pouvez cliquer sur - à côté d’un changement suivi.
Pour supprimer les nouveaux changements non suivis dans un fichier, vous pouvez cliquer sur la flèche à gauche de +, indiquant Discard Changes.
commit¶
Dans la boîte Message en haut de Source Control, écrivez votre message de commit.
Cliquez sur le bouton Commit pour effectuer le commit.
push¶
- Cliquez sur Sync Changes pour pousser vos changements.
pull¶
Dans Source Control, juste au-dessus de la boîte de message, survolez avec votre souris ... pour afficher More Actions.
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¶
- 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¶
- 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
).
- 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¶
Dans Git Graph, faites un clic droit sur un message à côté d’un commit et choisissez l’option Checkout.
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¶
- Dans Git Graph, faites un clic droit sur le message du commit le plus récent et choisissez Revert.
reset¶
- 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).
Ne pas reset un commit synchronisé !
Rappel !
merge¶
Créez un fichier
merge.txt
vide et synchronisez ce fichier pour l’avoir dans vos deux dépôts.Localement, ajoutez
Hello World!
sur la première ligne du fichier.Sur GitLab, utilisez le Web IDE pour ajouter
Hi!
sur la première ligne du fichier.
Web IDE de GitLab
Le Web IDE de GitLab est basé sur VSCode/VSCodium, donc son intégration Git est très similaire mais sans extensions. Vous pouvez toujours utiliser la Command Palette.
Effectuez un fetch dans Git Graph et observez les branches divergentes.
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.
Ouvrez le fichier
merge.txt
.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.
- Terminez la synchronisation avec la version fusionnée.
git merge --abort
git merge --abort
git pull
fait la même chose que git fetch
suivi de git merge
. Lorsque vous oubliez de vérifier l’état des dépôts avant d’effectuer un pull ou une merge, vous pouvez utiliser git merge --abort
pour annuler la fusion.
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.