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  }