---
sessionId: session-260805-175916-8b4i
---

# Requirements

### Overview & Goals
Finaliser la migration `boost::filesystem` -> `std::filesystem` en appliquant deux contraintes de style et d’architecture :
- remplacer les `using namespace boost::filesystem` par un alias explicite `fs` pointant vers `std::filesystem` ;
- conserver les types de temps natifs (`fs::file_time_type`) dans les composants métier, puis convertir vers `time_t`/`timespec` uniquement au point d’intégration FUSE.

### Scope
- **In Scope**:
  - Remplacement des usages de namespace dans le code production et tests par `namespace fs = std::filesystem;`.
  - Migration des signatures et états liés à `last_write_time` pour stocker `fs::file_time_type` côté composants.
  - Ajustement de la couche FUSE pour effectuer la conversion temporelle au plus près des appels `timespec`.
  - Suppression de la dépendance Boost dans CMake et nettoyage des includes restants.
- **Out of Scope**:
  - Refonte fonctionnelle des composants FUSE ou Zip hors migration `filesystem`.
  - Migration d’autres modules Boost non liés à `filesystem`.

# Technical Design

### Current Implementation
- `include/ZipDirFs/Utilities/FileSystem.h` et `include/ZipDirFs/Zip/Lib.h` exposent actuellement des types `boost::filesystem` via `using namespace boost::filesystem;`.
- Plusieurs points utilisent encore des `using namespace boost::filesystem` (production et tests), notamment :
  - `include/ZipDirFs/Utilities/FileSystem.h`
  - `include/ZipDirFs/Zip/Lib.h`
  - `test/ZipDirFs/Utilities/Fixtures/FileSystem.h`
  - `test/ZipDirFs/Zip/Fixtures/Lib.h`
  - `test/ZipDirFs/Components/NativeFactory.cpp`
  - `test/ZipDirFs/Components/ZipFactory.cpp`
- Les classes de changement (`NativeChanged`, `ZipFileChanged`, `ChangedStart`, `ChangedProxy`) stockent et propagent du `std::time_t`.
- `FileSystem::last_write_time` est typé en `std::function<std::time_t(const path&)>` alors que `std::filesystem::last_write_time` renvoie `std::filesystem::file_time_type`.
- La couche FUSE (`include/ZipDirFs/Fuse/NativeTimePolicy.h`, `include/ZipDirFs/Fuse/ZipTimePolicy.h`) construit des `timespec` à partir de méthodes virtuelles retournant `std::time_t`.

### Key Decisions
1. **Alias namespace unique pour filesystem**
   - Décision : utiliser `namespace fs = std::filesystem;` à la place de tout `using namespace ...filesystem`.
   - Rationale : évite la pollution de namespace, rend les types explicitement qualifiés (`fs::path`, `fs::file_status`) et respecte la contrainte demandée.

2. **Stockage des temps natifs côté composants**
   - Décision : stocker `fs::file_time_type` là où la valeur vient du filesystem natif (ex. `NativeChanged`, chemin parent de `ZipFileChanged`) au lieu de convertir immédiatement en `std::time_t`.
   - Rationale : évite les pertes de précision et reporte la conversion à la frontière FUSE.

3. **Conversion temporelle locale à la couche FUSE**
   - Décision : centraliser les conversions vers `timespec` au niveau des politiques de temps FUSE (`NativeTimePolicy`, `ZipTimePolicy`) ou des méthodes juste en amont.
   - Rationale : la conversion est faite « au plus près des appels FUSE » comme demandé, en gardant le domaine métier sur des types natifs.

### Proposed Changes

#### 1. Migration `boost::filesystem` vers `std::filesystem` avec alias `fs`
- Remplacer `#include <boost/filesystem.hpp>` par `#include <filesystem>` dans les fichiers ciblés.
- Remplacer les forward declarations `namespace boost::filesystem { ... }` par l’utilisation directe de `<filesystem>` et des types `fs::...`.
- Introduire l’alias `namespace fs = std::filesystem;` dans les unités concernées et remplacer les usages nus (`path`, `file_status`, `directory_iterator`, etc.) par `fs::...`.
- Supprimer `using namespace boost;` dans `src/ZipDirFs/Utilities/FileSystem.cpp` en qualifiant explicitement les symboles.

#### 2. Adaptation des contrats de temps
- Faire évoluer l’interface `FileSystem` pour refléter le type natif :
  - `last_write_time: std::function<fs::file_time_type(const fs::path&)>`.
- Mettre à jour les classes de suivi de changement :
  - `NativeChanged` : stockage `fs::file_time_type lastChanged`.
  - `ZipFileChanged` : stockage séparé du temps filesystem natif (`fs::file_time_type`) et du temps entrée zip (`std::time_t`) tant que `Zip::Base::Stat` reste en `std::time_t`.
  - `ChangedStart` / `ChangedProxy` / `Containers::Helpers::Changed` : ajuster le contrat pour transporter la valeur temporelle native nécessaire sans conversion précoce.

