github.com/Redstoneguy129/cli@v0.0.0-20230211220159-15dca4e91917/internal/init/init.go (about) 1 package init 2 3 import ( 4 _ "embed" 5 "errors" 6 "os" 7 "path/filepath" 8 9 "github.com/Redstoneguy129/cli/internal/utils" 10 "github.com/spf13/afero" 11 ) 12 13 var ( 14 //go:embed templates/init_gitignore 15 initGitignore []byte 16 17 errAlreadyInitialized = errors.New("Project already initialized. Remove " + utils.Bold(utils.ConfigPath) + " to reinitialize.") 18 ) 19 20 func Run(fsys afero.Fs) error { 21 // Sanity checks. 22 { 23 if _, err := fsys.Stat(utils.ConfigPath); err == nil { 24 return errAlreadyInitialized 25 } else if !errors.Is(err, os.ErrNotExist) { 26 return err 27 } 28 } 29 30 // 1. Write `config.toml`. 31 if err := utils.WriteConfig(fsys, false); err != nil { 32 return err 33 } 34 35 // 2. Create `seed.sql`. 36 if _, err := fsys.Create(utils.SeedDataPath); err != nil { 37 return err 38 } 39 40 // 3. Append to `.gitignore`. 41 if gitRoot, _ := utils.GetGitRoot(fsys); gitRoot == nil { 42 // User not using git 43 return nil 44 } 45 46 ignorePath := filepath.Join(filepath.Dir(utils.ConfigPath), ".gitignore") 47 return updateGitIgnore(ignorePath, fsys) 48 } 49 50 func updateGitIgnore(ignorePath string, fsys afero.Fs) error { 51 var contents []byte 52 53 if contained, err := afero.FileContainsBytes(fsys, ignorePath, initGitignore); contained { 54 return nil 55 } else if err == nil { 56 // Add a line break when appending 57 contents = append(contents, '\n') 58 } else if !errors.Is(err, os.ErrNotExist) { 59 return err 60 } 61 62 f, err := fsys.OpenFile(ignorePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) 63 if err != nil { 64 return err 65 } 66 defer f.Close() 67 68 if _, err := f.Write(append(contents, initGitignore...)); err != nil { 69 return err 70 } 71 72 return nil 73 }