1package config
2
3import (
4 "fmt"
5 "os"
6 "path/filepath"
7 "slices"
8 "strings"
9)
10
11const (
12 InitFlagFilename = "init"
13)
14
15type ProjectInitFlag struct {
16 Initialized bool `json:"initialized"`
17}
18
19func Init(workingDir, dataDir string, debug bool, envs []string) (*Config, error) {
20 cfg, err := Load(workingDir, dataDir, debug, envs)
21 if err != nil {
22 return nil, err
23 }
24 return cfg, nil
25}
26
27func ProjectNeedsInitialization(cfg *Config) (bool, error) {
28 if cfg == nil {
29 return false, fmt.Errorf("config not loaded")
30 }
31
32 flagFilePath := filepath.Join(cfg.Options.DataDirectory, InitFlagFilename)
33
34 _, err := os.Stat(flagFilePath)
35 if err == nil {
36 return false, nil
37 }
38
39 if !os.IsNotExist(err) {
40 return false, fmt.Errorf("failed to check init flag file: %w", err)
41 }
42
43 someContextFileExists, err := contextPathsExist(cfg.WorkingDir())
44 if err != nil {
45 return false, fmt.Errorf("failed to check for context files: %w", err)
46 }
47 if someContextFileExists {
48 return false, nil
49 }
50
51 return true, nil
52}
53
54func contextPathsExist(dir string) (bool, error) {
55 entries, err := os.ReadDir(dir)
56 if err != nil {
57 return false, err
58 }
59
60 // Create a slice of lowercase filenames for lookup with slices.Contains
61 var files []string
62 for _, entry := range entries {
63 if !entry.IsDir() {
64 files = append(files, strings.ToLower(entry.Name()))
65 }
66 }
67
68 // Check if any of the default context paths exist in the directory
69 for _, path := range defaultContextPaths {
70 // Extract just the filename from the path
71 _, filename := filepath.Split(path)
72 filename = strings.ToLower(filename)
73
74 if slices.Contains(files, filename) {
75 return true, nil
76 }
77 }
78
79 return false, nil
80}
81
82func MarkProjectInitialized(cfg *Config) error {
83 if cfg == nil {
84 return fmt.Errorf("config not loaded")
85 }
86 flagFilePath := filepath.Join(cfg.Options.DataDirectory, InitFlagFilename)
87
88 file, err := os.Create(flagFilePath)
89 if err != nil {
90 return fmt.Errorf("failed to create init flag file: %w", err)
91 }
92 defer file.Close()
93
94 return nil
95}
96
97func HasInitialDataConfig(cfg *Config) bool {
98 cfgPath := GlobalConfigData()
99 if _, err := os.Stat(cfgPath); err != nil {
100 return false
101 }
102 return cfg.IsConfigured()
103}