--- title: "Phase 2.5: Multi-Platform Support (Bitbucket, Azure DevOps, Gitea/Forgejo)" labels: ["enhancement", "phase-2", "git-platforms", "medium-priority"] assignees: [] milestone: "Phase 2 - Intelligence & Usability" --- ## Overview Extend PR/MR conflict resolution to support additional Git platforms beyond GitHub and GitLab. Implement an extensible platform pattern that makes it easy to add new platforms in the future. ## Related Roadmap Section Phase 2.5 - Additional Platform Support ## Current Status ✅ **Implemented**: - GitHub (GitHub API v3) - GitLab (GitLab API) 🔜 **To Implement**: - Bitbucket (Cloud and Server) - Azure DevOps (Cloud and Server) - Gitea/Forgejo ## Platforms to Support ### 1. Bitbucket #### Bitbucket Cloud - **API**: Bitbucket Cloud REST API 2.0 - **URL Pattern**: `https://bitbucket.org/{workspace}/{repo}/pull-requests/{number}` - **Authentication**: - App passwords - OAuth 2.0 - **API Endpoints**: - GET `/2.0/repositories/{workspace}/{repo}/pullrequests/{number}` - GET `/2.0/repositories/{workspace}/{repo}/src/{commit}/{path}` - GET `/2.0/repositories/{workspace}/{repo}/diff/{spec}` #### Bitbucket Server (Self-Hosted) - **API**: Bitbucket Server REST API 1.0 - **URL Pattern**: `https://{server}/projects/{project}/repos/{repo}/pull-requests/{number}` - **Authentication**: Personal Access Tokens, HTTP Basic Auth - **API Endpoints**: - GET `/rest/api/1.0/projects/{project}/repos/{repo}/pull-requests/{number}` - GET `/rest/api/1.0/projects/{project}/repos/{repo}/browse/{path}?at={ref}` **Implementation Priority**: HIGH ### 2. Azure DevOps #### Azure DevOps Cloud - **API**: Azure DevOps REST API 6.0 - **URL Pattern**: `https://dev.azure.com/{organization}/{project}/_git/{repo}/pullrequest/{number}` - **Authentication**: Personal Access Tokens (PAT) - **API Endpoints**: - GET `/{organization}/{project}/_apis/git/repositories/{repo}/pullrequests/{number}` - GET `/{organization}/{project}/_apis/git/repositories/{repo}/items?path={path}&version={ref}` #### Azure DevOps Server (On-Premises) - **API**: Same as cloud - **URL Pattern**: `https://{server}/{organization}/{project}/_git/{repo}/pullrequest/{number}` - **Authentication**: PAT, NTLM, Kerberos **Implementation Priority**: HIGH (widely used in enterprise) ### 3. Gitea / Forgejo - **API**: Gitea/Forgejo API (OpenAPI compatible) - **URL Pattern**: `https://{server}/{owner}/{repo}/pulls/{number}` - **Authentication**: Access tokens - **API Endpoints**: - GET `/api/v1/repos/{owner}/{repo}/pulls/{number}` - GET `/api/v1/repos/{owner}/{repo}/contents/{path}?ref={ref}` - **Note**: Forgejo is a fork of Gitea with compatible API **Implementation Priority**: MEDIUM (growing community adoption) ## Extensible Platform Pattern ### Design Goals 1. **Easy to add new platforms** - Minimal code changes 2. **Abstract common operations** - Unified interface 3. **Platform-specific customization** - Handle API differences 4. **Configuration-driven** - Define platforms via config 5. **Plugin system** - External platform implementations ### Abstract Interface ```cpp // Abstract Git platform API class GitPlatformAPI { public: virtual ~GitPlatformAPI() = default; // Core operations virtual PullRequest fetch_pr_info( const std::string& owner, const std::string& repo, const std::string& pr_number, const std::string& token ) = 0; virtual std::string fetch_file_content( const std::string& owner, const std::string& repo, const std::string& file_path, const std::string& ref, const std::string& token ) = 0; // Optional operations virtual bool create_comment( const std::string& owner, const std::string& repo, const std::string& pr_number, const std::string& comment, const std::string& token ) { return false; } virtual bool update_pr_status( const std::string& owner, const std::string& repo, const std::string& pr_number, const std::string& status, const std::string& token ) { return false; } // Metadata virtual std::string platform_name() const = 0; virtual std::string api_base_url() const = 0; }; ``` ### Platform Registry ```cpp class GitPlatformRegistry { public: // Register a platform implementation void register_platform( const std::string& name, std::unique_ptr api ); // Detect platform from URL GitPlatform detect_platform(const std::string& url); // Get platform implementation GitPlatformAPI* get_platform(GitPlatform platform); // Parse PR URL (delegates to platform) PRInfo parse_pr_url(const std::string& url); }; ``` ### Platform Detection ```cpp struct URLPattern { std::string pattern; // Regex pattern GitPlatform platform; // Platform enum std::vector capture_groups; // owner, repo, pr_number, etc. }; class PlatformDetector { std::vector patterns; GitPlatform detect(const std::string& url) { for (const auto& pattern : patterns) { if (std::regex_match(url, pattern.pattern)) { return pattern.platform; } } return GitPlatform::Unknown; } }; ``` ### Configuration-Based Platform Definitions ```yaml # platforms.yml platforms: - name: bitbucket_cloud url_pattern: "(?:https?://)?bitbucket\\.org/([^/]+)/([^/]+)/pull-requests/(\\d+)" api_base_url: "https://api.bitbucket.org/2.0" auth_type: bearer_token endpoints: pr_info: "/repositories/{owner}/{repo}/pullrequests/{number}" file_content: "/repositories/{owner}/{repo}/src/{ref}/{path}" field_mappings: base_ref: "destination.branch.name" head_ref: "source.branch.name" - name: azure_devops url_pattern: "https://dev\\.azure\\.com/([^/]+)/([^/]+)/_git/([^/]+)/pullrequest/(\\d+)" api_base_url: "https://dev.azure.com/{organization}/{project}/_apis" auth_type: basic_auth endpoints: pr_info: "/git/repositories/{repo}/pullrequests/{number}?api-version=6.0" file_content: "/git/repositories/{repo}/items?path={path}&version={ref}&api-version=6.0" ``` ## Implementation Steps ### 1. Refactor Existing Code (1 week) - [ ] Extract GitHub implementation to `GitHubAPI` class - [ ] Extract GitLab implementation to `GitLabAPI` class - [ ] Create `GitPlatformAPI` interface - [ ] Create `GitPlatformRegistry` - [ ] Update `PRController` to use registry ### 2. Implement Bitbucket Support (1.5 weeks) - [ ] Create `BitbucketCloudAPI` class - [ ] Implement PR info fetching - [ ] Implement file content fetching - [ ] Handle authentication (App passwords) - [ ] Add URL pattern to detector - [ ] Unit tests - [ ] Integration tests with Bitbucket API - [ ] Create `BitbucketServerAPI` class (separate from Cloud) - [ ] Handle different API structure - [ ] Test with Bitbucket Server instance ### 3. Implement Azure DevOps Support (1.5 weeks) - [ ] Create `AzureDevOpsAPI` class - [ ] Implement PR info fetching - [ ] Implement file content fetching - [ ] Handle PAT authentication - [ ] Add URL pattern to detector - [ ] Handle both Cloud and Server versions - [ ] Unit tests - [ ] Integration tests ### 4. Implement Gitea/Forgejo Support (1 week) - [ ] Create `GiteaAPI` class - [ ] Implement PR info fetching - [ ] Implement file content fetching - [ ] Handle token authentication - [ ] Add URL pattern to detector - [ ] Unit tests - [ ] Integration tests ### 5. Configuration System (1 week) - [ ] Design YAML schema for platform definitions - [ ] Implement YAML parser - [ ] Create `ConfigBasedPlatform` class - [ ] Support dynamic platform loading - [ ] Documentation for adding custom platforms ### 6. Testing & Documentation (1 week) - [ ] Comprehensive unit tests for all platforms - [ ] Integration tests with real APIs (use test repos) - [ ] Update README.md with examples for all platforms - [ ] Create platform implementation guide - [ ] API documentation ## Example Usage ### Bitbucket Cloud ```bash # CLI ./wizardmerge-cli-frontend pr-resolve \ --url https://bitbucket.org/myworkspace/myrepo/pull-requests/42 \ --token # Or with environment variable export BITBUCKET_TOKEN= ./wizardmerge-cli-frontend pr-resolve \ --url https://bitbucket.org/myworkspace/myrepo/pull-requests/42 ``` ```bash # HTTP API curl -X POST http://localhost:8080/api/pr/resolve \ -H "Content-Type: application/json" \ -d '{ "pr_url": "https://bitbucket.org/myworkspace/myrepo/pull-requests/42", "api_token": "" }' ``` ### Azure DevOps ```bash # CLI ./wizardmerge-cli-frontend pr-resolve \ --url https://dev.azure.com/myorg/myproject/_git/myrepo/pullrequest/123 \ --token # HTTP API curl -X POST http://localhost:8080/api/pr/resolve \ -H "Content-Type: application/json" \ -d '{ "pr_url": "https://dev.azure.com/myorg/myproject/_git/myrepo/pullrequest/123", "api_token": "" }' ``` ### Gitea ```bash # CLI ./wizardmerge-cli-frontend pr-resolve \ --url https://gitea.mycompany.com/owner/repo/pulls/5 \ --token ``` ## Platform Implementation Guide For future contributors who want to add a new platform: ### Step 1: Create Platform API Class ```cpp class MyPlatformAPI : public GitPlatformAPI { public: PullRequest fetch_pr_info(...) override { // 1. Build API URL std::string url = api_base_url + "/pr/endpoint"; // 2. Make HTTP request with auth auto response = http_client.get(url, headers); // 3. Parse JSON response Json::Value root = parse_json(response.body); // 4. Map to PullRequest structure PullRequest pr; pr.base_ref = root["target_branch"].asString(); pr.head_ref = root["source_branch"].asString(); // ... map other fields return pr; } std::string fetch_file_content(...) override { // Similar pattern } std::string platform_name() const override { return "MyPlatform"; } }; ``` ### Step 2: Add URL Pattern ```cpp // In git_platform_client.cpp std::regex myplatform_regex( R"((?:https?://)?myplatform\.com/([^/]+)/([^/]+)/pr/(\\d+))" ); if (std::regex_match(pr_url, match, myplatform_regex)) { platform = GitPlatform::MyPlatform; // Extract owner, repo, pr_number from match groups } ``` ### Step 3: Register in Registry ```cpp // In main() or init() platform_registry.register_platform( "myplatform", std::make_unique() ); ``` ### Step 4: Add Tests ```cpp TEST(MyPlatformAPITest, FetchPRInfo) { MyPlatformAPI api; auto pr = api.fetch_pr_info("owner", "repo", "123", "token"); ASSERT_EQ(pr.number, "123"); ASSERT_FALSE(pr.base_ref.empty()); } ``` ## Acceptance Criteria - [ ] Bitbucket Cloud support working - [ ] Bitbucket Server support working - [ ] Azure DevOps Cloud support working - [ ] Azure DevOps Server support working - [ ] Gitea/Forgejo support working - [ ] Platform registry implemented - [ ] URL detection automatic - [ ] Configuration-based platforms supported - [ ] All platforms tested with real APIs - [ ] Documentation complete - [ ] Implementation guide available ## Priority **MEDIUM-HIGH** - Important for enterprise adoption and wider user base. ## Estimated Effort 6-8 weeks total ## Dependencies - PR resolution feature ✅ - Git CLI integration ✅ ## Related Issues - #TBD (Phase 2 tracking) - #TBD (API improvements) ## Success Metrics - Support 5+ major Git platforms - <5% error rate for each platform - Easy to add new platforms (<1 day of work) - 90% user satisfaction across platforms