Construire l'arborescence d'une enquête depuis le système de fichiers. #11

Closed
opened 2026-07-18 08:26:15 +02:00 by fy59 · 0 comments
Owner

Titre

Construire l'arborescence d'une enquête depuis le système de fichiers.


Objectif

Créer le module InvestigationTreeBuilder.

Ce module doit parcourir récursivement le dossier racine d'une enquête et
construire un InvestigationTreeModel représentant son contenu.


Responsabilités

Le module InvestigationTreeBuilder doit :

  • recevoir le chemin racine d'une enquête ;
  • vérifier que ce chemin désigne un dossier existant ;
  • créer le nœud racine ;
  • parcourir récursivement les dossiers ;
  • créer un InvestigationNode pour chaque dossier ;
  • créer un InvestigationNode pour chaque fichier ;
  • assembler les relations parent/enfants ;
  • retourner un InvestigationTreeModel complet ;
  • nettoyer toutes les ressources en cas d'erreur.

Hors périmètre

Ce ticket ne doit pas :

  • afficher l'arborescence avec GTK ;
  • modifier le système de fichiers ;
  • créer ou supprimer des fichiers ;
  • trier les éléments ;
  • filtrer les fichiers cachés ;
  • surveiller les changements du disque ;
  • suivre les liens symboliques ;
  • communiquer avec SQLite.

Architecture

Investigation
        │
        ▼
InvestigationTreeBuilder
        │
        ▼
InvestigationTreeModel
        │
        ▼
InvestigationNode

Le module appartient à la couche core.

Il peut utiliser GLib et GIO, mais ne doit jamais dépendre de GTK.


Fichiers concernés

include/core/investigation_tree_builder.h
src/core/investigation_tree_builder.c

Les tests seront placés dans :

tests/test_investigation_tree_builder.c

Interface publique attendue

InvestigationTreeModel *investigation_tree_builder_build(
    const char *root_path
);

Principe de propriété

En cas de succès, la fonction retourne un nouveau
InvestigationTreeModel.

Le code appelant devient propriétaire du modèle retourné et doit le libérer
avec :

investigation_tree_model_free(tree_model);

En cas d'échec, la fonction retourne NULL et doit avoir libéré toutes les
ressources créées pendant la construction.


Comportement attendu

À partir de :

Enquete_Test/
├── 00_BaseDeDonnees/
│   └── Enquete.sqlite
├── 01_Preuves_Originales/
│   ├── Captures_Ecran/
│   └── Emails/
└── README.md

le module doit construire en mémoire :

Enquete_Test
├── 00_BaseDeDonnees
│   └── Enquete.sqlite
├── 01_Preuves_Originales
│   ├── Captures_Ecran
│   └── Emails
└── README.md

Gestion des liens symboliques

Les liens symboliques ne sont pas suivis.

Cette règle évite :

  • les boucles récursives ;
  • la sortie involontaire du dossier d'enquête ;
  • l'analyse de fichiers extérieurs à l'enquête.

Leur prise en charge éventuelle fera l'objet d'un ticket distinct.


Dépendances

  • C17 ;
  • GLib ;
  • GIO.

Aucune dépendance GTK ou SQLite.


Contraintes techniques

  • aucune variable globale ;
  • aucune modification du système de fichiers ;
  • parcours récursif ;
  • utilisation de GFile et GFileEnumerator ;
  • libération correcte des GObject avec g_object_unref() ;
  • respect de la règle « le propriétaire détruit » ;
  • documentation Doxygen ;
  • compilation sans warning ;
  • aucune fuite mémoire.

Cas à gérer

  • chemin valide ;
  • chemin relatif ;
  • chemin NULL ;
  • chemin vide ;
  • chemin inexistant ;
  • chemin désignant un fichier ;
  • dossier vide ;
  • plusieurs niveaux de sous-dossiers ;
  • fichiers et dossiers mélangés ;
  • erreur rencontrée pendant le parcours.

Critères d'acceptation

  • Le projet compile sans warning.
  • Un dossier valide produit un modèle.
  • Le nom du dossier racine est correct.
  • Les dossiers produisent des nœuds de type DIRECTORY.
  • Les fichiers produisent des nœuds de type FILE.
  • Les relations parent/enfants sont correctes.
  • Plusieurs niveaux de profondeur sont pris en charge.
  • Un dossier vide est pris en charge.
  • Un chemin invalide retourne NULL.
  • Les liens symboliques ne sont pas suivis.
  • Toutes les ressources sont libérées en cas d'erreur.
  • Aucun code GTK.
  • Aucun code SQLite.
  • make test exécute le nouveau test.

Tests

Le test doit créer une arborescence temporaire isolée :

TestCase/
├── DirectoryA/
│   └── FileA.txt
├── DirectoryB/
└── RootFile.md

Il doit vérifier :

  • le nom du nœud racine ;
  • le nombre d'enfants de la racine ;
  • la présence des deux dossiers ;
  • la présence du fichier racine ;
  • la présence de FileA.txt dans DirectoryA ;
  • le type de chaque nœud ;
  • le parent de chaque enfant ;
  • la gestion d'un dossier vide ;
  • les chemins invalides ;
  • la destruction complète du modèle.

Commit attendu

