Intégration Git (Source Control)¶
Maintenant, nous allons voir comment Git est intégré dans l’interface de VSCodium. Les IDEs avec intégration Git fonctionnent souvent de façon similaire.
init¶
Votre dépôt est déjà un dépôt Git, donc il n’y a pas besoin de l’initialiser.
Pour initialiser un nouveau dépôt, il suffit de cliquer sur l’onglet Source Control dans la barre latérale à gauche, puis sur Initialize Repository.
clone¶
Vous n’avez pas besoin de recloner votre dépôt.
Pour cloner un dépôt, vous pouvez sélectionner View > Command Palette (raccourci F1 ou Ctrl + Shift + P), puis taper clone, choisir l’option Git: Clone et entrer l’adresse du dépôt (avec le PAT par exemple).
Command Palette
Vous pouvez effectuer toutes les actions dans VSCodium via la Command Palette, y compris toutes les commandes Git.
status¶
Vous pouvez voir le statut de votre dépôt dans Source Control, dans Explorer, dans l’éditeur, ainsi que dans l’onglet Source Control.
Par exemple :
Quand vous ajoutez un nouveau fichier, un U apparaît à côté de son nom pour indiquer Untracked.
Quand vous modifiez un fichier qui a déjà été suivi (
git add), un M apparaît à côté de son nom pour indiquer Modified.Les changements qui ne sont pas encore suivis apparaissent dans la section Changes de l’onglet Source Control de la barre latérale à gauche.
add¶
Vous pouvez ajouter un changement de Changes à la Staging Area dans Source Control en cliquant sur + à côté du changement, ou ajouter tous les changements en cliquant sur + à côté de Changes.
rm¶
Vous pouvez supprimer un fichier dans Explorer, puis ajouter ce changement depuis Changes dans Source Control.
restore¶
Pour ne plus suivre un changement (Unstage Changes), 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 du +, indiquant Discard Changes.
commit¶
Dans la boîte Message en haut de Source Control, vous pouvez écrire votre message de commit et cliquer sur le bouton Commit pour effectuer le commit.
log¶
Cherchez et installez l’extension Git Graph de mhutchie.
Ouvrez Git Graph en cliquant sur le bouton Git Graph en bas de votre écran, ou en tapant
Git Graphdans la Command Palette puis en choisissant 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. Une version de ce graphe peut être affichée dans Source Control (si vous ne la voyez pas, cliquez sur les trois points en haut à côté de SOURCE CONTROL puis sur Graph), mais l’extension permet d’effectuer davantage de commandes Git via l’interface.
config && remote¶
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 et voir les Remote Repos associés.
fetch¶
Vous pouvez cliquer sur le bouton Fetch from Remote(s) parmi les boutons à droite de Git Graph, ou sur Fetch From All Remotes à côté du graphe de Source Control.
Parfois, il est utile de faire un Refresh pour mettre à jour la vue du graphe si des changements ont eu lieu récemment.
push¶
Vous pouvez cliquer sur le bouton Push parmi les boutons à droite du graphe de Source Control.
pull¶
Vous pouvez cliquer sur le bouton Pull parmi les boutons à droite du graphe de Source Control.
show && diff¶
Vous pouvez cliquer sur un sommet du graphe (dans Git Graph ou Source Control) pour voir tous les détails du commit correspondant.
Vous pouvez cliquer sur un fichier modifié d’un commit pour voir les changements spécifiques (comme avec git diff).
stash¶
Vous pouvez cliquer sur le bouton More Actions... (trois petits points) qui apparaît lorsque vous passez la souris au-dessus de CHANGES, puis choisir Stash. Vous pouvez également l’utiliser pour d’autres commandes que nous avons vues précédemment.
checkout && branch¶
Dans l’extension Git Graph, vous pouvez faire un clic droit sur un message à côté d’un commit et choisir l’option Checkout ou Checkout (Detached) dans le graphe de Source Control.
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) dans l’extension Git Graph.
Vous pouvez créer des branches en faisant un clic droit sur le commit à partir duquel vous souhaitez créer la branche.
Vous pouvez voir toutes les branches ou une branche particulière avec l’option Branches en haut de l’extension Git Graph.
revert && reset¶
Dans l’extension Git Graph, vous pouvez faire un clic droit sur le message d’un commit et choisir Revert... ou Reset current branch to this Commit....
Ne pas reset un commit synchronisé !
Rappel !
merge¶
Créez un répertoire
TP11/et un fichierTP11/merge.txtvide, puis 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 ; son intégration Git est donc très similaire, mais sans extensions. Vous pouvez toujours utiliser la Command Palette.
Effectuez un fetch 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 en 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 --abortgit 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 un merge, vous pouvez utiliser git merge --abort pour annuler la fusion.
Cette option de git merge n’est pas disponible dans l’interface de VSCodium ; il faut donc utiliser le terminal.
Supprimez
merge.txtet synchronisez vos dépôts.
Run and Debug¶
Pourquoi utiliser un debugger ?
Lorsque nous cherchons à comprendre une erreur dans notre code, nous ajoutons souvent des breakpoints (points d’arrêt) manuellement dans le code pour :
afficher des messages,
consulter les valeurs des variables,
interrompre le programme afin de comprendre son fonctionnement.
Le problème avec ces breakpoints manuels est que le code est pollué par du code qui ne contribue pas à l’exécution du programme (et que nous devons ensuite supprimer), et qui peut potentiellement modifier son comportement. De plus, il n’est pas facile de simuler une exécution étape par étape du programme pour en comprendre le fonctionnement.
Un debugger permet de mettre en place ces points d’arrêt et d’observer l’exécution étape par étape, sans polluer le code.
Créez le répertoire
TP11/avec les fichiers et les contenus suivants.
TP11/
├── include/
│ └── cesar-encoding.h
├── source/
│ ├── cesar-encoding.cpp
│ └── main.cpp
├── compile_flags.txt
└── makefile#ifndef CESAR_ENCODING_H
#define CESAR_ENCODING_H
#include <string>
class CesarEncoding {
public:
std::string encode(const std::string& message);
private:
int mKey = 3;
char encodeLetter(char letter);
};
#endif#include <string>
#include "cesar-encoding.h"
std::string CesarEncoding::encode(const std::string& message) {
std::string encodedMessage = "";
for (char letter : message) {
encodedMessage += encodeLetter(letter);
}
return encodedMessage;
}
char CesarEncoding::encodeLetter(char letter) {
letter += mKey;
return letter;
}#include <iostream>
#include "cesar-encoding.h"
int main() {
std::string message = "A message to encode";
CesarEncoding encoding;
std::cout << encoding.encode(message) << std::endl;
return 0;
}-xc++
-std=c++17
-IincludeEXECUTABLE = cesar-encoding
CXX = g++
CXXFLAGS = -std=c++17 -Iinclude
DEBUG_FLAGS = -g -O0
SOURCES = $(wildcard source/*.cpp)
OBJECTS = $(patsubst source/%.cpp,build/objects/%.o,$(SOURCES))
DEPENDENCIES = $(patsubst source/%.cpp,build/dependencies/%.d,$(SOURCES))
all: build/binaries/$(EXECUTABLE)
debug: clean
$(MAKE) all CXXFLAGS="$(CXXFLAGS) $(DEBUG_FLAGS)"
build:
mkdir -p build/objects build/dependencies build/binaries
build/binaries/$(EXECUTABLE): $(OBJECTS) | build
$(CXX) $(OBJECTS) -o build/binaries/$(EXECUTABLE)
build/objects/%.o: source/%.cpp | build
$(CXX) $(CXXFLAGS) -MMD -MF build/dependencies/$*.d -c $< -o $@
clean:
rm -rf build
run:
./build/binaries/$(EXECUTABLE)
.PHONY: all debug build clean run
-include $(DEPENDENCIES)Pour comprendre ce code, nous allons utiliser le mode Run and Debug de VSCodium.
make debug
make debugNous avons repris le même makefile que dans le TP7 (sans tests) et nous avons ajouté les lignes suivantes :
DEBUG_FLAGS = -g -O0
debug: clean
$(MAKE) all CXXFLAGS="$(CXXFLAGS) $(DEBUG_FLAGS)"Les options -g et -O0 sont utiles pour le debugger :
-gpermet de compiler le binaire avec des informations supplémentaires, comme les numéros de ligne, les noms des variables, la structure des classes, des fonctions, etc.Les compilateurs cherchent à optimiser le code, ce qui fait que la structure du code réellement transformé en binaire peut être différente de celle du code source. L’option
-O0désactive les optimisations afin de conserver un comportement fidèle au code source.
Nous avons également ajouté la cible debug, qui commence par exécuter clean, car il est nécessaire de recompiler l’ensemble du code avec les DEBUG_FLAGS. Elle exécute ensuite make all en ajoutant DEBUG_FLAGS aux options de compilation CXXFLAGS.
Créez une tâche “Debug” dans
.vscode/tasks.jsonqui prend comme inputtpWithDebug, contenant pour le moment uniquement["TP11"].Installez l’extension CodeLLDB de vadimcn.
CodeLLDB
Cette extension est un debugger principalement utilisé pour le C++ et les langages utilisant des compilateurs similaires.
Créez le fichier
.vscode/launch.json(qui sera utilisé par l’extension) avec le contenu suivant.
{
"version": "0.2.0",
"configurations": [
{
"name": "TP11",
"type": "lldb",
"request": "launch",
"program": "${workspaceRoot}/TP11/build/binaries/cesar-encoding",
"args": [],
"cwd": "${workspaceRoot}/TP11",
"preLaunchTask": "Debug",
"terminal": "integrated"
}
]
}Run and Debug
Dans l’onglet Run and Debug de la barre latérale à gauche, vous pouvez maintenant exécuter le code du TP11 en appuyant sur le bouton vert TP11. Ce bouton va lancer la tâche Debug, qui exécutera make debug, puis lancera le binaire cesar-encoding avec les informations de débogage.
Créez un breakpoint à la ligne 7 de
cesar-encoding.cpp(encodedMessage += encodeLetter(letter);) en cliquant sur le point rouge qui apparaît lorsque vous passez la souris au-dessus du numéro de la ligne.Cliquez sur le bouton vert TP11 à côté de RUN AND DEBUG (ou appuyez sur le raccourci F5) et choisissez TP11 lorsque la tâche Debug est lancée.
Vous verrez apparaître à gauche les différentes VARIABLES : vous avez alors accès à l’intérieur de la fonction encode. Seule la rubrique Local nous intéresse dans cet exercice.
Vous pouvez connaître le type de ces variables en passant la souris au-dessus du nom de la variable.
Navigation dans le Debugger
L’exécution du programme est maintenant en pause ; vous pouvez contrôler cette exécution grâce à la barre de debug :
Le bouton Continue (F5) permet de poursuivre l’exécution, qui se remettra en pause lorsqu’elle atteindra de nouveau un breakpoint.
Le bouton Step Over (F10) permet d’exécuter le programme instruction par instruction.
Le bouton Step Into (F11) permet d’entrer dans l’exécution ligne par ligne des (sous-)fonctions appelées (contrairement à Step Over, qui exécute
encodeLetter(letter)comme une seule instruction).Le bouton Step Out (Shift + F11) permet de sortir de la sous-fonction dans laquelle vous êtes entré avec Step Into.
Le bouton Restart (Ctrl + Shift + F5) permet de recommencer l’exécution.
Le bouton Stop (Shift + F5) permet d’arrêter l’exécution.
Répondez aux questions du Quiz en utilisant ces boutons de navigation.
Sur votre gauche, vous pouvez voir une catégorie WATCH. Ici, nous pouvons ajouter des expressions calculées à partir des variables disponibles dans VARIABLES.
Ajoutez l’expression
letter+mKeydans WATCH grâce au bouton+(Add Expression), puis répondez aux questions du Quiz en utilisant cette expression.
Breakpoints conditionnels
Il est possible de rendre les breakpoints conditionnels, car nous n’avons pas toujours envie d’appuyer sur Continue jusqu’à ce que l’exécution atteigne le moment qui nous intéresse.
Faites un clic droit sur le breakpoint puis sélectionnez Edit Breakpoint.... Un menu déroulant (drop-down) propose plusieurs options :
Expression permet d’ajouter une condition. L’exécution se mettra en pause à ce breakpoint uniquement si la condition est vraie.
Hit Count permet d’activer le breakpoint uniquement après un certain nombre de passages à cet endroit.
Log Message permet d’afficher un message dans la DEBUG CONSOLE à chaque passage par ce point (appelé alors logpoint). Contrairement à un breakpoint, l’exécution ne s’arrête pas. Cela fonctionne comme un
print, que vous avez l’habitude d’utiliser pour déboguer. Vous pouvez également afficher des valeurs calculées grâce à{}: par exemple,letter+mKey = {letter+mKey}affichera “letter+mKey = <valeur>” à chaque passage.Wait for Breakpoint permet d’activer un breakpoint uniquement après qu’un autre breakpoint a été atteint.
Utilisez Expression, Hit Count et Log Message pour répondre aux questions du Quiz.
Autres informations utiles sur les breakpoints
Vous pouvez bien sûr combiner les conditions sur les breakpoints pour déboguer votre programme. Quelques détails supplémentaires :
Il est possible de faire un clic droit dans le code pour ajouter un inline breakpoint, plus précis qu’un breakpoint sur une ligne.
Vous pouvez cliquer droit sur un breakpoint pour le désactiver (Disable Breakpoint). Vous pouvez aussi gérer cela dans la section BREAKPOINTS de la barre latérale gauche en cochant ou décochant les breakpoints (leur emplacement est indiqué à droite).
Finalement, avez-vous compris ce que fait ce code ?
letter est un caractère, mais on peut lui ajouter un entier car il correspond à une position dans la table ASCII. Ainsi, il est également possible de convertir un entier en caractère (s’il correspond à une position valide dans cette table).
Utilisation des breakpoints dans un debugger.