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 {