feat(core): build investigation tree from filesystem
## Titre Construire l'arborescence d'une enquête depuis le système de fichiers. --- ## Objectif Créer le module `InvestigationTreeBuilder`. Ce module doit parcourir récursivement le dossier racine d'une enquête et construire un `InvestigationTreeModel` représentant son contenu. --- ## Responsabilités Le module `InvestigationTreeBuilder` doit : - recevoir le chemin racine d'une enquête ; - vérifier que ce chemin désigne un dossier existant ; - créer le nœud racine ; - parcourir récursivement les dossiers ; - créer un `InvestigationNode` pour chaque dossier ; - créer un `InvestigationNode` pour chaque fichier ; - assembler les relations parent/enfants ; - retourner un `InvestigationTreeModel` complet ; - nettoyer toutes les ressources en cas d'erreur. --- ## Hors périmètre Ce ticket ne doit pas : - afficher l'arborescence avec GTK ; - modifier le système de fichiers ; - créer ou supprimer des fichiers ; - trier les éléments ; - filtrer les fichiers cachés ; - surveiller les changements du disque ; - suivre les liens symboliques ; - communiquer avec SQLite. --- ## Architecture ```text Investigation │ ▼ InvestigationTreeBuilder │ ▼ InvestigationTreeModel │ ▼ InvestigationNode ``` Le module appartient à la couche `core`. Il peut utiliser GLib et GIO, mais ne doit jamais dépendre de GTK. --- ## Fichiers concernés ```text include/core/investigation_tree_builder.h src/core/investigation_tree_builder.c ``` Les tests seront placés dans : ```text tests/test_investigation_tree_builder.c ``` --- ## Interface publique attendue ```c InvestigationTreeModel *investigation_tree_builder_build( const char *root_path ); ``` --- ## Principe de propriété En cas de succès, la fonction retourne un nouveau `InvestigationTreeModel`. Le code appelant devient propriétaire du modèle retourné et doit le libérer avec : ```c investigation_tree_model_free(tree_model); ``` En cas d'échec, la fonction retourne `NULL` et doit avoir libéré toutes les ressources créées pendant la construction. --- ## Comportement attendu À partir de : ```text Enquete_Test/ ├── 00_BaseDeDonnees/ │ └── Enquete.sqlite ├── 01_Preuves_Originales/ │ ├── Captures_Ecran/ │ └── Emails/ └── README.md ``` le module doit construire en mémoire : ```text Enquete_Test ├── 00_BaseDeDonnees │ └── Enquete.sqlite ├── 01_Preuves_Originales │ ├── Captures_Ecran │ └── Emails └── README.md ``` --- ## Gestion des liens symboliques Les liens symboliques ne sont pas suivis. Cette règle évite : - les boucles récursives ; - la sortie involontaire du dossier d'enquête ; - l'analyse de fichiers extérieurs à l'enquête. Leur prise en charge éventuelle fera l'objet d'un ticket distinct. --- ## Dépendances - C17 ; - GLib ; - GIO. Aucune dépendance GTK ou SQLite. --- ## Contraintes techniques - aucune variable globale ; - aucune modification du système de fichiers ; - parcours récursif ; - utilisation de `GFile` et `GFileEnumerator` ; - libération correcte des `GObject` avec `g_object_unref()` ; - respect de la règle « le propriétaire détruit » ; - documentation Doxygen ; - compilation sans warning ; - aucune fuite mémoire. --- ## Cas à gérer - chemin valide ; - chemin relatif ; - chemin `NULL` ; - chemin vide ; - chemin inexistant ; - chemin désignant un fichier ; - dossier vide ; - plusieurs niveaux de sous-dossiers ; - fichiers et dossiers mélangés ; - erreur rencontrée pendant le parcours. --- ## Critères d'acceptation - [x] Le projet compile sans warning. - [x] Un dossier valide produit un modèle. - [x] Le nom du dossier racine est correct. - [x] Les dossiers produisent des nœuds de type `DIRECTORY`. - [x] Les fichiers produisent des nœuds de type `FILE`. - [x] Les relations parent/enfants sont correctes. - [x] Plusieurs niveaux de profondeur sont pris en charge. - [x] Un dossier vide est pris en charge. - [x] Un chemin invalide retourne `NULL`. - [x] Les liens symboliques ne sont pas suivis. - [x] Toutes les ressources sont libérées en cas d'erreur. - [x] Aucun code GTK. - [x] Aucun code SQLite. - [x] `make test` exécute le nouveau test. --- ## Tests Le test doit créer une arborescence temporaire isolée : ```text TestCase/ ├── DirectoryA/ │ └── FileA.txt ├── DirectoryB/ └── RootFile.md ``` Il doit vérifier : - le nom du nœud racine ; - le nombre d'enfants de la racine ; - la présence des deux dossiers ; - la présence du fichier racine ; - la présence de `FileA.txt` dans `DirectoryA` ; - le type de chaque nœud ; - le parent de chaque enfant ; - la gestion d'un dossier vide ; - les chemins invalides ; - la destruction complète du modèle. --- ## Commit attendu ```text feat(core): build investigation tree from filesystem ```
fy59 closed this issue 2026-07-18 08:26:22 +02:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: fy59/labfy-investigation#11
No description provided.