init.go

 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}