🌐 Translate french to english for github project

main
Hugo ODY 3 days ago
parent 957ebaaff0
commit 277e9dee4b

@ -1,189 +1,189 @@
# 🏗 Architecture du Migration Tool # 🏗 Migration Tool Architecture
## Vue d'ensemble ## Overview
Le Migration Tool a été conçu selon les principes de développement suivants : The Migration Tool has been designed according to the following development principles:
- **Single Responsibility Principle (SRP)** : Chaque classe a une responsabilité unique - **Single Responsibility Principle (SRP)**: Each class has a unique responsibility
- **Open/Closed Principle** : Ouvert à l'extension, fermé à la modification - **Open/Closed Principle**: Open to extension, closed to modification
- **Dependency Inversion** : Dépendance sur des abstractions, pas des implémentations - **Dependency Inversion**: Dependency on abstractions, not implementations
- **Extensibilité** : Facilité d'ajout de nouveaux providers - **Extensibility**: Ease of adding new providers
## Structure du projet ## Project Structure
``` ```
GiteaToGithubMigrator/ GitMigrator/
├── providers/ # Providers pour différents services Git ├── providers/ # Providers for different Git services
│ ├── __init__.py │ ├── __init__.py
│ ├── base.py # Classes abstraites et modèles │ ├── base.py # Abstract classes and models
│ ├── factory.py # Factory pour créer les providers │ ├── factory.py # Factory to create providers
│ ├── source/ # Providers source (Gitea, GitLab, etc.) │ ├── source/ # Source providers (Gitea, GitLab, etc.)
│ │ ├── __init__.py │ │ ├── __init__.py
│ │ ├── gitea.py │ │ ├── gitea.py
│ │ └── gitlab.py │ │ └── gitlab.py
│ └── destination/ # Providers destination (GitHub, GitLab, etc.) │ └── destination/ # Destination providers (GitHub, GitLab, etc.)
│ ├── __init__.py │ ├── __init__.py
│ ├── github.py │ ├── github.py
│ └── gitlab.py │ └── gitlab.py
├── core/ # Logique métier centrale ├── core/ # Core business logic
│ ├── __init__.py │ ├── __init__.py
│ ├── config.py # Gestion de la configuration │ ├── config.py # Configuration management
│ └── migration_engine.py # Moteur de migration │ └── migration_engine.py # Migration engine
├── ui/ # Interface utilisateur ├── ui/ # User interface
│ ├── __init__.py │ ├── __init__.py
│ └── interactive_selector.py │ └── interactive_selector.py
├── main.py # Point d'entrée principal ├── main.py # Main entry point
└── run.sh # Script de lancement └── run.sh # Launch script
``` ```
## Responsabilités des modules ## Module Responsibilities
### 🔧 Providers (providers/) ### 🔧 Providers (providers/)
#### Base (`providers/base.py`) #### Base (`providers/base.py`)
- **Repository** : Modèle de données unifié pour tous les providers - **Repository**: Unified data model for all providers
- **SourceProvider** : Interface abstraite pour les providers source - **SourceProvider**: Abstract interface for source providers
- **DestinationProvider** : Interface abstraite pour les providers destination - **DestinationProvider**: Abstract interface for destination providers
- **Exceptions** : Exceptions spécialisées pour la gestion d'erreurs - **Exceptions**: Specialized exceptions for error handling
#### Factory (`providers/factory.py`) #### Factory (`providers/factory.py`)
- Création dynamique des instances de providers - Dynamic creation of provider instances
- Enregistrement de nouveaux providers - Registration of new providers
- Validation des types de providers disponibles - Validation of available provider types
#### Source Providers (`providers/source/`) #### Source Providers (`providers/source/`)
- **Gitea** : Implémentation pour Gitea - **Gitea**: Implementation for Gitea
- **GitLab** : Implémentation pour GitLab (exemple d'extensibilité) - **GitLab**: Implementation for GitLab (extensibility example)
#### Destination Providers (`providers/destination/`) #### Destination Providers (`providers/destination/`)
- **GitHub** : Implémentation pour GitHub - **GitHub**: Implementation for GitHub
- **GitLab** : Implémentation pour GitLab (exemple d'extensibilité) - **GitLab**: Implementation for GitLab (extensibility example)
### ⚙ Core (`core/`) ### ⚙ Core (`core/`)
#### Configuration (`core/config.py`) #### Configuration (`core/config.py`)
- Gestion centralisée de la configuration - Centralized configuration management
- Support multi-providers via variables d'environnement - Multi-provider support via environment variables
- Validation des paramètres de configuration - Configuration parameter validation
#### Migration Engine (`core/migration_engine.py`) #### Migration Engine (`core/migration_engine.py`)
- Orchestration du processus de migration - Migration process orchestration
- Gestion des repositories temporaires - Temporary repository management
- Exécution des commandes Git - Git command execution
- Logging et rapport de progression - Logging and progress reporting
### 🎨 UI (`ui/`) ### 🎨 UI (`ui/`)
#### Interactive Selector (`ui/interactive_selector.py`) #### Interactive Selector (`ui/interactive_selector.py`)
- Interface interactive pour la sélection de repositories - Interactive interface for repository selection
- Navigation au clavier - Keyboard navigation
- Système de renommage - Renaming system
- Affichage paginated - Paginated display
## Extensibilité ## Extensibility
### Ajouter un nouveau provider source ### Adding a new source provider
1. **Créer le fichier** : `providers/source/mon_provider.py` 1. **Create the file**: `providers/source/my_provider.py`
```python ```python
from typing import List, Optional from typing import List, Optional
from ..base import SourceProvider, Repository, ProviderError, ConfigurationError from ..base import SourceProvider, Repository, ProviderError, ConfigurationError
class MonProviderSourceProvider(SourceProvider): class MyProviderSourceProvider(SourceProvider):
def _validate_config(self) -> None: def _validate_config(self) -> None:
# Valider la configuration spécifique # Validate specific configuration
pass pass
def get_user_repositories(self) -> List[Repository]: def get_user_repositories(self) -> List[Repository]:
# Récupérer les repos de l'utilisateur # Retrieve user repositories
pass pass
def get_accessible_repositories(self) -> List[Repository]: def get_accessible_repositories(self) -> List[Repository]:
# Récupérer tous les repos accessibles # Retrieve all accessible repositories
pass pass
def get_repository_info(self, owner: str, name: str) -> Optional[Repository]: def get_repository_info(self, owner: str, name: str) -> Optional[Repository]:
# Récupérer les infos d'un repo spécifique # Retrieve specific repository information
pass pass
def get_authenticated_clone_url(self, repository: Repository) -> str: def get_authenticated_clone_url(self, repository: Repository) -> str:
# Générer l'URL de clone authentifiée # Generate authenticated clone URL
pass pass
``` ```
2. **Enregistrer le provider** dans `providers/factory.py` : 2. **Register the provider** in `providers/factory.py`:
```python ```python
from .source.mon_provider import MonProviderSourceProvider from .source.my_provider import MyProviderSourceProvider
class ProviderFactory: class ProviderFactory:
_source_providers: Dict[str, Type[SourceProvider]] = { _source_providers: Dict[str, Type[SourceProvider]] = {
'gitea': GiteaSourceProvider, 'gitea': GiteaSourceProvider,
'gitlab': GitLabSourceProvider, 'gitlab': GitLabSourceProvider,
'mon_provider': MonProviderSourceProvider, # Nouveau provider 'my_provider': MyProviderSourceProvider, # New provider
} }
``` ```
3. **Ajouter la configuration** dans `core/config.py` : 3. **Add configuration** in `core/config.py`:
```python ```python
def _load_source_config(self) -> Dict[str, Any]: def _load_source_config(self) -> Dict[str, Any]:
if self.source_provider == 'mon_provider': if self.source_provider == 'my_provider':
return { return {
'url': os.getenv('MON_PROVIDER_URL'), 'url': os.getenv('MY_PROVIDER_URL'),
'token': os.getenv('MON_PROVIDER_TOKEN'), 'token': os.getenv('MY_PROVIDER_TOKEN'),
'username': os.getenv('MON_PROVIDER_USERNAME') 'username': os.getenv('MY_PROVIDER_USERNAME')
} }
# ... autres providers # ... other providers
``` ```
### Ajouter un nouveau provider destination ### Adding a new destination provider
Le processus est identique, mais dans `providers/destination/`. The process is identical, but in `providers/destination/`.
## Patterns utilisés ## Design Patterns Used
### 1. Abstract Factory Pattern ### 1. Abstract Factory Pattern
- `ProviderFactory` crée des instances de providers - `ProviderFactory` creates provider instances
- Permet d'ajouter de nouveaux providers sans modifier le code existant - Allows adding new providers without modifying existing code
### 2. Strategy Pattern ### 2. Strategy Pattern
- Les providers implémentent des stratégies différentes pour accéder aux APIs - Providers implement different strategies to access APIs
- Le moteur de migration utilise ces stratégies de manière transparente - Migration engine uses these strategies transparently
### 3. Template Method Pattern ### 3. Template Method Pattern
- `SourceProvider` et `DestinationProvider` définissent le squelette des opérations - `SourceProvider` and `DestinationProvider` define operation skeletons
- Les implémentations concrètes remplissent les détails spécifiques - Concrete implementations fill in specific details
### 4. Dependency Injection ### 4. Dependency Injection
- Les providers sont injectés dans `MigrationEngine` - Providers are injected into `MigrationEngine`
- Facilite les tests et la flexibilité - Facilitates testing and flexibility
## Configuration ## Configuration
### Variables d'environnement ### Environment Variables
```bash ```bash
# Provider source # Source provider
SOURCE_PROVIDER=gitea|gitlab SOURCE_PROVIDER=gitea|gitlab
GITEA_URL=https://gitea.example.com GITEA_URL=https://gitea.example.com
GITEA_TOKEN=your_token GITEA_TOKEN=your_token
GITEA_USERNAME=your_username GITEA_USERNAME=your_username
# Provider destination # Destination provider
DESTINATION_PROVIDER=github|gitlab DESTINATION_PROVIDER=github|gitlab
GITHUB_TOKEN=your_token GITHUB_TOKEN=your_token
GITHUB_USERNAME=your_username GITHUB_USERNAME=your_username
``` ```
### Extensibilité de la configuration ### Configuration Extensibility
Pour ajouter un nouveau provider, il suffit d'ajouter les variables correspondantes et de modifier `MigrationConfig`. To add a new provider, simply add corresponding variables and modify `MigrationConfig`.
## Tests ## Tests
### Structure recommandée ### Recommended Structure
``` ```
tests/ tests/
@ -201,16 +201,16 @@ tests/
└── sample_repositories.json └── sample_repositories.json
``` ```
### Exemples de tests ### Test Examples
```python ```python
# Test d'un provider # Provider test
def test_gitea_provider_validates_config(): def test_gitea_provider_validates_config():
config = {'url': 'https://gitea.com', 'token': 'token', 'username': 'user'} config = {'url': 'https://gitea.com', 'token': 'token', 'username': 'user'}
provider = GiteaSourceProvider(config) provider = GiteaSourceProvider(config)
assert provider.base_url == 'https://gitea.com' assert provider.base_url == 'https://gitea.com'
# Test du moteur de migration # Migration engine test
def test_migration_engine_handles_errors(): def test_migration_engine_handles_errors():
source = Mock(spec=SourceProvider) source = Mock(spec=SourceProvider)
dest = Mock(spec=DestinationProvider) dest = Mock(spec=DestinationProvider)
@ -218,41 +218,41 @@ def test_migration_engine_handles_errors():
# Test error handling... # Test error handling...
``` ```
## Bonnes pratiques ## Best Practices
### 1. Gestion d'erreurs ### 1. Error Handling
- Exceptions spécialisées pour chaque type d'erreur - Specialized exceptions for each error type
- Logging approprié à chaque niveau - Appropriate logging at each level
- Gestion gracieuse des échecs - Graceful failure handling
### 2. Documentation ### 2. Documentation
- Docstrings pour toutes les méthodes publiques - Docstrings for all public methods
- Type hints pour la clarté du code - Type hints for code clarity
- README et documentation d'architecture - README and architecture documentation
### 3. Sécurité ### 3. Security
- Tokens jamais loggés - Tokens never logged
- Nettoyage des repositories temporaires - Temporary repository cleanup
- Validation des entrées utilisateur - User input validation
### 4. Performance ### 4. Performance
- Pagination pour les listes de repositories - Pagination for repository lists
- Parallélisation possible des migrations - Possible migration parallelization
- Gestion efficace de la mémoire - Efficient memory management
## Évolutions futures ## Future Evolutions
### Fonctionnalités potentielles ### Potential Features
- Migration incrémentale (seulement les changements) - Incremental migration (changes only)
- Support des webhooks - Webhook support
- Interface web - Web interface
- API REST - REST API
- Migration de métadonnées (issues, pull requests) - Metadata migration (issues, pull requests)
### Nouveaux providers ### New Providers
- Bitbucket - Bitbucket
- Azure DevOps - Azure DevOps
- Sourcehut - Sourcehut
- Codeberg - Codeberg
L'architecture actuelle permet d'ajouter facilement ces fonctionnalités sans restructuration majeure. The current architecture allows easy addition of these features without major restructuring.

@ -1,341 +1,341 @@
# 🚀 Outil de Migration Git Multi-Providers # 🚀 Multi-Provider Git Migration Tool
Cet projet fournit un outil pratique et modulable pour migrer automatiquement vos repositories entre différents providers Git. This project provides a practical and modular tool to automatically migrate your repositories between different Git providers.
## ✨ Fonctionnalités ## ✨ Features
- **Migration multi-providers** : Supporte plusieurs providers source et destination - **Multi-provider migration**: Supports multiple source and destination providers
- **Providers supportés** : - **Supported providers**:
- **Sources** : Gitea, GitLab - **Sources**: Gitea, GitLab
- **Destinations** : GitHub, GitLab - **Destinations**: GitHub, GitLab
- **Mode interactif par défaut** : Interface élégante pour sélectionner/déselectionner les repos à migrer - **Interactive mode by default**: Elegant interface to select/deselect repositories to migrate
- **Vision complète** : Voit tous les repositories accessibles (vos repos + ceux d'organisations) - **Complete vision**: See all accessible repositories (your repos + those from organizations)
- **Sélection intelligente** : Vos repositories sont pré-sélectionnés, les autres sont désélectionnés par défaut - **Smart selection**: Your repositories are pre-selected, others are deselected by default
- **Renommage intelligent** : Possibilité de renommer les repositories lors de la migration - **Smart renaming**: Ability to rename repositories during migration
- **Migration sélective** : Choisissez spécifiquement quels repositories migrer en ligne de commande - **Selective migration**: Choose specifically which repositories to migrate via command line
- **Interface en ligne de commande** : Interface colorée et intuitive avec navigation au clavier - **Command line interface**: Colorful and intuitive interface with keyboard navigation
- **Logging complet** : Suivi détaillé des opérations avec fichier de log - **Complete logging**: Detailed operation tracking with log file
- **Gestion des erreurs** : Robuste avec gestion gracieuse des erreurs - **Error handling**: Robust with graceful error management
- **Architecture extensible** : Facilement extensible pour ajouter de nouveaux providers - **Extensible architecture**: Easily extensible to add new providers
## 🛠 Installation ## 🛠 Installation
1. **Clonez le repository** : 1. **Clone the repository**:
```bash ```bash
git clone https://github.com/votre-username/GitMigrator.git git clone https://github.com/your-username/GitMigrator.git
cd GitMigrator cd GitMigrator
``` ```
2. **Configuration automatique** : 2. **Automatic configuration**:
```bash ```bash
./run.sh --setup ./run.sh --setup
``` ```
Le script va automatiquement : The script will automatically:
- Créer un environnement virtuel Python - Create a Python virtual environment
- Installer toutes les dépendances - Install all dependencies
- Créer le fichier de configuration `.env` - Create the `.env` configuration file
Cela créera un fichier `.env` que vous devrez remplir avec vos informations selon les providers choisis. This will create a `.env` file that you will need to fill with your information according to the chosen providers.
## 🔧 Configuration ## 🔧 Configuration
### Configuration avec support multi-instances ### Configuration with multi-instance support
```env ```env
# Gitea Source Configuration # Gitea Source Configuration
GITEA_SOURCE_URL=https://votre-instance-gitea-source.com GITEA_SOURCE_URL=https://your-gitea-source-instance.com
GITEA_SOURCE_TOKEN=votre_token_gitea_source GITEA_SOURCE_TOKEN=your_gitea_source_token
GITEA_SOURCE_USERNAME=votre_nom_utilisateur_gitea_source GITEA_SOURCE_USERNAME=your_gitea_source_username
# Gitea Destination Configuration # Gitea Destination Configuration
GITEA_DEST_URL=https://votre-instance-gitea-dest.com GITEA_DEST_URL=https://your-gitea-dest-instance.com
GITEA_DEST_TOKEN=votre_token_gitea_dest GITEA_DEST_TOKEN=your_gitea_dest_token
GITEA_DEST_USERNAME=votre_nom_utilisateur_gitea_dest GITEA_DEST_USERNAME=your_gitea_dest_username
# GitLab Source Configuration # GitLab Source Configuration
GITLAB_SOURCE_URL=https://gitlab-source.com GITLAB_SOURCE_URL=https://gitlab-source.com
GITLAB_SOURCE_TOKEN=votre_token_gitlab_source GITLAB_SOURCE_TOKEN=your_gitlab_source_token
GITLAB_SOURCE_USERNAME=votre_nom_utilisateur_gitlab_source GITLAB_SOURCE_USERNAME=your_gitlab_source_username
# GitLab Destination Configuration # GitLab Destination Configuration
GITLAB_DEST_URL=https://gitlab-dest.com GITLAB_DEST_URL=https://gitlab-dest.com
GITLAB_DEST_TOKEN=votre_token_gitlab_dest GITLAB_DEST_TOKEN=your_gitlab_dest_token
GITLAB_DEST_USERNAME=votre_nom_utilisateur_gitlab_dest GITLAB_DEST_USERNAME=your_gitlab_dest_username
# GitHub Configuration (same for source and destination - only one instance) # GitHub Configuration (same for source and destination - only one instance)
GITHUB_TOKEN=votre_token_github GITHUB_TOKEN=your_github_token
GITHUB_USERNAME=votre_nom_utilisateur_github GITHUB_USERNAME=your_github_username
``` ```
**📝 Instructions :** **📝 Instructions:**
1. **Multi-instances** : Vous pouvez configurer différentes instances du même provider 1. **Multi-instances**: You can configure different instances of the same provider
2. **Même instance** : Utilisez les mêmes credentials pour source et destination si c'est la même instance 2. **Same instance**: Use the same credentials for source and destination if it's the same instance
3. **Migration flexible** : Supports GitLab → GitLab, Gitea → Gitea, etc. entre différentes instances 3. **Flexible migration**: Supports GitLab → GitLab, Gitea → Gitea, etc. between different instances
4. **Configuration minimale** : Configurez seulement les providers source/destination que vous utilisez 4. **Minimal configuration**: Configure only the source/destination providers that you use
5. L'outil vous demandera interactivement quel provider utiliser comme source et destination 5. The tool will interactively ask which provider to use as source and destination
## 🔑 Configuration des tokens ## 🔑 Token Configuration
### Token Gitea ### Gitea Token
1. Allez dans **Settings****Applications** → **Generate New Token** 1. Go to **Settings****Applications** → **Generate New Token**
2. Donnez un nom au token et sélectionnez les permissions : 2. Give the token a name and select permissions:
- `repo` (accès complet aux repositories) - `repo` (full access to repositories)
- `user` (accès aux informations utilisateur) - `user` (access to user information)
### Token GitLab ### GitLab Token
1. Allez dans **Settings****Access Tokens** ou **User Settings** → **Access Tokens** 1. Go to **Settings****Access Tokens** or **User Settings** → **Access Tokens**
2. Créez un **Personal Access Token** avec les permissions : 2. Create a **Personal Access Token** with permissions:
- `read_api` (lecture des informations API) - `read_api` (read API information)
- `read_repository` (lecture des repositories) - `read_repository` (read repositories)
- `write_repository` (écriture des repositories - pour destination) - `write_repository` (write repositories - for destination)
### Token GitHub ### GitHub Token
1. Allez dans **Settings****Developer settings****Personal access tokens** → **Tokens (classic)** 1. Go to **Settings****Developer settings****Personal access tokens** → **Tokens (classic)**
2. Cliquez sur **Generate new token (classic)** 2. Click on **Generate new token (classic)**
3. Sélectionnez les permissions : 3. Select permissions:
- `repo` (accès complet aux repositories privés) - `repo` (full access to private repositories)
- `public_repo` (accès aux repositories publics) - `public_repo` (access to public repositories)
## 🚀 Utilisation ## 🚀 Usage
Après avoir configuré vos tokens dans le fichier `.env`, utilisez le script de lancement : After configuring your tokens in the `.env` file, use the launch script:
### Migration interactive (par défaut) ### Interactive migration (default)
```bash ```bash
./run.sh ./run.sh
``` ```
### Migration automatique de tous vos repos ### Automatic migration of all your repos
```bash ```bash
./run.sh --no-interactive ./run.sh --no-interactive
``` ```
### Migration de repositories spécifiques ### Migration of specific repositories
```bash ```bash
./run.sh --repos mon-repo autre-repo ./run.sh --repos my-repo another-repo
``` ```
### Lister les repositories disponibles ### List available repositories
```bash ```bash
./run.sh --list ./run.sh --list
``` ```
### Mode verbose (plus de détails) ### Verbose mode (more details)
```bash ```bash
./run.sh --verbose ./run.sh --verbose
``` ```
> **💡 Alternative** : Vous pouvez aussi utiliser directement `python main.py` si vous avez activé l'environnement virtuel (`source venv/bin/activate`) > **💡 Alternative**: You can also use `python main.py` directly if you have activated the virtual environment (`source venv/bin/activate`)
## 🎯 Mode Interactif ## 🎯 Interactive Mode
Le mode interactif (activé par défaut) offre une **interface utilisateur élégante** pour sélectionner précisément quels repositories migrer : Interactive mode (enabled by default) offers an **elegant user interface** to precisely select which repositories to migrate:
```bash ```bash
./run.sh # Mode interactif par défaut ./run.sh # Interactive mode by default
``` ```
### Contrôles dans l'interface interactive : ### Controls in the interactive interface:
- **↑↓** : Naviguer entre les repositories - **↑↓**: Navigate between repositories
- **←→** : Changer de page (si beaucoup de repos) - **←→**: Change page (if many repos)
- **ESPACE** : Cocher/décocher un repository - **SPACE**: Check/uncheck a repository
- **A** : Sélectionner tous les repositories - **A**: Select all repositories
- **N** : Désélectionner tous les repositories - **N**: Deselect all repositories
- **ENTRÉE** : Confirmer la sélection et passer au renommage (optionnel) - **ENTER**: Confirm selection and proceed to renaming (optional)
- **Q** : Quitter sans migrer - **Q**: Quit without migrating
### Interface de renommage : ### Renaming interface:
Après la sélection, l'outil propose de renommer les repositories : After selection, the tool offers to rename repositories:
- **Y** : Ouvrir l'interface de renommage - **Y**: Open renaming interface
- **N/ENTRÉE** : Conserver les noms actuels - **N/ENTER**: Keep current names
- **Validation automatique** des noms de repositories pour le provider de destination - **Automatic validation** of repository names for the destination provider
### Fonctionnalités : ### Features:
- ✅ **Checkboxes visuelles** avec émojis - ✅ **Visual checkboxes** with emojis
- 👤 **Distinction propriétaire** : Vos repos vs repos d'autres utilisateurs - 👤 **Owner distinction**: Your repos vs other users' repos
- 🎯 **Sélection intelligente** : Vos repos pré-sélectionnés par défaut - 🎯 **Smart selection**: Your repos pre-selected by default
- 📋 **Tri intelligent** : Vos repos en premier, puis les autres, tous par ordre alphabétique - 📋 **Smart sorting**: Your repos first, then others, all alphabetically ordered
- ✏️ **Renommage optionnel** : Possibilité de renommer les repos sur le provider de destination - ✏️ **Optional renaming**: Ability to rename repos on the destination provider
- 📄 **Pagination automatique** (15 repos par page) - 📄 **Automatic pagination** (15 repos per page)
- 🎨 **Interface colorée** avec mise en surbrillance et séparateurs visuels - 🎨 **Colorful interface** with highlighting and visual separators
- 📊 **Compteur en temps réel** des repos sélectionnés - 📊 **Real-time counter** of selected repos
- 🔒 **Indicateurs visuels** (privé/public) - 🔒 **Visual indicators** (private/public)
- 📝 **Descriptions tronquées** pour un affichage propre - 📝 **Truncated descriptions** for clean display
## 📋 Exemples d'utilisation ## 📋 Usage Examples
### Exemple 1 : Migration interactive (défaut) ### Example 1: Interactive migration (default)
```bash ```bash
# 1. Configurez vos providers dans .env # 1. Configure your providers in .env
# 2. Lancez l'outil # 2. Launch the tool
./run.sh ./run.sh
# L'outil vous demandera : # The tool will ask you:
# - Quel provider utiliser comme source # - Which provider to use as source
# - Quel provider utiliser comme destination # - Which provider to use as destination
# - Puis vous pourrez sélectionner les repos à migrer # - Then you can select repos to migrate
``` ```
### Exemple 2 : Migration automatique ### Example 2: Automatic migration
```bash ```bash
# Migre tous vos repositories automatiquement # Migrate all your repositories automatically
# (après sélection interactive des providers) # (after interactive provider selection)
./run.sh --no-interactive ./run.sh --no-interactive
``` ```
### Exemple 3 : Migration sélective ### Example 3: Selective migration
```bash ```bash
# Migre seulement les repositories spécifiés # Migrate only specified repositories
# (après sélection interactive des providers) # (after interactive provider selection)
./run.sh --repos projet-web api-backend ./run.sh --repos web-project api-backend
``` ```
### Exemple 4 : Migration depuis une organisation ### Example 4: Migration from an organization
```bash ```bash
# Migre un repository d'une organisation (fonctionne avec tous les providers) # Migrate a repository from an organization (works with all providers)
./run.sh --repos mon-org/projet-important ./run.sh --repos my-org/important-project
``` ```
### Exemple 5 : Premier lancement (configuration) ### Example 5: First launch (configuration)
```bash ```bash
# 1. Setup initial - crée le fichier .env template # 1. Initial setup - creates .env template file
./run.sh --setup ./run.sh --setup
# 2. Éditez le fichier .env avec vos credentials (au moins 2 providers) # 2. Edit the .env file with your credentials (at least 2 providers)
nano .env nano .env
# 3. Lancez l'outil - il vous demandera quels providers utiliser # 3. Launch the tool - it will ask which providers to use
./run.sh ./run.sh
# 4. Pour lister les repos disponibles (après sélection du provider source) # 4. To list available repos (after source provider selection)
./run.sh --list ./run.sh --list
``` ```
### Exemple 6 : Migration avec renommage ### Example 6: Migration with renaming
```bash ```bash
# 1. Lancer le mode interactif # 1. Launch interactive mode
./run.sh ./run.sh
# 2. Sélectionner les providers source et destination # 2. Select source and destination providers
# 3. Sélectionner les repos à migrer # 3. Select repos to migrate
# 4. Choisir "Y" pour le renommage # 4. Choose "Y" for renaming
# 5. Renommer les repos un par un # 5. Rename repos one by one
# - Appuyer sur ENTRÉE pour garder le nom original # - Press ENTER to keep original name
# - Taper un nouveau nom pour renommer # - Type new name to rename
# 6. Confirmer et lancer la migration # 6. Confirm and start migration
``` ```
## 📊 Résultats ## 📊 Results
L'outil affiche un résumé détaillé à la fin : The tool displays a detailed summary at the end:
- ✅ Nombre de migrations réussies - ✅ Number of successful migrations
- ❌ Nombre de migrations échouées - ❌ Number of failed migrations
- 📝 Détail par repository - 📝 Detail per repository
Tous les logs sont également sauvegardés dans `migration.log`. All logs are also saved in `migration.log`.
## 🔧 Structure du projet ## 🔧 Project Structure
``` ```
GitMigrator/ GitMigrator/
├── main.py # Script principal ├── main.py # Main script
├── core/ # Logique métier centrale ├── core/ # Core business logic
│ ├── config.py # Gestion de la configuration multi-providers │ ├── config.py # Multi-provider configuration management
│ └── migration_engine.py # Moteur de migration │ └── migration_engine.py # Migration engine
├── providers/ # Providers pour différents services Git ├── providers/ # Providers for different Git services
│ ├── base.py # Classes abstraites et modèles │ ├── base.py # Abstract classes and models
│ ├── factory.py # Factory pour créer les providers │ ├── factory.py # Factory to create providers
│ ├── source/ # Providers source │ ├── source/ # Source providers
│ │ ├── gitea.py # Support Gitea │ │ ├── gitea.py # Gitea support
│ │ └── gitlab.py # Support GitLab │ │ └── gitlab.py # GitLab support
│ └── destination/ # Providers destination │ └── destination/ # Destination providers
│ ├── github.py # Support GitHub │ ├── github.py # GitHub support
│ └── gitlab.py # Support GitLab │ └── gitlab.py # GitLab support
├── ui/ # Interface utilisateur ├── ui/ # User interface
│ └── interactive_selector.py │ └── interactive_selector.py
├── requirements.txt # Dépendances Python ├── requirements.txt # Python dependencies
├── .env # Configuration (à créer) ├── .env # Configuration (to create)
└── README.md # Documentation └── README.md # Documentation
``` ```
## 🌟 Providers supportés ## 🌟 Supported Providers
### Providers Source ### Source Providers
- **Gitea** : Instances Gitea (self-hosted ou cloud) - **Gitea**: Gitea instances (self-hosted or cloud)
- **GitLab** : GitLab.com ou instances GitLab self-hosted - **GitLab**: GitLab.com or self-hosted GitLab instances
### Providers Destination ### Destination Providers
- **GitHub** : GitHub.com - **GitHub**: GitHub.com
- **GitLab** : GitLab.com ou instances GitLab self-hosted - **GitLab**: GitLab.com or self-hosted GitLab instances
### Combinaisons possibles ### Possible Combinations
- Gitea → GitHub - Gitea → GitHub
- Gitea → GitLab - Gitea → GitLab
- GitLab → GitHub - GitLab → GitHub
- GitLab → GitLab (migration entre instances) - GitLab → GitLab (migration between instances)
## ⚠️ Prérequis ## ⚠️ Prerequisites
- Python 3.7+ - Python 3.7+
- Git installé sur votre système - Git installed on your system
- Accès aux APIs des providers source et destination - Access to source and destination provider APIs
- Tokens d'authentification valides pour les providers - Valid authentication tokens for providers
## 🛡 Sécurité ## 🛡 Security
- Les tokens sont stockés dans un fichier `.env` (ajoutez-le à `.gitignore`) - Tokens are stored in a `.env` file (add it to `.gitignore`)
- Les URLs d'authentification ne sont jamais loggées - Authentication URLs are never logged
- Nettoyage automatique des repositories temporaires - Automatic cleanup of temporary repositories
## 🐛 Résolution de problèmes ## 🐛 Troubleshooting
### Erreur d'authentification ### Authentication error
- Vérifiez que vos tokens sont valides et ont les bonnes permissions - Check that your tokens are valid and have the right permissions
- Assurez-vous que les noms d'utilisateur correspondent - Make sure usernames match
- Vérifiez que les URLs des providers sont correctes - Verify that provider URLs are correct
### Erreur de clonage ### Clone error
- Vérifiez votre connexion internet - Check your internet connection
- Assurez-vous que Git est installé et accessible - Make sure Git is installed and accessible
### Repository déjà existant ### Repository already exists
- L'outil vérifie automatiquement l'existence sur le provider de destination - The tool automatically checks existence on the destination provider
- Les repositories existants sont ignorés avec un avertissement - Existing repositories are ignored with a warning
### Provider non supporté ou non configuré ### Unsupported or unconfigured provider
- Vérifiez que vos providers sont bien configurés dans le fichier .env - Check that your providers are properly configured in the .env file
- Assurez-vous d'avoir au moins 2 providers configurés - Make sure you have at least 2 providers configured
- Providers disponibles : gitea, gitlab, github - Available providers: gitea, gitlab, github
- L'outil vous indiquera quels providers sont configurés au démarrage - The tool will indicate which providers are configured at startup
## 📝 Logs ## 📝 Logs
Tous les détails d'exécution sont sauvegardés dans `migration.log` : All execution details are saved in `migration.log`:
- Timestamps des opérations - Operation timestamps
- Sélection des providers source et destination - Source and destination provider selection
- Détails des erreurs - Error details
- Statistiques de migration - Migration statistics
- Informations complètes sur le processus de migration - Complete information about the migration process
## 🚀 Extensibilité ## 🚀 Extensibility
L'architecture modulaire permet d'ajouter facilement de nouveaux providers : The modular architecture allows easy addition of new providers:
1. **Créer un nouveau provider source** dans `providers/source/` 1. **Create a new source provider** in `providers/source/`
2. **Créer un nouveau provider destination** dans `providers/destination/` 2. **Create a new destination provider** in `providers/destination/`
3. **Enregistrer le provider** dans `providers/factory.py` 3. **Register the provider** in `providers/factory.py`
4. **Ajouter la configuration** dans `core/config.py` 4. **Add configuration** in `core/config.py`
Voir `ARCHITECTURE.md` pour plus de détails sur l'ajout de nouveaux providers. See `ARCHITECTURE.md` for more details on adding new providers.
## 🤝 Contribution ## 🤝 Contribution
Les contributions sont les bienvenues ! N'hésitez pas à : Contributions are welcome! Feel free to:
- Signaler des bugs - Report bugs
- Proposer des améliorations - Suggest improvements
- Soumettre des pull requests - Submit pull requests
- Ajouter de nouveaux providers - Add new providers
## 📄 Licence ## 📄 License
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails. This project is under MIT license. See the LICENSE file for more details.

@ -136,7 +136,7 @@ class MigrationConfig:
dest_configured = any(self.get_available_destination_providers().values()) dest_configured = any(self.get_available_destination_providers().values())
return source_configured and dest_configured return source_configured and dest_configured
# Méthodes dépréciées pour compatibilité (si jamais utilisées ailleurs) # Deprecated methods for compatibility (if ever used elsewhere)
def get_provider_config(self, provider_type: str) -> Dict[str, Any]: def get_provider_config(self, provider_type: str) -> Dict[str, Any]:
"""DEPRECATED: Use get_source_provider_config or get_destination_provider_config""" """DEPRECATED: Use get_source_provider_config or get_destination_provider_config"""
return self.get_source_provider_config(provider_type) return self.get_source_provider_config(provider_type)

@ -80,7 +80,7 @@ class InteractiveSelector:
# Add separator when transitioning from own repos to others # Add separator when transitioning from own repos to others
if last_owner_type == "own" and current_owner_type == "others": if last_owner_type == "own" and current_owner_type == "others":
print(f" {Fore.LIGHTBLACK_EX}{'' * 50} Autres repositories {'' * 10}{Style.RESET_ALL}") print(f" {Fore.LIGHTBLACK_EX}{'' * 50} Other repositories {'' * 10}{Style.RESET_ALL}")
last_owner_type = current_owner_type last_owner_type = current_owner_type
@ -189,7 +189,7 @@ class InteractiveSelector:
print(f"║ ✏️ RENAME REPOSITORIES ║") print(f"║ ✏️ RENAME REPOSITORIES ║")
print(f"║ ║") print(f"║ ║")
print(f"║ Press ENTER to keep current name, or type new name ║") print(f"║ Press ENTER to keep current name, or type new name ║")
print(f"║ Repository names should be valid GitHub repo names ") print(f"║ Repository names should be valid for destination provider")
print(f"╚═══════════════════════════════════════════════════════════════╝{Style.RESET_ALL}") print(f"╚═══════════════════════════════════════════════════════════════╝{Style.RESET_ALL}")
print() print()
@ -204,7 +204,7 @@ class InteractiveSelector:
print(f" Source: {Fore.BLUE}{owner}/{original_name}{Style.RESET_ALL} {private}") print(f" Source: {Fore.BLUE}{owner}/{original_name}{Style.RESET_ALL} {private}")
# Get new name from user # Get new name from user
new_name = input(f" GitHub name [{Fore.GREEN}{original_name}{Style.RESET_ALL}]: ").strip() new_name = input(f" Destination name [{Fore.GREEN}{original_name}{Style.RESET_ALL}]: ").strip()
# Validate and use new name # Validate and use new name
if new_name: if new_name:
@ -218,7 +218,7 @@ class InteractiveSelector:
new_name = original_name new_name = original_name
print(f" {Fore.CYAN} Keeping original name: {original_name}{Style.RESET_ALL}") print(f" {Fore.CYAN} Keeping original name: {original_name}{Style.RESET_ALL}")
# Update repository with new GitHub name # Update repository with new destination name
repo.github_name = new_name repo.github_name = new_name
renamed_repos.append(repo) renamed_repos.append(repo)
print() print()
@ -242,11 +242,11 @@ class InteractiveSelector:
return renamed_repos return renamed_repos
def _is_valid_repo_name(self, name: str) -> bool: def _is_valid_repo_name(self, name: str) -> bool:
"""Validate GitHub repository name""" """Validate repository name for destination provider"""
if not name: if not name:
return False return False
# GitHub repo name rules (simplified) # Common repository name rules (simplified)
if len(name) > 100: if len(name) > 100:
return False return False
@ -307,13 +307,13 @@ class InteractiveSelector:
print(f"{Fore.BLUE}{owner}/{name}{Style.RESET_ALL} {private}") print(f"{Fore.BLUE}{owner}/{name}{Style.RESET_ALL} {private}")
# Ask if user wants to rename repositories # Ask if user wants to rename repositories
print(f"\n{Fore.YELLOW}📝 Voulez-vous changer le nom de certains repos sur GitHub ?{Style.RESET_ALL}") print(f"\n{Fore.YELLOW}📝 Do you want to change the name of some repos on the destination?{Style.RESET_ALL}")
print(f"{Fore.CYAN}[Y/y] Oui - Interface de renommage{Style.RESET_ALL}") print(f"{Fore.CYAN}[Y/y] Yes - Renaming interface{Style.RESET_ALL}")
print(f"{Fore.CYAN}[N/n ou ENTER] Non - Conserver les noms actuels{Style.RESET_ALL}") print(f"{Fore.CYAN}[N/n or ENTER] No - Keep current names{Style.RESET_ALL}")
choice = input(f"\n{Fore.YELLOW}Votre choix: {Style.RESET_ALL}").strip().lower() choice = input(f"\n{Fore.YELLOW}Your choice: {Style.RESET_ALL}").strip().lower()
if choice == 'y' or choice == 'yes' or choice == 'oui': if choice == 'y' or choice == 'yes':
selected_repos = self._rename_repositories_interface(selected_repos) selected_repos = self._rename_repositories_interface(selected_repos)
print(f"\n{Fore.CYAN}🚀 Starting migration...{Style.RESET_ALL}\n") print(f"\n{Fore.CYAN}🚀 Starting migration...{Style.RESET_ALL}\n")

Loading…
Cancel
Save