github.com/x-motemen/ghq@v1.6.1/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 bare = c.Bool("bare") 17 ) 18 19 if name == "" { 20 return fmt.Errorf("repository name is required") 21 } 22 23 u, err := newURL(name, false, true) 24 if err != nil { 25 return err 26 } 27 28 localRepo, err := LocalRepositoryFromURL(u, bare) 29 if err != nil { 30 return err 31 } 32 33 p := localRepo.FullPath 34 ok, err := isNotExistOrEmpty(p) 35 if err != nil { 36 return err 37 } 38 if !ok { 39 return fmt.Errorf("directory %q already exists and not empty", p) 40 } 41 42 remoteRepo, err := NewRemoteRepository(u) 43 if err != nil { 44 return err 45 } 46 47 vcsBackend, ok := vcsRegistry[vcs] 48 if !ok { 49 vcsBackend, _, err = remoteRepo.VCS() 50 if err != nil { 51 return err 52 } 53 } 54 if vcsBackend == nil { 55 return fmt.Errorf("failed to init: unsupported VCS") 56 } 57 58 initFunc := vcsBackend.Init 59 if initFunc == nil { 60 return fmt.Errorf("failed to init: unsupported VCS") 61 } 62 63 if err := os.MkdirAll(p, 0755); err != nil { 64 return err 65 } 66 67 if err := initFunc(p); err != nil { 68 return err 69 } 70 _, err = fmt.Fprintln(w, p) 71 return err 72 } 73 74 func isNotExistOrEmpty(name string) (bool, error) { 75 f, err := os.Open(name) 76 if err != nil { 77 if os.IsNotExist(err) { 78 return true, nil 79 } 80 return false, err 81 } 82 defer f.Close() 83 84 _, err = f.Readdirnames(1) 85 if err == io.EOF { 86 return true, nil 87 } 88 return false, err 89 }