| package git |
| |
| import ( |
| "context" |
| "fmt" |
| "log" |
| "net/http" |
| "time" |
| ) |
| |
| // ExamplePullRequestUsage demonstrates how to use the pull request capabilities |
| func ExamplePullRequestUsage() { |
| ctx := context.Background() |
| |
| // Example 1: GitHub Pull Requests |
| exampleGitHubPullRequests(ctx) |
| |
| // Example 2: Gerrit Pull Requests |
| exampleGerritPullRequests(ctx) |
| } |
| |
| func exampleGitHubPullRequests(ctx context.Context) { |
| fmt.Println("=== GitHub Pull Request Example ===") |
| |
| // Create GitHub configuration |
| githubConfig := GitHubConfig{ |
| Token: "your-github-token-here", |
| BaseURL: "https://api.github.com", |
| HTTPClient: &http.Client{Timeout: 30 * time.Second}, |
| } |
| |
| // Create GitHub pull request provider |
| githubProvider := NewGitHubPullRequestProvider("owner", "repo", githubConfig) |
| |
| // Create Git instance with GitHub pull request capabilities |
| git := NewGitWithPullRequests("/path/to/repo", GitConfig{ |
| Timeout: 30 * time.Second, |
| }, githubProvider) |
| |
| // Create a new pull request |
| prOptions := PullRequestOptions{ |
| Title: "Add new feature", |
| Description: "This PR adds a new feature to the application.", |
| BaseBranch: "main", |
| HeadBranch: "feature/new-feature", |
| Labels: []string{"enhancement", "feature"}, |
| Assignees: []string{"username1", "username2"}, |
| Reviewers: []string{"reviewer1", "reviewer2"}, |
| Draft: false, |
| } |
| |
| pr, err := git.CreatePullRequest(ctx, prOptions) |
| if err != nil { |
| log.Printf("Failed to create pull request: %v", err) |
| return |
| } |
| |
| fmt.Printf("Created pull request: %s (#%d)\n", pr.Title, pr.Number) |
| |
| // List pull requests |
| listOptions := ListPullRequestOptions{ |
| State: "open", |
| Author: "username", |
| BaseBranch: "main", |
| Limit: 10, |
| } |
| |
| prs, err := git.ListPullRequests(ctx, listOptions) |
| if err != nil { |
| log.Printf("Failed to list pull requests: %v", err) |
| return |
| } |
| |
| fmt.Printf("Found %d pull requests\n", len(prs)) |
| |
| // Get a specific pull request |
| pr, err = git.GetPullRequest(ctx, pr.ID) |
| if err != nil { |
| log.Printf("Failed to get pull request: %v", err) |
| return |
| } |
| |
| fmt.Printf("Pull request status: %s\n", pr.State) |
| |
| // Update a pull request |
| updateOptions := PullRequestOptions{ |
| Title: "Updated title", |
| Description: "Updated description", |
| Labels: []string{"bug", "urgent"}, |
| } |
| |
| updatedPR, err := git.UpdatePullRequest(ctx, pr.ID, updateOptions) |
| if err != nil { |
| log.Printf("Failed to update pull request: %v", err) |
| return |
| } |
| |
| fmt.Printf("Updated pull request: %s\n", updatedPR.Title) |
| |
| // Merge a pull request |
| mergeOptions := MergePullRequestOptions{ |
| MergeMethod: "squash", |
| CommitTitle: "Merge pull request #123", |
| CommitMsg: "This merges the feature branch into main", |
| } |
| |
| err = git.MergePullRequest(ctx, pr.ID, mergeOptions) |
| if err != nil { |
| log.Printf("Failed to merge pull request: %v", err) |
| return |
| } |
| |
| fmt.Println("Pull request merged successfully") |
| } |
| |
| func exampleGerritPullRequests(ctx context.Context) { |
| fmt.Println("=== Gerrit Pull Request Example ===") |
| |
| // Create Gerrit configuration |
| gerritConfig := GerritConfig{ |
| Username: "your-username", |
| Password: "your-http-password-or-api-token", |
| BaseURL: "https://gerrit.example.com", |
| HTTPClient: &http.Client{Timeout: 30 * time.Second}, |
| } |
| |
| // Create Gerrit pull request provider |
| gerritProvider := NewGerritPullRequestProvider("project-name", gerritConfig) |
| |
| // Create Git instance with Gerrit pull request capabilities |
| git := NewGitWithPullRequests("/path/to/repo", GitConfig{ |
| Timeout: 30 * time.Second, |
| }, gerritProvider) |
| |
| // Create a new change (pull request) |
| prOptions := PullRequestOptions{ |
| Title: "Add new feature", |
| Description: "This change adds a new feature to the application.", |
| BaseBranch: "master", |
| HeadBranch: "feature/new-feature", |
| } |
| |
| pr, err := git.CreatePullRequest(ctx, prOptions) |
| if err != nil { |
| log.Printf("Failed to create change: %v", err) |
| return |
| } |
| |
| fmt.Printf("Created change: %s (#%d)\n", pr.Title, pr.Number) |
| |
| // List changes |
| listOptions := ListPullRequestOptions{ |
| State: "open", |
| Author: "username", |
| BaseBranch: "master", |
| Limit: 10, |
| } |
| |
| prs, err := git.ListPullRequests(ctx, listOptions) |
| if err != nil { |
| log.Printf("Failed to list changes: %v", err) |
| return |
| } |
| |
| fmt.Printf("Found %d changes\n", len(prs)) |
| |
| // Get a specific change |
| pr, err = git.GetPullRequest(ctx, pr.ID) |
| if err != nil { |
| log.Printf("Failed to get change: %v", err) |
| return |
| } |
| |
| fmt.Printf("Change status: %s\n", pr.State) |
| |
| // Update a change |
| updateOptions := PullRequestOptions{ |
| Title: "Updated title", |
| Description: "Updated description", |
| } |
| |
| updatedPR, err := git.UpdatePullRequest(ctx, pr.ID, updateOptions) |
| if err != nil { |
| log.Printf("Failed to update change: %v", err) |
| return |
| } |
| |
| fmt.Printf("Updated change: %s\n", updatedPR.Title) |
| |
| // Submit a change (merge) |
| mergeOptions := MergePullRequestOptions{ |
| CommitTitle: "Submit change", |
| CommitMsg: "This submits the change to master", |
| } |
| |
| err = git.MergePullRequest(ctx, pr.ID, mergeOptions) |
| if err != nil { |
| log.Printf("Failed to submit change: %v", err) |
| return |
| } |
| |
| fmt.Println("Change submitted successfully") |
| } |
| |
| // Example of using both providers in the same application |
| func ExampleMultiProviderUsage() { |
| ctx := context.Background() |
| |
| // Determine which provider to use based on configuration |
| useGitHub := true // This could come from config |
| |
| var git GitInterface |
| |
| if useGitHub { |
| // Use GitHub |
| githubConfig := GitHubConfig{ |
| Token: "github-token", |
| BaseURL: "https://api.github.com", |
| } |
| githubProvider := NewGitHubPullRequestProvider("owner", "repo", githubConfig) |
| git = NewGitWithPullRequests("/path/to/repo", GitConfig{}, githubProvider) |
| } else { |
| // Use Gerrit |
| gerritConfig := GerritConfig{ |
| Username: "gerrit-username", |
| Password: "gerrit-password", |
| BaseURL: "https://gerrit.example.com", |
| } |
| gerritProvider := NewGerritPullRequestProvider("project", gerritConfig) |
| git = NewGitWithPullRequests("/path/to/repo", GitConfig{}, gerritProvider) |
| } |
| |
| // Use the same interface regardless of provider |
| prOptions := PullRequestOptions{ |
| Title: "Cross-platform PR", |
| Description: "This works with both GitHub and Gerrit", |
| BaseBranch: "main", |
| HeadBranch: "feature/cross-platform", |
| } |
| |
| pr, err := git.CreatePullRequest(ctx, prOptions) |
| if err != nil { |
| log.Printf("Failed to create pull request: %v", err) |
| return |
| } |
| |
| fmt.Printf("Created pull request: %s\n", pr.Title) |
| } |