11 "github.com/charmbracelet/crush/internal/fsext"
15 InitFlagFilename = "init"
18type ProjectInitFlag struct {
19 Initialized bool `json:"initialized"`
22// TODO: we need to remove the global config instance keeping it now just until everything is migrated
23var instance atomic.Pointer[Config]
25func Init(workingDir, dataDir string, debug bool) (*Config, error) {
26 cfg, err := Load(workingDir, dataDir, debug)
31 return instance.Load(), nil
35 cfg := instance.Load()
39func ProjectNeedsInitialization() (bool, error) {
42 return false, fmt.Errorf("config not loaded")
45 flagFilePath := filepath.Join(cfg.Options.DataDirectory, InitFlagFilename)
47 _, err := os.Stat(flagFilePath)
52 if !os.IsNotExist(err) {
53 return false, fmt.Errorf("failed to check init flag file: %w", err)
56 someContextFileExists, err := contextPathsExist(cfg.WorkingDir())
58 return false, fmt.Errorf("failed to check for context files: %w", err)
60 if someContextFileExists {
64 // If the working directory has no non-ignored files, skip initialization step
65 empty, err := dirHasNoVisibleFiles(cfg.WorkingDir())
67 return false, fmt.Errorf("failed to check if directory is empty: %w", err)
76func contextPathsExist(dir string) (bool, error) {
77 entries, err := os.ReadDir(dir)
82 // Create a slice of lowercase filenames for lookup with slices.Contains
84 for _, entry := range entries {
86 files = append(files, strings.ToLower(entry.Name()))
90 // Check if any of the default context paths exist in the directory
91 for _, path := range defaultContextPaths {
92 // Extract just the filename from the path
93 _, filename := filepath.Split(path)
94 filename = strings.ToLower(filename)
96 if slices.Contains(files, filename) {
104// dirHasNoVisibleFiles returns true if the directory has no files/dirs after applying ignore rules
105func dirHasNoVisibleFiles(dir string) (bool, error) {
106 files, _, err := fsext.ListDirectory(dir, nil, 1, 1)
110 return len(files) == 0, nil
113func MarkProjectInitialized() error {
116 return fmt.Errorf("config not loaded")
118 flagFilePath := filepath.Join(cfg.Options.DataDirectory, InitFlagFilename)
120 file, err := os.Create(flagFilePath)
122 return fmt.Errorf("failed to create init flag file: %w", err)
129func HasInitialDataConfig() bool {
130 cfgPath := GlobalConfigData()
131 if _, err := os.Stat(cfgPath); err != nil {
134 return Get().IsConfigured()
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list