init.go

  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}