github.com/nkprince007/lab@v0.6.2-0.20171218071646-19d68b56f403/cmd/clone.go (about)

     1  package cmd
     2  
     3  import (
     4  	"log"
     5  	"os"
     6  	"strings"
     7  
     8  	"github.com/spf13/cobra"
     9  	"github.com/zaquestion/lab/internal/git"
    10  	"github.com/zaquestion/lab/internal/gitlab"
    11  )
    12  
    13  // cloneCmd represents the clone command
    14  // NOTE: There is special handling for "clone" in cmd/root.go
    15  var cloneCmd = &cobra.Command{
    16  	Use:   "clone",
    17  	Short: "",
    18  	Long: `Clone supports these shorthands
    19  - repo
    20  - namespace/repo`,
    21  	Run: func(cmd *cobra.Command, args []string) {
    22  		project, err := gitlab.FindProject(args[0])
    23  		if err == gitlab.ErrProjectNotFound {
    24  			err = git.New(append([]string{"clone"}, args...)...).Run()
    25  			if err != nil {
    26  				log.Fatal(err)
    27  			}
    28  			return
    29  		} else if err != nil {
    30  			log.Fatal(err)
    31  		}
    32  		path := project.SSHURLToRepo
    33  		if os.Getenv("DEBUG") != "" {
    34  			log.Println("clonePath:", path)
    35  		}
    36  		err = git.New(append([]string{"clone", path}, args[1:]...)...).Run()
    37  		if err != nil {
    38  			log.Fatal(err)
    39  		}
    40  
    41  		// Clone project was a fork belonging to the user so user is
    42  		// treating forks as origin. Add upstream as remoted pointing
    43  		// to forked from repo
    44  		if project.ForkedFromProject != nil &&
    45  			strings.Contains(project.PathWithNamespace, gitlab.User()) {
    46  			var dir string
    47  			if len(args) > 1 {
    48  				dir = args[1]
    49  			} else {
    50  				dir = project.Name
    51  			}
    52  			ffProject, err := gitlab.FindProject(project.ForkedFromProject.PathWithNamespace)
    53  			if err != nil {
    54  				log.Fatal(err)
    55  			}
    56  			err = git.RemoteAdd("upstream", ffProject.SSHURLToRepo, "./"+dir)
    57  			if err != nil {
    58  				log.Fatal(err)
    59  			}
    60  		}
    61  	},
    62  }
    63  
    64  func init() {
    65  	RootCmd.AddCommand(cloneCmd)
    66  }