blob: 5e34dc4be046d32ea5b65812b572304b0ade733d [file] [log] [blame]
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)
}