From 44b62a8ebcda71a99807b0f22dde882c23c4ce65 Mon Sep 17 00:00:00 2001 From: Richard Marshall Date: Thu, 15 Aug 2019 07:25:20 -0700 Subject: [PATCH] Fix indirect git resource cycle detection --- pkg/loader/fileloader.go | 2 +- pkg/loader/fileloader_test.go | 64 +++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/pkg/loader/fileloader.go b/pkg/loader/fileloader.go index f474f2546..454092c27 100644 --- a/pkg/loader/fileloader.go +++ b/pkg/loader/fileloader.go @@ -179,7 +179,7 @@ func (fl *fileLoader) New(path string) (ifc.Loader, error) { return nil, err } return newLoaderAtGitClone( - repoSpec, fl.validator, fl.fSys, fl.referrer, fl.cloner) + repoSpec, fl.validator, fl.fSys, fl, fl.cloner) } if filepath.IsAbs(path) { return nil, fmt.Errorf("new root '%s' cannot be absolute", path) diff --git a/pkg/loader/fileloader_test.go b/pkg/loader/fileloader_test.go index ff08f01e0..7b829025c 100644 --- a/pkg/loader/fileloader_test.go +++ b/pkg/loader/fileloader_test.go @@ -530,3 +530,67 @@ func TestLocalLoaderReferencingGitBase(t *testing.T) { t.Fatalf("unexpected root %s", l2.Root()) } } + +func TestRepoDirectCycleDetection(t *testing.T) { + topDir := "/cycles" + cloneRoot := topDir + "/someClone" + fSys := fs.MakeFakeFS() + fSys.MkdirAll(topDir) + fSys.MkdirAll(cloneRoot) + + root, err := demandDirectoryRoot(fSys, topDir) + if err != nil { + t.Fatalf("unexpected err: %v\n", err) + } + l1 := newLoaderAtConfirmedDir( + RestrictionRootOnly, validators.MakeFakeValidator(), root, fSys, nil, + git.DoNothingCloner(fs.ConfirmedDir(cloneRoot))) + p1 := "github.com/someOrg/someRepo/foo" + rs1, err := git.NewRepoSpecFromUrl(p1) + if err != nil { + t.Fatalf("unexpected err: %v", err) + } + l1.repoSpec = rs1 + _, err = l1.New(p1) + if err == nil { + t.Fatalf("expected error") + } + if !strings.Contains(err.Error(), "cycle detected") { + t.Fatalf("unexpected err: %v", err) + } +} + +func TestRepoIndirectCycleDetection(t *testing.T) { + topDir := "/cycles" + cloneRoot := topDir + "/someClone" + fSys := fs.MakeFakeFS() + fSys.MkdirAll(topDir) + fSys.MkdirAll(cloneRoot) + + root, err := demandDirectoryRoot(fSys, topDir) + if err != nil { + t.Fatalf("unexpected err: %v", err) + } + l0 := newLoaderAtConfirmedDir( + RestrictionRootOnly, validators.MakeFakeValidator(), root, fSys, nil, + git.DoNothingCloner(fs.ConfirmedDir(cloneRoot))) + + p1 := "github.com/someOrg/someRepo1" + p2 := "github.com/someOrg/someRepo2" + + l1, err := l0.New(p1) + if err != nil { + t.Fatalf("unexpected err: %v", err) + } + l2, err := l1.New(p2) + if err != nil { + t.Fatalf("unexpected err: %v", err) + } + _, err = l2.New(p1) + if err == nil { + t.Fatalf("expected error") + } + if !strings.Contains(err.Error(), "cycle detected") { + t.Fatalf("unexpected err: %v", err) + } +}