Don't try to clone projects that have clone-depth set. Change-Id: I223d028a881a4bdf838b971634e3e6ab6487fd04
diff --git a/fs/api.go b/fs/api.go index c95fbc4..87361ae 100644 --- a/fs/api.go +++ b/fs/api.go
@@ -39,13 +39,19 @@ // ManifestOptions holds options for a Manifest file system. type ManifestOptions struct { - Manifest *manifest.Manifest + Manifest *manifest.Manifest + + // RepoCloneOption matches against the Path field of the + // repository within a manifest. RepoCloneOption []CloneOption FileCloneOption []CloneOption } // MultiFSOptions holds options for a file system with multiple manifests. type MultiFSOptions struct { + + // RepoCloneOption matches against the Path field of the + // repository within a manifest. RepoCloneOption []CloneOption FileCloneOption []CloneOption }
diff --git a/fs/gitilesfs_test.go b/fs/gitilesfs_test.go index 4411575..b19789c 100644 --- a/fs/gitilesfs_test.go +++ b/fs/gitilesfs_test.go
@@ -252,6 +252,53 @@ } } +func TestManifestFSCloneOption(t *testing.T) { + fix, err := newTestFixture() + if err != nil { + t.Fatal("newTestFixture", err) + } + defer fix.cleanup() + + mf, err := manifest.Parse([]byte(testManifest)) + if err != nil { + t.Fatal("manifest.Parse:", err) + } + + for i := range mf.Project { + mf.Project[i].CloneDepth = "1" + } + + opts := ManifestOptions{ + Manifest: mf, + } + + fs, err := NewManifestFS(fix.service, fix.cache, opts) + if err != nil { + t.Fatalf("NewManifestFS: %v", err) + } + if err := fix.mount(fs); err != nil { + log.Fatalf("MountFileSystem: %v", err) + } + + ch := fs.Inode() + for _, n := range []string{"build", "kati", "AUTHORS"} { + newCh := ch.GetChild(n) + if ch == nil { + t.Fatalf("node for %q not found. Have %s", n, ch.Children()) + } + ch = newCh + } + + giNode, ok := ch.Node().(*gitilesNode) + if !ok { + t.Fatalf("got node type %T, want *gitilesNode", ch.Node()) + } + + if giNode.clone { + t.Errorf("file had clone set.") + } +} + func TestManifestFS(t *testing.T) { fix, err := newTestFixture() if err != nil {
diff --git a/fs/manifestfs.go b/fs/manifestfs.go index fe759c9..3d5bce5 100644 --- a/fs/manifestfs.go +++ b/fs/manifestfs.go
@@ -33,6 +33,8 @@ service *gitiles.Service cache *cache.Cache + + // trees is Path => Tree map. trees map[string]*gitiles.Tree options ManifestOptions @@ -95,9 +97,14 @@ byDepth[d] = append(byDepth[d], p) } + clonablePaths := map[string]bool{} revmap := map[string]*manifest.Project{} for i, p := range fs.options.Manifest.Project { revmap[p.Path] = &fs.options.Manifest.Project[i] + + if p.CloneDepth == "" { + clonablePaths[p.Path] = true + } } // TODO(hanwen): use parallelism here. @@ -111,11 +118,13 @@ parent = ch } - clone := true - for _, e := range fs.options.RepoCloneOption { - if e.RE.FindString(p) != "" { - clone = e.Clone - break + clone, ok := clonablePaths[p] + if !ok { + for _, e := range fs.options.RepoCloneOption { + if e.RE.FindString(p) != "" { + clone = e.Clone + break + } } } @@ -231,7 +240,6 @@ result = append(result, r) } - // resmap := map[string]*gitiles.Tree{} for _, r := range result { if r.err != nil {
diff --git a/fs/multifs.go b/fs/multifs.go index c9887b0..57e9f98 100644 --- a/fs/multifs.go +++ b/fs/multifs.go
@@ -112,6 +112,7 @@ RepoCloneOption: c.root.options.RepoCloneOption, FileCloneOption: c.root.options.FileCloneOption, } + fs, err := NewManifestFS(c.root.gitiles, c.root.cache, options) if err != nil { log.Printf("NewManifestFS(%s): %v", string(content), err)