From ec4c9005150457ac37d77bf50aa4117bd82a51da Mon Sep 17 00:00:00 2001 From: Taylor Blau Date: Tue, 16 May 2017 12:10:58 -0600 Subject: [PATCH] git/odb: encode submodules as commit-type tree entries --- git/odb/tree.go | 11 ++++++++++- git/odb/tree_test.go | 18 +++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/git/odb/tree.go b/git/odb/tree.go index 9589b1e6..56399ff7 100644 --- a/git/odb/tree.go +++ b/git/odb/tree.go @@ -67,7 +67,16 @@ func (t *Tree) Decode(from io.Reader, size int64) (n int, err error) { case syscall.S_IFLNK: typ = BlobObjectType default: - panic(fmt.Sprintf("git/odb: unknown object type: %q %q", modes, fname)) + if mode == 0xe000 { + // Mode 0xe000, or a gitlink, has no formal + // filesystem (`syscall.S_IF`) equivalent. + // + // Safeguard that catch here, or otherwise + // panic. + typ = CommitObjectType + } else { + panic(fmt.Sprintf("git/odb: unknown object type: %q %q", modes, fname)) + } } entries = append(entries, &TreeEntry{ diff --git a/git/odb/tree_test.go b/git/odb/tree_test.go index 69006c4a..bdbf02f2 100644 --- a/git/odb/tree_test.go +++ b/git/odb/tree_test.go @@ -29,6 +29,12 @@ func TestTreeEncoding(t *testing.T) { Oid: []byte("bbbbbbbbbbbbbbbbbbbb"), Filemode: 040000, }, + { + Name: "submodule", + Type: CommitObjectType, + Oid: []byte("cccccccccccccccccccc"), + Filemode: 0160000, + }, }, } @@ -40,6 +46,7 @@ func TestTreeEncoding(t *testing.T) { assertTreeEntry(t, buf, "a.dat", BlobObjectType, []byte("aaaaaaaaaaaaaaaaaaaa"), 0100644) assertTreeEntry(t, buf, "subdir", TreeObjectType, []byte("bbbbbbbbbbbbbbbbbbbb"), 040000) + assertTreeEntry(t, buf, "submodule", CommitObjectType, []byte("cccccccccccccccccccc"), 0160000) assert.Equal(t, 0, buf.Len()) } @@ -55,6 +62,9 @@ func TestTreeDecoding(t *testing.T) { fmt.Fprintf(from, "%s %s\x00%s", strconv.FormatInt(int64(0120000), 8), "symlink", []byte("cccccccccccccccccccc")) + fmt.Fprintf(from, "%s %s\x00%s", + strconv.FormatInt(int64(0160000), 8), + "submodule", []byte("dddddddddddddddddddd")) flen := from.Len() @@ -64,7 +74,7 @@ func TestTreeDecoding(t *testing.T) { assert.Nil(t, err) assert.Equal(t, flen, n) - require.Equal(t, 3, len(tree.Entries)) + require.Equal(t, 4, len(tree.Entries)) assert.Equal(t, &TreeEntry{ Name: "a.dat", Type: BlobObjectType, @@ -83,6 +93,12 @@ func TestTreeDecoding(t *testing.T) { Oid: []byte("cccccccccccccccccccc"), Filemode: 0120000, }, tree.Entries[2]) + assert.Equal(t, &TreeEntry{ + Name: "submodule", + Type: CommitObjectType, + Oid: []byte("dddddddddddddddddddd"), + Filemode: 0160000, + }, tree.Entries[3]) } func assertTreeEntry(t *testing.T, buf *bytes.Buffer,