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 }