github.com/motemen/ghq@v1.0.3/cmd_create.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"os"
     7  
     8  	"github.com/urfave/cli/v2"
     9  )
    10  
    11  func doCreate(c *cli.Context) error {
    12  	var (
    13  		name = c.Args().First()
    14  		vcs  = c.String("vcs")
    15  		w    = c.App.Writer
    16  	)
    17  	u, err := newURL(name, false, true)
    18  	if err != nil {
    19  		return err
    20  	}
    21  
    22  	localRepo, err := LocalRepositoryFromURL(u)
    23  	if err != nil {
    24  		return err
    25  	}
    26  
    27  	p := localRepo.FullPath
    28  	ok, err := isNotExistOrEmpty(p)
    29  	if err != nil {
    30  		return err
    31  	}
    32  	if !ok {
    33  		return fmt.Errorf("directory %q already exists and not empty", p)
    34  	}
    35  	if err := os.MkdirAll(p, 0755); err != nil {
    36  		return err
    37  	}
    38  
    39  	remoteRepo, err := NewRemoteRepository(u)
    40  	if err != nil {
    41  		return nil
    42  	}
    43  
    44  	vcsBackend, ok := vcsRegistry[vcs]
    45  	if !ok {
    46  		vcsBackend, u = remoteRepo.VCS()
    47  	}
    48  	initFunc := vcsBackend.Init
    49  	if initFunc == nil {
    50  		return fmt.Errorf("failed to init: unsupported VCS")
    51  	}
    52  	if err := initFunc(p); err != nil {
    53  		return err
    54  	}
    55  	_, err = fmt.Fprintln(w, p)
    56  	return err
    57  }
    58  
    59  func isNotExistOrEmpty(name string) (bool, error) {
    60  	f, err := os.Open(name)
    61  	if err != nil {
    62  		if os.IsNotExist(err) {
    63  			return true, nil
    64  		}
    65  		return false, err
    66  	}
    67  	defer f.Close()
    68  
    69  	_, err = f.Readdirnames(1)
    70  	if err == io.EOF {
    71  		return true, nil
    72  	}
    73  	return false, err
    74  }