Add empty directory for submodule. Change-Id: I2e589dc780dee15b45911e3c3c57ff2cd25c795d
diff --git a/fs/gitilesfs.go b/fs/gitilesfs.go index a43c5fd..77562eb 100644 --- a/fs/gitilesfs.go +++ b/fs/gitilesfs.go
@@ -351,10 +351,22 @@ return &dirNode{nodefs.NewDefaultNode()} } +func (r *gitilesRoot) pathTo(fsConn *nodefs.FileSystemConnector, dir string) *nodefs.Inode { + parent, left := fsConn.Node(r.Inode(), dir) + for _, l := range left { + ch := parent.NewChild(l, true, newDirNode()) + parent = ch + } + return parent +} + func (r *gitilesRoot) onMount(fsConn *nodefs.FileSystemConnector) error { for _, e := range r.tree.Entries { if e.Type == "commit" { - // TODO(hanwen): support submodules. + // TODO(hanwen): support submodules. For now, + // we pretend we are plain git, which also + // leaves an empty directory in the place of a submodule. + r.pathTo(fsConn, e.Name) continue } if e.Type != "blob" { @@ -364,14 +376,10 @@ p := e.Name dir, base := filepath.Split(p) - parent, left := fsConn.Node(r.Inode(), dir) - for _, l := range left { - ch := parent.NewChild(l, true, newDirNode()) - parent = ch - } + parent := r.pathTo(fsConn, dir) id, err := git.NewOid(e.ID) if err != nil { - return nil + return err } // Determine if file should trigger a clone.
diff --git a/fs/gitilesfs_test.go b/fs/gitilesfs_test.go index dec33e6..9d17b30 100644 --- a/fs/gitilesfs_test.go +++ b/fs/gitilesfs_test.go
@@ -296,6 +296,35 @@ } } +func TestGitilesFSSubmodule(t *testing.T) { + fix, err := newTestFixture() + if err != nil { + t.Fatal("newTestFixture", err) + } + defer fix.cleanup() + + repoService := fix.service.NewRepoService("platform/build/kati") + + tree := &gitiles.Tree{ + ID: "ffffbadf691d36e8048b63f89d1a86ee5fa4325c", + Entries: []gitiles.TreeEntry{{ + Name: "submod", + Type: "commit", + ID: "ce34badf691d36e8048b63f89d1a86ee5fa4325c", + }}, + } + fs := NewGitilesRoot(fix.cache, tree, repoService, GitilesOptions{}) + if err := fix.mount(fs); err != nil { + t.Fatal("mount", err) + } + + if fi, err := os.Lstat(filepath.Join(fix.mntDir, "submod")); err != nil { + t.Fatalf("Stat(submod): %v", err) + } else if !fi.IsDir() { + t.Errorf("Stat(submod): got mode %x, want dir", fi.Mode()) + } +} + func TestGitilesFS(t *testing.T) { fix, err := newTestFixture() if err != nil {