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 }