github.com/taubyte/tau-cli@v0.1.13-0.20240326000942-487f0d57edfc/cli/commands/resources/repository/new.go (about) 1 package repositoryCommands 2 3 import ( 4 "fmt" 5 "path" 6 7 "github.com/pterm/pterm" 8 repositoryI18n "github.com/taubyte/tau-cli/i18n/repository" 9 loginLib "github.com/taubyte/tau-cli/lib/login" 10 projectLib "github.com/taubyte/tau-cli/lib/project" 11 repositoryLib "github.com/taubyte/tau-cli/lib/repository" 12 "github.com/taubyte/tau-cli/prompts" 13 authClient "github.com/taubyte/tau-cli/singletons/auth_client" 14 "github.com/taubyte/tau-cli/singletons/config" 15 "github.com/urfave/cli/v2" 16 ) 17 18 func (lib *repositoryCommands) New(ctx *cli.Context) error { 19 project, err := projectLib.SelectedProjectConfig() 20 if err != nil { 21 return err 22 } 23 24 infoIface, resource, err := lib.PromptNew(ctx) 25 if err != nil { 26 return err 27 } 28 29 var ( 30 doRegistration bool 31 cloneMethod func() error 32 ) 33 switch info := infoIface.(type) { 34 case *repositoryLib.InfoTemplate: 35 doRegistration = true 36 cloneMethod, err = handleTemplateClone(ctx, project, resource, lib, info) 37 if err != nil { 38 return err 39 } 40 41 case *repositoryLib.Info: 42 if info.DoClone { 43 cloneMethod = func() error { 44 _, err := info.Clone(project, resource.Get().RepositoryURL(), resource.Get().Branch(), prompts.GetOrAskForEmbedToken(ctx)) 45 if err != nil { 46 return err 47 } 48 49 return nil 50 } 51 } 52 53 default: 54 return fmt.Errorf("unknown return type: %T", info) 55 } 56 57 if lib.TableConfirm(ctx, resource, lib.PromptsCreateThis) { 58 if cloneMethod != nil { 59 err = cloneMethod() 60 if err != nil { 61 return err 62 } 63 } 64 65 // Register the repository 66 if doRegistration { 67 err = repositoryLib.Register(resource.Get().RepoID()) 68 if err != nil { 69 // should not fail on registration as it could already be registered 70 pterm.Warning.Println(repositoryI18n.RegisteringRepositoryFailed(resource.Get().Name(), err)) 71 } else { 72 lib.I18nRegistered(resource.Get().RepositoryURL()) 73 } 74 } 75 76 err = lib.LibNew(resource) 77 if err != nil { 78 return err 79 } 80 lib.I18nCreated(resource.Get().Name()) 81 82 return nil 83 } 84 85 return nil 86 } 87 88 func handleTemplateClone(ctx *cli.Context, project config.Project, resource Resource, lib *repositoryCommands, info *repositoryLib.InfoTemplate) (cloneMethod func() error, err error) { 89 client, err := authClient.Load() 90 if err != nil { 91 return 92 } 93 94 profile, err := loginLib.GetSelectedProfile() 95 if err != nil { 96 return 97 } 98 99 _repoId, err := client.CreateRepository(info.RepositoryName, resource.Get().Description(), info.Private) 100 if err != nil { 101 return 102 } 103 resource.Set().RepoID(_repoId) 104 resource.Set().RepoName(path.Join(profile.GitUsername, info.RepositoryName)) 105 106 cloneMethod = func() error { 107 repository, err := (&repositoryLib.Info{ 108 FullName: resource.Get().RepoName(), 109 ID: _repoId, 110 Type: lib.Type, 111 DoClone: true, 112 }).Clone(project, resource.Get().RepositoryURL(), resource.Get().Branch(), prompts.GetOrAskForEmbedToken(ctx)) 113 if err != nil { 114 return err 115 } 116 117 err = info.Info.CloneTo(repository.Root()) 118 if err != nil { 119 return err 120 } 121 122 err = repository.Commit("init", ".") 123 if err != nil { 124 return err 125 } 126 127 err = repository.Push() 128 if err != nil { 129 return err 130 } 131 132 return nil 133 } 134 135 return 136 }