github.com/taubyte/tau-cli@v0.1.13-0.20240326000942-487f0d57edfc/prompts/website/repository.go (about) 1 package websitePrompts 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/pterm/pterm" 8 structureSpec "github.com/taubyte/go-specs/structure" 9 "github.com/taubyte/tau-cli/common" 10 "github.com/taubyte/tau-cli/flags" 11 projectLib "github.com/taubyte/tau-cli/lib/project" 12 repositoryLib "github.com/taubyte/tau-cli/lib/repository" 13 "github.com/taubyte/tau-cli/prompts" 14 authClient "github.com/taubyte/tau-cli/singletons/auth_client" 15 "github.com/taubyte/tau-cli/singletons/templates" 16 httpClient "github.com/taubyte/tau/clients/http/auth" 17 "github.com/urfave/cli/v2" 18 ) 19 20 func RepositoryInfo(ctx *cli.Context, website *structureSpec.Website, new bool) (interface{}, error) { 21 if new && prompts.GetGenerateRepository(ctx) { 22 return repositoryInfoGenerate(ctx, website) 23 } 24 25 selectedRepository, err := prompts.SelectARepository(ctx, &repositoryLib.Info{ 26 Type: repositoryLib.WebsiteRepositoryType, 27 FullName: website.RepoName, 28 ID: website.RepoID, 29 }) 30 if err != nil { 31 return nil, err 32 } 33 34 website.RepoID = selectedRepository.ID 35 website.RepoName = selectedRepository.FullName 36 37 projectConfig, err := projectLib.SelectedProjectConfig() 38 if err != nil { 39 return nil, err 40 } 41 42 if !selectedRepository.HasBeenCloned(projectConfig, website.Provider) { 43 selectedRepository.DoClone = prompts.GetClone(ctx) 44 } 45 46 return selectedRepository, nil 47 48 } 49 50 func isRepositoryNameTaken(client *httpClient.Client, name string) (bool, error) { 51 var fullName string 52 if len(strings.Split(name, "/")) == 2 { 53 fullName = name 54 } else { 55 userInfo, err := client.User().Get() 56 if err != nil { 57 return false, err 58 } 59 60 fullName = fmt.Sprintf("%s/%s", userInfo.Login, name) 61 } 62 63 // Considering name to be taken if err is nil 64 _, err := client.GetRepositoryByName(fullName) 65 if err == nil { 66 return true, nil 67 } 68 69 return false, nil 70 } 71 72 // Only called by new 73 func repositoryInfoGenerate(ctx *cli.Context, website *structureSpec.Website) (*repositoryLib.InfoTemplate, error) { 74 var repositoryName string 75 if ctx.IsSet(flags.RepositoryName.Name) { 76 repositoryName = ctx.String(flags.RepositoryName.Name) 77 } else { 78 repositoryName = fmt.Sprintf(common.WebsiteRepoPrefix, website.Name) 79 } 80 81 // Confirm name is valid 82 client, err := authClient.Load() 83 if err != nil { 84 return nil, err 85 } 86 87 // Skipping prompt for repository name unless set, or generated name is already taken 88 for taken, err := isRepositoryNameTaken(client, repositoryName); taken; { 89 if err != nil { 90 return nil, err 91 } 92 93 pterm.Warning.Printfln("Repository name %s is already taken", repositoryName) 94 repositoryName = prompts.GetOrRequireARepositoryName(ctx) 95 96 taken, err = isRepositoryNameTaken(client, repositoryName) 97 } 98 99 private := prompts.GetPrivate(ctx) 100 101 templateMap, err := templates.Get().Websites() 102 if err != nil { 103 // TODO verbose 104 return nil, err 105 } 106 107 templateUrl, err := prompts.SelectATemplate(ctx, templateMap) 108 if err != nil { 109 return nil, err 110 } 111 112 return &repositoryLib.InfoTemplate{ 113 RepositoryName: repositoryName, 114 Info: templates.TemplateInfo{ 115 URL: templateUrl, 116 // TODO Update website template description style 117 // Description: website.Description, 118 }, 119 Private: private, 120 }, nil 121 }