github.com/kazu/ghq@v0.8.1-0.20180818162325-dedd532b4440/vcs.go (about) 1 package main 2 3 import ( 4 "net/url" 5 "os" 6 "path/filepath" 7 8 "github.com/kazu/ghq/utils" 9 ) 10 11 // A VCSBackend represents a VCS backend. 12 type VCSBackend struct { 13 // Clones a remote repository to local path. 14 Clone func(*url.URL, string, bool) error 15 // Updates a cloned local repository. 16 Update func(string) error 17 } 18 19 var GitBackend = &VCSBackend{ 20 Clone: func(remote *url.URL, local string, shallow bool) error { 21 dir, _ := filepath.Split(local) 22 err := os.MkdirAll(dir, 0755) 23 if err != nil { 24 return err 25 } 26 27 args := []string{"clone"} 28 if shallow { 29 args = append(args, "--depth", "1") 30 } 31 args = append(args, remote.String(), local) 32 33 return utils.Run("git", args...) 34 }, 35 Update: func(local string) error { 36 return utils.RunInDir(local, "git", "pull", "--ff-only") 37 }, 38 } 39 40 var SubversionBackend = &VCSBackend{ 41 Clone: func(remote *url.URL, local string, shallow bool) error { 42 dir, _ := filepath.Split(local) 43 err := os.MkdirAll(dir, 0755) 44 if err != nil { 45 return err 46 } 47 48 args := []string{"checkout"} 49 if shallow { 50 args = append(args, "--depth", "1") 51 } 52 args = append(args, remote.String(), local) 53 54 return utils.Run("svn", args...) 55 }, 56 Update: func(local string) error { 57 return utils.RunInDir(local, "svn", "update") 58 }, 59 } 60 61 var GitsvnBackend = &VCSBackend{ 62 // git-svn seems not supporting shallow clone currently. 63 Clone: func(remote *url.URL, local string, ignoredShallow bool) error { 64 dir, _ := filepath.Split(local) 65 err := os.MkdirAll(dir, 0755) 66 if err != nil { 67 return err 68 } 69 70 return utils.Run("git", "svn", "clone", remote.String(), local) 71 }, 72 Update: func(local string) error { 73 return utils.RunInDir(local, "git", "svn", "rebase") 74 }, 75 } 76 77 var MercurialBackend = &VCSBackend{ 78 // Mercurial seems not supporting shallow clone currently. 79 Clone: func(remote *url.URL, local string, ignoredShallow bool) error { 80 dir, _ := filepath.Split(local) 81 err := os.MkdirAll(dir, 0755) 82 if err != nil { 83 return err 84 } 85 86 return utils.Run("hg", "clone", remote.String(), local) 87 }, 88 Update: func(local string) error { 89 return utils.RunInDir(local, "hg", "pull", "--update") 90 }, 91 } 92 93 var DarcsBackend = &VCSBackend{ 94 Clone: func(remote *url.URL, local string, shallow bool) error { 95 dir, _ := filepath.Split(local) 96 err := os.MkdirAll(dir, 0755) 97 if err != nil { 98 return err 99 } 100 101 args := []string{"get"} 102 if shallow { 103 args = append(args, "--lazy") 104 } 105 args = append(args, remote.String(), local) 106 107 return utils.Run("darcs", args...) 108 }, 109 Update: func(local string) error { 110 return utils.RunInDir(local, "darcs", "pull") 111 }, 112 }