From af8ab19f5def6f00081b0a6d1e5b20b76683f720 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Tue, 24 Jun 2025 10:00:28 +0300 Subject: refactor: use value semantics for GitHub and Codeberg clients MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Changed github.NewClient() to return Client instead of *Client - Changed codeberg.NewClient() to return Client instead of *Client - Updated sync_handlers.go to handle value semantics properly - Both clients only contain immutable string fields, making value semantics more appropriate docs: add comprehensive documentation - Added doc/ directory with full documentation - Created architecture overview explaining system design - Added complete API reference for all packages, types, and functions - Created configuration guide with examples - Added usage examples and common workflows - Created development guide for contributors - Updated README with links to documentation 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- internal/cli/sync_handlers.go | 24 ++++++++++++++++-------- internal/codeberg/codeberg.go | 5 ++--- internal/github/github.go | 4 ++-- 3 files changed, 20 insertions(+), 13 deletions(-) (limited to 'internal') diff --git a/internal/cli/sync_handlers.go b/internal/cli/sync_handlers.go index dd0dcf9..4fbb6cf 100644 --- a/internal/cli/sync_handlers.go +++ b/internal/cli/sync_handlers.go @@ -37,9 +37,13 @@ func HandleSyncAll(cfg *config.Config, flags *Flags) int { } // Initialize GitHub client if needed - var githubClient *github.Client + var githubClient github.Client + var hasGithubClient bool if flags.CreateGitHubRepos { - githubClient = initGitHubClient(cfg) + if client := initGitHubClient(cfg); client != nil { + githubClient = *client + hasGithubClient = true + } } syncer := sync.New(cfg, flags.WorkDir) @@ -49,8 +53,8 @@ func HandleSyncAll(cfg *config.Config, flags *Flags) int { fmt.Printf("\n[%d/%d] Syncing %s...\n", i+1, len(cfg.Repositories), repo) // Create GitHub repo if needed - if githubClient != nil { - if err := createRepoWithClient(githubClient, repo, fmt.Sprintf("Mirror of %s", repo)); err != nil { + if hasGithubClient { + if err := createRepoWithClient(&githubClient, repo, fmt.Sprintf("Mirror of %s", repo)); err != nil { fmt.Printf("ERROR: Failed to create GitHub repo %s: %v\n", repo, err) fmt.Printf("Stopping sync due to error.\n") return 1 @@ -207,7 +211,7 @@ func initGitHubClient(cfg *config.Config) *github.Client { } fmt.Println("GitHub client initialized successfully with token") - return githubClient + return &githubClient } func createRepoWithClient(client *github.Client, repoName, description string) error { @@ -230,9 +234,13 @@ func printFullSyncSeparator() { func syncCodebergRepos(cfg *config.Config, flags *Flags, repos []codeberg.Repository, repoNames []string) int { // Initialize GitHub client if needed - var githubClient *github.Client + var githubClient github.Client + var hasGithubClient bool if flags.CreateGitHubRepos { - githubClient = initGitHubClient(cfg) + if client := initGitHubClient(cfg); client != nil { + githubClient = *client + hasGithubClient = true + } } fmt.Printf("\nStarting sync of %d repositories...\n", len(repoNames)) @@ -250,7 +258,7 @@ func syncCodebergRepos(cfg *config.Config, flags *Flags, repos []codeberg.Reposi fmt.Printf("\n[%d/%d] Syncing %s...\n", i+1, len(repoNames), repoName) // Create GitHub repo if needed - if githubClient != nil && flags.CreateGitHubRepos { + if hasGithubClient && flags.CreateGitHubRepos { codebergRepo := repoMap[repoName] description := codebergRepo.Description if description == "" { diff --git a/internal/codeberg/codeberg.go b/internal/codeberg/codeberg.go index 288d1e7..4f0a76d 100644 --- a/internal/codeberg/codeberg.go +++ b/internal/codeberg/codeberg.go @@ -30,10 +30,9 @@ type Client struct { org string } -// CLAUDE: Is there a rason, that we return a pointer of Client? // NewClient creates a new Codeberg API client -func NewClient(org string) *Client { - return &Client{ +func NewClient(org string) Client { + return Client{ baseURL: "https://codeberg.org/api/v1", org: org, } diff --git a/internal/github/github.go b/internal/github/github.go index 7d6213a..479bd54 100644 --- a/internal/github/github.go +++ b/internal/github/github.go @@ -18,7 +18,7 @@ type Client struct { } // NewClient creates a new GitHub API client -func NewClient(token, org string) *Client { +func NewClient(token, org string) Client { // If no token provided, try other sources if token == "" { fmt.Println(" No token in config, trying environment variable...") @@ -52,7 +52,7 @@ func NewClient(token, org string) *Client { } else { fmt.Printf(" Using token from config (length: %d)\n", len(token)) } - return &Client{ + return Client{ token: token, org: org, } -- cgit v1.2.3