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  }