summaryrefslogtreecommitdiff
path: root/internal/cli/showcase_only_handler.go
blob: 1a2a835e6d4a68b751194f79e09ed2b1cd08cec3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package cli

import (
	"fmt"
	"log"

	"codeberg.org/snonux/gitsyncer/internal/codeberg"
	"codeberg.org/snonux/gitsyncer/internal/config"
	"codeberg.org/snonux/gitsyncer/internal/github"
	"codeberg.org/snonux/gitsyncer/internal/showcase"
	"codeberg.org/snonux/gitsyncer/internal/sync"
)

// HandleShowcaseOnly handles showcase generation without syncing
// It will clone repositories if they don't exist locally, but won't sync changes
func HandleShowcaseOnly(cfg *config.Config, flags *Flags) int {
	// If a specific repo is requested, only generate for that repo
	if flags.SyncRepo != "" {
		repo := flags.SyncRepo

		// Ensure the repository is cloned
		syncer := sync.New(cfg, flags.WorkDir)
		syncer.SetBackupEnabled(false)
		if err := syncer.EnsureRepositoryCloned(repo); err != nil {
			fmt.Printf("ERROR: Failed to clone %s: %v\n", repo, err)
			return 1
		}

		// Generate showcase for just this repository
		fmt.Printf("\nGenerating showcase for repository: %s...\n", repo)
		generator := showcase.New(cfg, flags.WorkDir)
		if flags.AITool != "" {
			generator.SetAITool(flags.AITool)
		}
		if err := generator.GenerateShowcase([]string{repo}, flags.Force); err != nil {
			log.Printf("ERROR: Failed to generate showcase for %s: %v\n", repo, err)
			return 1
		}
		fmt.Println("Showcase generation completed!")
		return 0
	}

	// Otherwise, process all repositories
	allRepos, err := getAllRepositories(cfg)
	if err != nil {
		log.Printf("ERROR: Failed to get repositories: %v\n", err)
		return 1
	}
	if len(allRepos) == 0 {
		fmt.Println("No repositories found")
		return 1
	}
	fmt.Printf("Found %d repositories total\n", len(allRepos))

	// Create a minimal syncer just for cloning
	syncer := sync.New(cfg, flags.WorkDir)
	syncer.SetBackupEnabled(false) // Never use backup in showcase-only mode

	// Ensure repositories are cloned (but not synced)
	fmt.Println("\nEnsuring repositories are cloned locally...")
	for _, repo := range allRepos {
		if err := syncer.EnsureRepositoryCloned(repo); err != nil {
			fmt.Printf("WARNING: Failed to clone %s: %v\n", repo, err)
			// Continue with other repos
		}
	}

	// Generate showcase for all repositories
	fmt.Println("\nGenerating showcase for all repositories...")
	generator := showcase.New(cfg, flags.WorkDir)

	// Set AI tool if specified
	if flags.AITool != "" {
		generator.SetAITool(flags.AITool)
	}

	// Pass empty filter to process all repos
	if err := generator.GenerateShowcase(nil, flags.Force); err != nil {
		log.Printf("ERROR: Failed to generate showcase: %v\n", err)
		return 1
	}

	fmt.Println("Showcase generation completed!")
	return 0
}

// getAllRepositories collects all unique repository names from all sources
func getAllRepositories(cfg *config.Config) ([]string, error) {
	repoMap := make(map[string]bool)

	// Add configured repositories
	for _, repo := range cfg.Repositories {
		repoMap[repo] = true
	}

	// 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)

		repos, err := client.ListPublicRepos()
		if err != nil {
			// Try as user
			repos, err = client.ListUserPublicRepos()
			if err != nil {
				fmt.Printf("Warning: Failed to fetch Codeberg repos: %v\n", err)
			}
		}

		for _, repo := range repos {
			repoMap[repo.Name] = true
		}
	}

	// Add GitHub public repos if configured
	if githubOrg := cfg.FindGitHubOrg(); githubOrg != nil {
		fmt.Printf("Fetching public repositories from GitHub user/org: %s...\n", githubOrg.Name)
		client := github.NewClient(githubOrg.GitHubToken, githubOrg.Name)

		if client.HasToken() {
			repos, err := client.ListPublicRepos()
			if err != nil {
				fmt.Printf("Warning: Failed to fetch GitHub repos: %v\n", err)
			} else {
				for _, repo := range repos {
					repoMap[repo.Name] = true
				}
			}
		} else {
			fmt.Println("Warning: No GitHub token found, skipping GitHub repos")
		}
	}

	// Convert map to slice
	var allRepos []string
	for repo := range repoMap {
		allRepos = append(allRepos, repo)
	}

	return allRepos, nil
}