MrJack 4 days ago committed by GitHub
commit b6c1b45f8b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -38,7 +38,6 @@ type Options struct {
// Keyring is the path to the keyring for verification
Keyring string
}
// Installer provides an interface for installing helm client plugins.
type Installer interface {
// Install adds a plugin.
@ -157,8 +156,8 @@ func NewForSource(source, version string) (installer Installer, err error) {
}
// FindSource determines the correct Installer for the given source.
func FindSource(location string) (Installer, error) {
installer, err := existingVCSRepo(location)
func FindSource(location string, version string) (Installer, error) {
installer, err := existingVCSRepo(location, version)
if err != nil && err.Error() == "Cannot detect VCS" {
slog.Warn(
"cannot get information about plugin source",

@ -38,14 +38,15 @@ type VCSInstaller struct {
base
}
func existingVCSRepo(location string) (Installer, error) {
func existingVCSRepo(location string, version string) (Installer, error) {
repo, err := vcs.NewRepo("", location)
if err != nil {
return nil, err
}
i := &VCSInstaller{
Repo: repo,
base: newBase(repo.Remote()),
Repo: repo,
Version: version,
base: newBase(repo.Remote()),
}
return i, nil
}
@ -104,6 +105,17 @@ func (i *VCSInstaller) Update() error {
if err := i.Repo.Update(); err != nil {
return err
}
ref, err := i.solveVersion(i.Repo)
if err != nil {
return err
}
if ref != "" {
if err := i.setVersion(i.Repo, ref); err != nil {
return err
}
}
if !isPlugin(i.Repo.LocalPath()) {
return ErrMissingMetadata
}

@ -48,6 +48,7 @@ func (r *testRepo) UpdateVersion(version string) error {
r.current = version
return r.err
}
func (r *testRepo) IsDirty() bool { return false }
func TestVCSInstaller(t *testing.T) {
ensure.HelmHome(t)
@ -96,7 +97,7 @@ func TestVCSInstaller(t *testing.T) {
}
// Testing FindSource method, expect error because plugin code is not a cloned repository
if _, err := FindSource(i.Path()); err == nil {
if _, err := FindSource(i.Path(), ""); err == nil {
t.Fatalf("expected error for inability to find plugin source, got none")
} else if err.Error() != "cannot get information about plugin source" {
t.Fatalf("expected error for inability to find plugin source, got (%v)", err)
@ -158,7 +159,7 @@ func TestVCSInstallerUpdate(t *testing.T) {
}
// Test FindSource method for positive result
pluginInfo, err := FindSource(i.Path())
pluginInfo, err := FindSource(i.Path(), "")
if err != nil {
t.Fatal(err)
}
@ -187,3 +188,61 @@ func TestVCSInstallerUpdate(t *testing.T) {
}
}
func TestVCSInstallerUpdateWithVersion(t *testing.T) {
ensure.HelmHome(t)
if err := os.MkdirAll(helmpath.DataPath("plugins"), 0755); err != nil {
t.Fatalf("Could not create %s: %s", helmpath.DataPath("plugins"), err)
}
source := "https://github.com/adamreese/helm-env"
testRepoPath, _ := filepath.Abs("../testdata/plugdir/good/echo-v1")
repo := &testRepo{
local: testRepoPath,
remote: source,
tags: []string{"0.1.0", "0.1.1", "0.2.0"},
}
// First install without version
i, err := NewForSource(source, "")
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
vcsInstaller, ok := i.(*VCSInstaller)
if !ok {
t.Fatal("expected a VCSInstaller")
}
vcsInstaller.Repo = repo
if err := Install(i); err != nil {
t.Fatal(err)
}
// Now test update with specific version constraint
vcsInstaller.Version = "~0.1.0"
if err := Update(vcsInstaller); err != nil {
t.Fatal(err)
}
if repo.current != "0.1.1" {
t.Fatalf("expected version '0.1.1', got %q", repo.current)
}
// Test update with different version constraint
vcsInstaller.Version = "0.2.0"
if err := Update(vcsInstaller); err != nil {
t.Fatal(err)
}
if repo.current != "0.2.0" {
t.Fatalf("expected version '0.2.0', got %q", repo.current)
}
// Test update with non-existent version
vcsInstaller.Version = "0.3.0"
if err := Update(vcsInstaller); err == nil {
t.Fatal("expected error for version does not exist, got none")
} else if err.Error() != fmt.Sprintf("requested version %q does not exist for plugin %q", "0.3.0", source) {
t.Fatalf("expected error for version does not exist, got (%v)", err)
}
}

@ -29,7 +29,8 @@ import (
)
type pluginUpdateOptions struct {
names []string
names []string
version string
}
func newPluginUpdateCmd(out io.Writer) *cobra.Command {
@ -49,6 +50,7 @@ func newPluginUpdateCmd(out io.Writer) *cobra.Command {
return o.run(out)
},
}
cmd.Flags().StringVar(&o.version, "version", "", "specify a version constraint. If this is not specified, the latest version is installed")
return cmd
}
@ -70,7 +72,7 @@ func (o *pluginUpdateOptions) run(out io.Writer) error {
for _, name := range o.names {
if found := findPlugin(plugins, name); found != nil {
if err := updatePlugin(found); err != nil {
if err := updatePlugin(found, o.version); err != nil {
errorPlugins = append(errorPlugins, fmt.Errorf("failed to update plugin %s, got error (%v)", name, err))
} else {
fmt.Fprintf(out, "Updated plugin: %s\n", name)
@ -85,7 +87,7 @@ func (o *pluginUpdateOptions) run(out io.Writer) error {
return nil
}
func updatePlugin(p plugin.Plugin) error {
func updatePlugin(p plugin.Plugin, version string) error {
exactLocation, err := filepath.EvalSymlinks(p.Dir())
if err != nil {
return err
@ -95,7 +97,7 @@ func updatePlugin(p plugin.Plugin) error {
return err
}
i, err := installer.FindSource(absExactLocation)
i, err := installer.FindSource(absExactLocation, version)
if err != nil {
return err
}

Loading…
Cancel
Save