1package config
2
3import (
4 "fmt"
5 "os"
6 "path/filepath"
7 "strings"
8)
9
10const (
11 InitFlagFilename = "init"
12)
13
14type ProjectInitFlag struct {
15 Initialized bool `json:"initialized"`
16}
17
18func ProjectNeedsInitialization(cfg *Config) (bool, error) {
19 if cfg == nil {
20 return false, fmt.Errorf("config not loaded")
21 }
22
23 flagFilePath := filepath.Join(cfg.Options.DataDirectory, InitFlagFilename)
24
25 _, err := os.Stat(flagFilePath)
26 if err == nil {
27 return false, nil
28 }
29
30 if !os.IsNotExist(err) {
31 return false, fmt.Errorf("failed to check init flag file: %w", err)
32 }
33
34 crushExists, err := crushMdExists(cfg.WorkingDir())
35 if err != nil {
36 return false, fmt.Errorf("failed to check for CRUSH.md files: %w", err)
37 }
38 if crushExists {
39 return false, nil
40 }
41
42 return true, nil
43}
44
45func crushMdExists(dir string) (bool, error) {
46 entries, err := os.ReadDir(dir)
47 if err != nil {
48 return false, err
49 }
50
51 for _, entry := range entries {
52 if entry.IsDir() {
53 continue
54 }
55
56 name := strings.ToLower(entry.Name())
57 if name == "crush.md" {
58 return true, nil
59 }
60 }
61
62 return false, nil
63}
64
65func MarkProjectInitialized(cfg *Config) error {
66 if cfg == nil {
67 return fmt.Errorf("config not loaded")
68 }
69 flagFilePath := filepath.Join(cfg.Options.DataDirectory, InitFlagFilename)
70
71 file, err := os.Create(flagFilePath)
72 if err != nil {
73 return fmt.Errorf("failed to create init flag file: %w", err)
74 }
75 defer file.Close()
76
77 return nil
78}
79
80func HasInitialDataConfig(cfg *Config) bool {
81 if cfg == nil {
82 return false
83 }
84 cfgPath := GlobalConfigData()
85 if _, err := os.Stat(cfgPath); err != nil {
86 return false
87 }
88 return cfg.IsConfigured()
89}