From 5ffe9658f0c752e899e99b91ef17d0f1baff7325 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Thu, 28 May 2026 10:31:39 +0300 Subject: fix(clients): normalize constructor signatures and pointer returns (iq) --- internal/cli/description_sync.go | 6 ++--- internal/cli/forge_client.go | 6 ++--- internal/cli/showcase_only_handler.go | 2 +- internal/cli/sync_handlers.go | 32 +++++++++--------------- internal/codeberg/codeberg.go | 4 +-- internal/codeberg/codeberg_test.go | 47 +++++++++++++++++++++++++++++++++++ internal/github/github.go | 4 +-- 7 files changed, 69 insertions(+), 32 deletions(-) create mode 100644 internal/codeberg/codeberg_test.go diff --git a/internal/cli/description_sync.go b/internal/cli/description_sync.go index 317bcdf..6a83c1e 100644 --- a/internal/cli/description_sync.go +++ b/internal/cli/description_sync.go @@ -24,12 +24,10 @@ func syncRepoDescriptions(cfg *config.Config, dryRun bool, repoName, knownCBDesc var ghClient *github.Client var cbClient *codeberg.Client if ghOrg != nil { - c := github.NewClient(ghOrg.GitHubToken, ghOrg.Name) - ghClient = &c + ghClient = github.NewClient(ghOrg.GitHubToken, ghOrg.Name) } if cbOrg != nil { - c := codeberg.NewClient(cbOrg.Name, cbOrg.CodebergToken) - cbClient = &c + cbClient = codeberg.NewClient(cbOrg.CodebergToken, cbOrg.Name) } // Get current descriptions (use known if provided) diff --git a/internal/cli/forge_client.go b/internal/cli/forge_client.go index 690a6c8..d602803 100644 --- a/internal/cli/forge_client.go +++ b/internal/cli/forge_client.go @@ -11,10 +11,10 @@ func newRepoClientForOrg(org config.Organization) (forge.RepoClient, bool) { switch org.Host { case "git@github.com": client := github.NewClient(org.GitHubToken, org.Name) - return &client, true + return client, true case "git@codeberg.org": - client := codeberg.NewClient(org.Name, org.CodebergToken) - return &client, true + client := codeberg.NewClient(org.CodebergToken, org.Name) + return client, true default: return nil, false } diff --git a/internal/cli/showcase_only_handler.go b/internal/cli/showcase_only_handler.go index 1a2a835..b836a27 100644 --- a/internal/cli/showcase_only_handler.go +++ b/internal/cli/showcase_only_handler.go @@ -96,7 +96,7 @@ func getAllRepositories(cfg *config.Config) ([]string, error) { // Add Codeberg public repos if configured if codebergOrg := cfg.FindCodebergOrg(); codebergOrg != nil { fmt.Printf("Fetching public repositories from Codeberg user/org: %s...\n", codebergOrg.Name) - client := codeberg.NewClient(codebergOrg.Name, codebergOrg.CodebergToken) + client := codeberg.NewClient(codebergOrg.CodebergToken, codebergOrg.Name) repos, err := client.ListPublicRepos() if err != nil { diff --git a/internal/cli/sync_handlers.go b/internal/cli/sync_handlers.go index e791b45..1854b8e 100644 --- a/internal/cli/sync_handlers.go +++ b/internal/cli/sync_handlers.go @@ -95,23 +95,15 @@ func HandleSyncAll(cfg *config.Config, flags *Flags) int { } // Initialize GitHub client if needed - var githubClient github.Client - var hasGithubClient bool + var githubClient *github.Client if flags.CreateGitHubRepos { - if client := initGitHubClient(cfg); client != nil { - githubClient = *client - hasGithubClient = true - } + githubClient = initGitHubClient(cfg) } // Initialize Codeberg client if needed - var codebergClient codeberg.Client - var hasCodebergClient bool + var codebergClient *codeberg.Client if flags.CreateCodebergRepos { - if client := initCodebergClient(cfg); client != nil { - codebergClient = *client - hasCodebergClient = true - } + codebergClient = initCodebergClient(cfg) } syncer := sync.New(cfg, flags.WorkDir) @@ -138,8 +130,8 @@ func HandleSyncAll(cfg *config.Config, flags *Flags) int { } // Create GitHub repo if needed - if hasGithubClient { - if err := createRepoWithClient(&githubClient, repo, fmt.Sprintf("Mirror of %s", repo)); err != nil { + if githubClient != nil { + 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 @@ -147,7 +139,7 @@ func HandleSyncAll(cfg *config.Config, flags *Flags) int { } // Create Codeberg repo if needed - if hasCodebergClient { + if codebergClient != nil { fmt.Printf("Checking/creating Codeberg repository %s...\n", repo) if err := codebergClient.CreateRepo(repo, fmt.Sprintf("Mirror of %s", repo), false); err != nil { fmt.Printf("Warning: Failed to create Codeberg repo %s: %v\n", repo, err) @@ -196,7 +188,7 @@ func HandleSyncCodebergPublic(cfg *config.Config, flags *Flags) int { fmt.Printf("Fetching public repositories from Codeberg user/org: %s...\n", codebergOrg.Name) - client := codeberg.NewClient(codebergOrg.Name, codebergOrg.CodebergToken) + client := codeberg.NewClient(codebergOrg.CodebergToken, codebergOrg.Name) // Try fetching as organization first, then as user repos, err := client.ListPublicRepos() @@ -324,7 +316,7 @@ func createCodebergRepoIfNeeded(cfg *config.Config, repoName string) error { } fmt.Printf("Initializing Codeberg client for organization: %s\n", codebergOrg.Name) - codebergClient := codeberg.NewClient(codebergOrg.Name, codebergOrg.CodebergToken) + codebergClient := codeberg.NewClient(codebergOrg.CodebergToken, codebergOrg.Name) if !codebergClient.HasToken() { fmt.Println("Warning: No Codeberg token found. Cannot create repository.") return nil @@ -349,7 +341,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 { @@ -365,14 +357,14 @@ func initCodebergClient(cfg *config.Config) *codeberg.Client { } fmt.Printf("Initializing Codeberg client for organization: %s\n", codebergOrg.Name) - codebergClient := codeberg.NewClient(codebergOrg.Name, codebergOrg.CodebergToken) + codebergClient := codeberg.NewClient(codebergOrg.CodebergToken, codebergOrg.Name) if !codebergClient.HasToken() { fmt.Println("Warning: No Codeberg token found. Cannot create repositories.") return nil } fmt.Println("Codeberg client initialized successfully with token") - return &codebergClient + return codebergClient } func showReposToSync(repoNames []string) { diff --git a/internal/codeberg/codeberg.go b/internal/codeberg/codeberg.go index 4b5e552..0d587de 100644 --- a/internal/codeberg/codeberg.go +++ b/internal/codeberg/codeberg.go @@ -41,8 +41,8 @@ type Client struct { var _ forge.RepoClient = (*Client)(nil) // NewClient creates a new Codeberg API client -func NewClient(org, token string) Client { - c := Client{ +func NewClient(token, org string) *Client { + c := &Client{ baseURL: "https://codeberg.org/api/v1", org: org, } diff --git a/internal/codeberg/codeberg_test.go b/internal/codeberg/codeberg_test.go new file mode 100644 index 0000000..02f71dd --- /dev/null +++ b/internal/codeberg/codeberg_test.go @@ -0,0 +1,47 @@ +package codeberg + +import "testing" + +func TestNewClient_UsesTokenOrgOrderAndReturnsPointer(t *testing.T) { + t.Setenv("CODEBERG_TOKEN", "") + t.Setenv("HOME", t.TempDir()) + + const ( + token = "config-token" + org = "example-org" + ) + + client := NewClient(token, org) + if client == nil { + t.Fatal("expected non-nil client") + } + if client.token != token { + t.Fatalf("expected token %q, got %q", token, client.token) + } + if client.org != org { + t.Fatalf("expected org %q, got %q", org, client.org) + } +} + +func TestNewClient_LoadsTokenFromEnvWhenConfigTokenMissing(t *testing.T) { + t.Setenv("CODEBERG_TOKEN", "env-token") + t.Setenv("HOME", t.TempDir()) + + client := NewClient("", "example-org") + if !client.HasToken() { + t.Fatal("expected token from environment") + } + if client.token != "env-token" { + t.Fatalf("expected env token, got %q", client.token) + } +} + +func TestNewClient_HasNoTokenWhenNoSourcesAvailable(t *testing.T) { + t.Setenv("CODEBERG_TOKEN", "") + t.Setenv("HOME", t.TempDir()) + + client := NewClient("", "example-org") + if client.HasToken() { + t.Fatal("expected no token when config, env, and file are empty") + } +} diff --git a/internal/github/github.go b/internal/github/github.go index a8909a8..e48fc50 100644 --- a/internal/github/github.go +++ b/internal/github/github.go @@ -23,8 +23,8 @@ type Client struct { var _ forge.RepoClient = (*Client)(nil) // NewClient creates a new GitHub API client -func NewClient(token, org string) Client { - return Client{ +func NewClient(token, org string) *Client { + return &Client{ token: loadToken(token), org: org, } -- cgit v1.2.3