From 20c1ed3f791b056577b498169e33358a603b4eb1 Mon Sep 17 00:00:00 2001 From: jackgr Date: Mon, 28 Mar 2016 13:29:48 -0700 Subject: [PATCH] Fix repo prefix searchbug --- pkg/repo/inmem_repo_service.go | 18 +++++++++++++++++- pkg/repo/inmem_repo_service_test.go | 2 +- pkg/repo/repoprovider.go | 23 ++++------------------- pkg/repo/repoprovider_test.go | 2 +- 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/pkg/repo/inmem_repo_service.go b/pkg/repo/inmem_repo_service.go index 86d05e9db..7e048e373 100644 --- a/pkg/repo/inmem_repo_service.go +++ b/pkg/repo/inmem_repo_service.go @@ -92,10 +92,12 @@ func (rs *inmemRepoService) GetRepoByChartURL(URL string) (IRepo, error) { rs.RLock() defer rs.RUnlock() + cSplit := strings.Split(URL, "/") var found IRepo for _, r := range rs.repositories { rURL := r.GetURL() - if strings.HasPrefix(URL, rURL) { + rSplit := strings.Split(rURL, "/") + if hasPrefix(cSplit, rSplit) { if found == nil || len(found.GetURL()) < len(rURL) { found = r } @@ -109,6 +111,20 @@ func (rs *inmemRepoService) GetRepoByChartURL(URL string) (IRepo, error) { return found, nil } +func hasPrefix(cSplit, rSplit []string) bool { + if len(rSplit) > len(cSplit) { + return false + } + + for i := range rSplit { + if rSplit[i] != cSplit[i] { + return false + } + } + + return true +} + // DeleteRepo removes a known repository from the list func (rs *inmemRepoService) DeleteRepo(URL string) error { rs.Lock() diff --git a/pkg/repo/inmem_repo_service_test.go b/pkg/repo/inmem_repo_service_test.go index 4d837c3db..4c214188b 100644 --- a/pkg/repo/inmem_repo_service_test.go +++ b/pkg/repo/inmem_repo_service_test.go @@ -54,7 +54,7 @@ func TestService(t *testing.T) { t.Fatalf("invalid repo returned; want: %#v, have %#v.", tr, r1) } - URL := GCSPublicRepoURL + TestArchiveName + URL := GCSPublicRepoURL + "/" + TestArchiveName r2, err := rs.GetRepoByChartURL(URL) if err != nil { t.Fatal(err) diff --git a/pkg/repo/repoprovider.go b/pkg/repo/repoprovider.go index f5139d8d6..360810613 100644 --- a/pkg/repo/repoprovider.go +++ b/pkg/repo/repoprovider.go @@ -25,7 +25,6 @@ import ( "fmt" "log" "net/http" - "strings" "sync" ) @@ -117,35 +116,21 @@ func (rp *repoProvider) createRepo(cr IChartRepo) (IChartRepo, error) { return cr, nil } -// GetRepoByChartURL returns the repository whose URL is a prefix of the given URL. +// GetRepoByChartURL returns the repository that backs a given chart URL. func (rp *repoProvider) GetRepoByChartURL(URL string) (IChartRepo, error) { rp.Lock() defer rp.Unlock() - if r := rp.findRepoByChartURL(URL); r != nil { - return r, nil - } - cr, err := rp.rs.GetRepoByChartURL(URL) if err != nil { return nil, err } - return rp.createRepoByType(cr) -} - -func (rp *repoProvider) findRepoByChartURL(URL string) IChartRepo { - var found IChartRepo - for _, r := range rp.repos { - rURL := r.GetURL() - if strings.HasPrefix(URL, rURL) { - if found == nil || len(found.GetURL()) < len(rURL) { - found = r - } - } + if r, ok := rp.repos[cr.GetURL()]; ok { + return r, nil } - return found + return rp.createRepoByType(cr) } // GetChartByReference maps the supplied chart reference into a fully qualified diff --git a/pkg/repo/repoprovider_test.go b/pkg/repo/repoprovider_test.go index c55b82ae8..137c74a99 100644 --- a/pkg/repo/repoprovider_test.go +++ b/pkg/repo/repoprovider_test.go @@ -62,7 +62,7 @@ func TestRepoProvider(t *testing.T) { } wantRepo := haveRepo - URL := GCSPublicRepoURL + TestArchiveName + URL := GCSPublicRepoURL + "/" + TestArchiveName haveRepo, err = rp.GetRepoByChartURL(URL) if err != nil { t.Fatal(err)