#### 3. Conversion au plus près de FUSE
- Adapter `NativeTimePolicy` et `ZipTimePolicy` pour construire `timespec` à partir des valeurs métier avec conversion locale (helpers de conversion dédiés).
- Harmoniser les implémentations FUSE (`NativeDirectory`, `NativeSymlink`, `ZipDirectory`, `ZipFile`, `ZipRootDirectory`) pour éviter toute conversion anticipée en amont.

### File Structure
- **Build**: `CMakeLists.txt`, `src/CMakeLists.txt`, `test/CMakeLists.txt`
- **Core filesystem wrappers**:
  - `include/ZipDirFs/Utilities/FileSystem.h`
  - `src/ZipDirFs/Utilities/FileSystem.cpp`
  - `include/ZipDirFs/Zip/Lib.h`
- **Changed pipeline**:
  - `include/ZipDirFs/Containers/Helpers/Changed.h`
  - `include/ZipDirFs/Components/ChangedProxy.h`
  - `src/ZipDirFs/Components/ChangedProxy.cpp`
  - `include/ZipDirFs/Components/ChangedStart.h`
  - `src/ZipDirFs/Components/ChangedStart.cpp`
  - `include/ZipDirFs/Components/NativeChanged.h`
  - `src/ZipDirFs/Components/NativeChanged.cpp`
  - `include/ZipDirFs/Components/ZipFileChanged.h`
  - `src/ZipDirFs/Components/ZipFileChanged.cpp`
- **Fuse integration**:
  - `include/ZipDirFs/Fuse/NativeTimePolicy.h`
  - `include/ZipDirFs/Fuse/ZipTimePolicy.h`
  - `include/ZipDirFs/Fuse/NativeDirectory.h`
  - `src/ZipDirFs/Fuse/NativeDirectory.cpp`
  - `src/ZipDirFs/Fuse/NativeSymlink.cpp`
  - `src/ZipDirFs/Fuse/ZipDirectory.cpp`
  - `src/ZipDirFs/Fuse/ZipFile.cpp`
  - `src/ZipDirFs/Fuse/ZipRootDirectory.cpp`
- **Tests impacted**:
  - `test/ZipDirFs/Utilities/Fixtures/FileSystem.h`
  - `test/ZipDirFs/Zip/Fixtures/Lib.h`
  - `test/ZipDirFs/Components/NativeFactory.cpp`
  - `test/ZipDirFs/Components/ZipFactory.cpp`
  - et les tests utilisant des signatures `FileSystem::last_write_time`.

### Risks
- La migration du contrat `Changed` peut avoir un impact transversal (proxies + FUSE + tests).
- Les conversions `file_time_type` -> `timespec` doivent être cohérentes entre plateformes (epoch/clock différente selon implémentation standard).
- `Zip::Base::Stat` restant en `std::time_t` impose une gestion mixte des types dans `ZipFileChanged` (à cadrer proprement).

# Delivery Steps

### ✓ Step 1: Uniformiser les namespaces filesystem avec l’alias `fs`
Tous les usages `boost::filesystem` et `using namespace ...filesystem` sont remplacés par `std::filesystem` avec alias `fs`.

- Mettre à jour les includes et déclarations de types dans les wrappers (`FileSystem`, `Zip::Lib`) et fichiers FUSE/Components concernés.
- Remplacer chaque `using namespace boost::filesystem;` détecté (production + tests) par l’alias `namespace fs = std::filesystem;` puis qualification `fs::...`.
- Nettoyer les usages implicites liés à `using namespace boost;` dans `src/ZipDirFs/Utilities/FileSystem.cpp`.

### ✓ Step 2: Migrer le pipeline de temps pour stocker les valeurs natives
Les classes qui mémorisent l’horodatage conservent `fs::file_time_type` au lieu de convertir immédiatement en `std::time_t`.

- Faire évoluer `FileSystem::last_write_time` et les mocks de tests vers `fs::file_time_type`.
- Adapter `NativeChanged`, `ChangedStart`, `ChangedProxy` et le contrat `Changed` pour transporter la valeur native.
- Adapter `ZipFileChanged` pour gérer le cas mixte (temps parent natif + temps entrée zip) sans conversion anticipée.

### ✓ Step 3: Déplacer la conversion temporelle à la frontière FUSE et valider
La conversion vers `timespec` est effectuée au plus près des appels FUSE, avec compilation et tests verts.

- Mettre à jour `NativeTimePolicy` et `ZipTimePolicy` pour encapsuler la conversion locale en `timespec`.
- Ajuster les classes FUSE (`NativeDirectory`, `NativeSymlink`, `ZipDirectory`, `ZipFile`, `ZipRootDirectory`) pour consommer le nouveau contrat de temps.
- Mettre à jour les tests impactés, reconstruire toutes les cibles (`src` + `test`) et exécuter `make check`.