init.go 1.9 KB

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