github.com/halhenke/ghq@v0.8.1-0.20180207100234-7e68f823b46d/vcs.go (about)

     1  package main
     2  
     3  import (
     4  	"net/url"
     5  	"os"
     6  	"path/filepath"
     7  
     8  	"github.com/motemen/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  }