github.com/taubyte/tau-cli@v0.1.13-0.20240326000942-487f0d57edfc/cli/commands/resources/project/import.go (about) 1 package project 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/google/go-github/v53/github" 8 "github.com/taubyte/tau-cli/cli/common" 9 "github.com/taubyte/tau-cli/env" 10 "github.com/taubyte/tau-cli/flags" 11 "github.com/taubyte/tau-cli/i18n" 12 projectI18n "github.com/taubyte/tau-cli/i18n/project" 13 repositoryI18n "github.com/taubyte/tau-cli/i18n/repository" 14 singletonsI18n "github.com/taubyte/tau-cli/i18n/singletons" 15 loginLib "github.com/taubyte/tau-cli/lib/login" 16 "github.com/taubyte/tau-cli/prompts" 17 authClient "github.com/taubyte/tau-cli/singletons/auth_client" 18 "github.com/taubyte/tau-cli/singletons/session" 19 httpClient "github.com/taubyte/tau/clients/http/auth" 20 slices "github.com/taubyte/utils/slices/string" 21 "github.com/urfave/cli/v2" 22 ) 23 24 func (link) Import() common.Command { 25 return common.Create( 26 &cli.Command{ 27 Action: _import, 28 Flags: []cli.Flag{ 29 &cli.StringFlag{ 30 Name: "config", 31 }, 32 &cli.StringFlag{ 33 Name: "code", 34 }, 35 flags.Yes, 36 }, 37 }, 38 ) 39 } 40 41 func _import(ctx *cli.Context) error { 42 if network, _ := env.GetSelectedNetwork(); len(network) < 1 { 43 return singletonsI18n.NoNetworkSelected() 44 } 45 46 profile, err := loginLib.GetSelectedProfile() 47 if err != nil { 48 return err 49 } 50 51 repos, err := ListRepos(ctx.Context, profile.Token, profile.GitUsername) 52 if err != nil { 53 return err 54 } 55 56 repoMap := make(map[string]*github.Repository, len(repos)) 57 configRepos := make([]string, 0, len(repos)) 58 codeRepos := make([]string, 0, len(repos)) 59 for _, repo := range repos { 60 splitName := strings.SplitN(repo.GetName(), "_", 3) 61 if len(splitName) < 2 || splitName[0] != "tb" || splitName[1] == "library" || splitName[1] == "website" { 62 continue 63 } 64 65 fullName := repo.GetFullName() 66 switch splitName[1] { 67 case "code": 68 codeRepos = append(codeRepos, fullName) 69 default: 70 configRepos = append(configRepos, fullName) 71 } 72 repoMap[fullName] = repo 73 } 74 75 configRepoName := prompts.GetOrAskForSelection(ctx, "config", "Config:", configRepos) 76 configSplit := strings.SplitN(configRepoName, "_", 2) 77 codeSplit := []string{configSplit[0], "code", configSplit[1]} 78 codeRepoName := strings.Join(codeSplit, "_") 79 80 var prev []string 81 if slices.Contains(codeRepos, codeRepoName) { 82 prev = append(prev, codeRepoName) 83 } 84 85 codeRepoName = prompts.GetOrAskForSelection(ctx, "code", "Code:", codeRepos, prev...) 86 codeRepo, ok := repoMap[codeRepoName] 87 if !ok { 88 return i18n.ErrorDoesNotExist("code repo", codeRepoName) 89 } 90 91 configRepo, ok := repoMap[configRepoName] 92 if !ok { 93 return i18n.ErrorDoesNotExist("config repo", configRepoName) 94 } 95 96 clientProject := &httpClient.Project{ 97 Name: configSplit[1], 98 } 99 100 auth, err := authClient.Load() 101 if err != nil { 102 return err 103 } 104 105 codeId := fmt.Sprintf("%d", codeRepo.GetID()) 106 configId := fmt.Sprintf("%d", configRepo.GetID()) 107 108 if err = auth.RegisterRepository(codeId); err != nil { 109 return repositoryI18n.RegisteringRepositoryFailed(codeRepoName, err) 110 } 111 112 if err = auth.RegisterRepository(configId); err != nil { 113 return repositoryI18n.RegisteringRepositoryFailed(configRepoName, err) 114 } 115 116 if err = clientProject.Create(auth, configId, codeId); err != nil { 117 return projectI18n.CreatingProjectFailed(err) 118 } 119 120 projectI18n.ImportedProject(clientProject.Name, profile.Network) 121 122 if prompts.ConfirmPrompt(ctx, fmt.Sprintf("select `%s` as current project?", clientProject.Name)) { 123 if err = session.Set().SelectedProject(clientProject.Name); err != nil { 124 return projectI18n.SelectingAProjectPromptFailed(err) 125 } 126 127 projectI18n.SelectedProject(clientProject.Name) 128 checkProjectClonedHelp(clientProject.Name) 129 } 130 131 return nil 132 }