github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/actor/pluginaction/plugin_repository.go (about) 1 package pluginaction 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/liamawhite/cli-with-i18n/util/configv3" 8 ) 9 10 type RepositoryNotRegisteredError struct { 11 Name string 12 } 13 14 func (e RepositoryNotRegisteredError) Error() string { 15 return fmt.Sprintf("Plugin repository %s not found", e.Name) 16 } 17 18 type RepositoryAlreadyExistsError struct { 19 Name string 20 URL string 21 } 22 23 func (e RepositoryAlreadyExistsError) Error() string { 24 return fmt.Sprintf("%s already registered as %s.", e.URL, e.Name) 25 } 26 27 type RepositoryNameTakenError struct { 28 Name string 29 } 30 31 func (e RepositoryNameTakenError) Error() string { 32 return fmt.Sprintf("Plugin repo named '%s' already exists, please use another name.", e.Name) 33 } 34 35 type AddPluginRepositoryError struct { 36 Name string 37 URL string 38 Message string 39 } 40 41 func (e AddPluginRepositoryError) Error() string { 42 return fmt.Sprintf("Could not add repository '%s' from %s: %s", e.Name, e.URL, e.Message) 43 } 44 45 func (actor Actor) AddPluginRepository(repoName string, repoURL string) error { 46 normalizedURL, err := normalizeURLPath(repoURL) 47 if err != nil { 48 return AddPluginRepositoryError{ 49 Name: repoName, 50 URL: repoURL, 51 Message: err.Error(), 52 } 53 } 54 55 repoNameLowerCased := strings.ToLower(repoName) 56 for _, repository := range actor.config.PluginRepositories() { 57 existingRepoNameLowerCased := strings.ToLower(repository.Name) 58 switch { 59 case repoNameLowerCased == existingRepoNameLowerCased && normalizedURL == repository.URL: 60 return RepositoryAlreadyExistsError{Name: repository.Name, URL: repository.URL} 61 case repoNameLowerCased == existingRepoNameLowerCased && normalizedURL != repository.URL: 62 return RepositoryNameTakenError{Name: repository.Name} 63 case repoNameLowerCased != existingRepoNameLowerCased: 64 continue 65 } 66 } 67 68 _, err = actor.client.GetPluginRepository(normalizedURL) 69 if err != nil { 70 return AddPluginRepositoryError{ 71 Name: repoName, 72 URL: normalizedURL, 73 Message: err.Error(), 74 } 75 } 76 77 actor.config.AddPluginRepository(repoName, normalizedURL) 78 return nil 79 } 80 81 func (actor Actor) GetPluginRepository(repositoryName string) (configv3.PluginRepository, error) { 82 repositoryNameLowered := strings.ToLower(repositoryName) 83 84 for _, repository := range actor.config.PluginRepositories() { 85 if repositoryNameLowered == strings.ToLower(repository.Name) { 86 return repository, nil 87 } 88 } 89 return configv3.PluginRepository{}, RepositoryNotRegisteredError{Name: repositoryName} 90 } 91 92 func (actor Actor) IsPluginRepositoryRegistered(repositoryName string) bool { 93 for _, repository := range actor.config.PluginRepositories() { 94 if repositoryName == repository.Name { 95 return true 96 } 97 } 98 return false 99 } 100 101 func normalizeURLPath(rawURL string) (string, error) { 102 prefix := "" 103 if !strings.Contains(rawURL, "://") { 104 prefix = "https://" 105 } 106 107 normalizedURL := fmt.Sprintf("%s%s", prefix, rawURL) 108 109 return strings.TrimSuffix(normalizedURL, "/"), nil 110 }