github.com/taubyte/tau-cli@v0.1.13-0.20240326000942-487f0d57edfc/cli/commands/resources/project/clone.go (about)

     1  package project
     2  
     3  import (
     4  	"os"
     5  	"path"
     6  
     7  	gosimplegit "github.com/taubyte/go-simple-git"
     8  	"github.com/taubyte/tau-cli/cli/common"
     9  	"github.com/taubyte/tau-cli/flags"
    10  	projectFlags "github.com/taubyte/tau-cli/flags/project"
    11  	"github.com/taubyte/tau-cli/i18n"
    12  	projectI18n "github.com/taubyte/tau-cli/i18n/project"
    13  	projectLib "github.com/taubyte/tau-cli/lib/project"
    14  	"github.com/taubyte/tau-cli/prompts"
    15  	projectPrompts "github.com/taubyte/tau-cli/prompts/project"
    16  	"github.com/taubyte/tau-cli/singletons/config"
    17  	"github.com/urfave/cli/v2"
    18  )
    19  
    20  func (link) Clone() common.Command {
    21  	return common.Create(
    22  		&cli.Command{
    23  			Flags: flags.Combine(
    24  				flags.Yes,
    25  				projectFlags.Loc,
    26  				flags.Branch,
    27  				flags.EmbedToken,
    28  				flags.Select,
    29  			),
    30  			Action: clone,
    31  		},
    32  	)
    33  }
    34  
    35  func clone(c *cli.Context) error {
    36  	checkEnv := !c.Bool(flags.Select.Name)
    37  
    38  	// TODO should select offer projects that are already cloned?
    39  	project, err := projectPrompts.GetOrSelect(c, checkEnv)
    40  	if err != nil {
    41  		return err
    42  	}
    43  
    44  	configProject := config.Project{
    45  		Name: project.Name,
    46  	}
    47  
    48  	// Check location flag, otherwise clone into cwd
    49  	if c.IsSet(projectFlags.Loc.Name) {
    50  		configProject.Location = c.String(projectFlags.Loc.Name)
    51  	} else {
    52  		cwd, err := os.Getwd()
    53  		if err != nil {
    54  			return i18n.GettingCwdFailed(err)
    55  		}
    56  
    57  		configProject.Location = path.Join(cwd, project.Name)
    58  	}
    59  
    60  	repository, err := projectLib.Repository(project.Name).Clone(configProject, prompts.GetOrAskForEmbedToken(c))
    61  	if err != nil {
    62  		return projectI18n.CloningProjectFailed(project.Name, err)
    63  	}
    64  
    65  	config, err := repository.Config()
    66  	if err != nil {
    67  		return err
    68  	}
    69  
    70  	branch, err := prompts.SelectABranch(c, config)
    71  	if err != nil {
    72  		return err
    73  	}
    74  
    75  	currentBranch, err := repository.CurrentBranch()
    76  	if err != nil {
    77  		return err
    78  	}
    79  	if branch != currentBranch {
    80  		return (&dualRepoHandler{
    81  			ctx:         c,
    82  			repository:  repository,
    83  			projectName: project.Name,
    84  			errorFormat: projectI18n.CheckingOutProjectFailed,
    85  			action: func(r *gosimplegit.Repository) error {
    86  				return r.Checkout(branch)
    87  			},
    88  		}).Run()
    89  	}
    90  
    91  	return nil
    92  }