summaryrefslogtreecommitdiff
path: root/internal/cli/description_sync.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/cli/description_sync.go')
-rw-r--r--internal/cli/description_sync.go113
1 files changed, 113 insertions, 0 deletions
diff --git a/internal/cli/description_sync.go b/internal/cli/description_sync.go
new file mode 100644
index 0000000..ae275ce
--- /dev/null
+++ b/internal/cli/description_sync.go
@@ -0,0 +1,113 @@
+package cli
+
+import (
+ "fmt"
+ "strings"
+
+ "codeberg.org/snonux/gitsyncer/internal/codeberg"
+ "codeberg.org/snonux/gitsyncer/internal/config"
+ "codeberg.org/snonux/gitsyncer/internal/github"
+)
+
+// syncRepoDescriptions ensures both platforms have the canonical description
+// Precedence: Codeberg > GitHub; if Codeberg empty and GitHub has one, use GitHub.
+// knownCBDesc and knownGHDesc can be empty; the function fetches as needed.
+func syncRepoDescriptions(cfg *config.Config, dryRun bool, repoName, knownCBDesc, knownGHDesc string, cache map[string]string) {
+ // Load orgs
+ ghOrg := cfg.FindGitHubOrg()
+ cbOrg := cfg.FindCodebergOrg()
+
+ var ghClient *github.Client
+ var cbClient *codeberg.Client
+ if ghOrg != nil {
+ c := github.NewClient(ghOrg.GitHubToken, ghOrg.Name)
+ ghClient = &c
+ }
+ if cbOrg != nil {
+ c := codeberg.NewClient(cbOrg.Name, cbOrg.CodebergToken)
+ cbClient = &c
+ }
+
+ // Get current descriptions (use known if provided)
+ cbDesc := strings.TrimSpace(knownCBDesc)
+ ghDesc := strings.TrimSpace(knownGHDesc)
+ var cbExists, ghExists bool
+
+ if cbDesc == "" && cbClient != nil {
+ if repo, exists, err := cbClient.GetRepo(repoName); err == nil {
+ cbExists = exists
+ if exists {
+ cbDesc = strings.TrimSpace(repo.Description)
+ }
+ } else {
+ fmt.Printf(" Warning: Codeberg repo lookup failed: %v\n", err)
+ }
+ } else if cbClient != nil {
+ cbExists = true
+ }
+
+ if ghClient != nil {
+ if ghDesc == "" || !ghExists {
+ if repo, exists, err := ghClient.GetRepo(repoName); err == nil {
+ ghExists = exists
+ if exists {
+ ghDesc = strings.TrimSpace(repo.Description)
+ }
+ } else {
+ fmt.Printf(" Warning: GitHub repo lookup failed: %v\n", err)
+ }
+ }
+ }
+
+ // Determine canonical description
+ canonical := cbDesc
+ if canonical == "" {
+ canonical = ghDesc
+ }
+ canonical = strings.TrimSpace(canonical)
+
+ // If nothing to sync, bail
+ if canonical == "" {
+ return
+ }
+
+ // Update Codeberg if needed
+ if cbClient != nil && cbExists {
+ if cbDesc != canonical {
+ if dryRun {
+ fmt.Printf(" [DRY RUN] Would update Codeberg description for %s -> %q\n", repoName, canonical)
+ } else if cbClient.HasToken() {
+ if err := cbClient.UpdateRepoDescription(repoName, canonical); err != nil {
+ fmt.Printf(" Warning: Failed to update Codeberg description: %v\n", err)
+ } else {
+ fmt.Printf(" Updated Codeberg description for %s\n", repoName)
+ }
+ } else {
+ fmt.Println(" Warning: No Codeberg token; cannot update description")
+ }
+ }
+ }
+
+ // Update GitHub if needed
+ if ghClient != nil && ghExists {
+ if ghDesc != canonical {
+ if dryRun {
+ fmt.Printf(" [DRY RUN] Would update GitHub description for %s -> %q\n", repoName, canonical)
+ } else if ghClient.HasToken() {
+ if err := ghClient.UpdateRepoDescription(repoName, canonical); err != nil {
+ fmt.Printf(" Warning: Failed to update GitHub description: %v\n", err)
+ } else {
+ fmt.Printf(" Updated GitHub description for %s\n", repoName)
+ }
+ } else {
+ fmt.Println(" Warning: No GitHub token; cannot update description")
+ }
+ }
+ }
+
+ // Update cache
+ if cache != nil {
+ cache[repoName] = canonical
+ }
+}
+