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 {