History

Fix reading git notes from nested trees (#8026)

* Fix reading notes from nested trees The GIT documentation for notes states "Permitted pathnames have the form ab/cd/ef/.../abcdef...: a sequence of directory names of two hexadecimal digits each followed by a filename with the rest of the object ID." * Add test case * Fix new lines

Filip Navara committed 7 years ago

Commit 52fda311 parent 5e67e0123 files · +49 −3Browse files

Unified · Split

23 files
  1. modules/git/notes.go +26 −14
  2. modules/git/notes_test.go +14 −0
  3. modules/git/tests/repos/repo3_notes/COMMIT_EDITMSG +1 −0
  4. modules/git/tests/repos/repo3_notes/HEAD +1 −0
  5. modules/git/tests/repos/repo3_notes/config +7 −0
  6. modules/git/tests/repos/repo3_notes/description +1 −0
  7. modules/git/tests/repos/repo3_notes/index +0 −0
  8. modules/git/tests/repos/repo3_notes/logs/HEAD +2 −0
  9. modules/git/tests/repos/repo3_notes/logs/refs/heads/master +2 −0
  10. modules/git/tests/repos/repo3_notes/objects/29/7128d6553180486c780e2f747cb6d0014bf1f6 +0 −0
  11. modules/git/tests/repos/repo3_notes/objects/2f/7e2ea1e905c14c8a98e7ce47b395592834b9ef +0 −0
  12. modules/git/tests/repos/repo3_notes/objects/3e/668dbfac39cbc80a9ff9c61eb565d944453ba4 +3 −0
  13. modules/git/tests/repos/repo3_notes/objects/42/716fdb6f261867472899d785123e6ecaa5ca02 +0 −0
  14. modules/git/tests/repos/repo3_notes/objects/56/a6051ca2b02b04ef92d5150c9ef600403cb1de +0 −0
  15. modules/git/tests/repos/repo3_notes/objects/61/6c62e75fce60d806f4afe993211705a00a2544 +0 −0
  16. modules/git/tests/repos/repo3_notes/objects/65/4c8b6b63c08bf37f638d3f521626b7fbbd4d37 +1 −0
  17. modules/git/tests/repos/repo3_notes/objects/ba/0a96fa63532d6c5087ecef070b0250ed72fa47 +0 −0
  18. modules/git/tests/repos/repo3_notes/objects/c9/34d51cee361fdee21a3f3bb1a285f5ea9bc225 +0 −0
  19. modules/git/tests/repos/repo3_notes/objects/d8/263ee9860594d2806b0dfd1bfd17528b0ba2a4 +0 −0
  20. modules/git/tests/repos/repo3_notes/objects/f3/6ad903e408cb8f4ed90bda02e3a1fd2fab7907 +0 −0
  21. modules/git/tests/repos/repo3_notes/objects/fe/c9fe57e9864fe537f02f825e377c4a8a65ad2e +0 −0
  22. modules/git/tests/repos/repo3_notes/refs/heads/master +1 −0
  23. modules/git/tests/repos/repo3_notes/refs/notes/commits +1 −0
modules/git/notes.go+26−14
@@ -6,6 +6,8 @@ package git · 5 unmodified lines
6 6
7import (7import (
8 "io/ioutil"8 "io/ioutil"
9
10 "gopkg.in/src-d/go-git.v4/plumbing/object"
9)11)
10 12
11// NotesRef is the git ref where Gitea will look for git-notes data.13// NotesRef is the git ref where Gitea will look for git-notes data.
@@ -25,13 +27,28 @@ func GetNote(repo *Repository, commitID string, note *Note) error { · 13 unmodified lines
25 return err27 return err
26 }28 }
27 29
28 entry, err := notes.GetTreeEntryByPath(commitID)30 remainingCommitID := commitID
29 if err != nil {31 path := ""
30 return err32 currentTree := notes.Tree.gogitTree
33 var file *object.File
34 for len(remainingCommitID) > 2 {
35 file, err = currentTree.File(remainingCommitID)
36 if err == nil {
37 path += remainingCommitID
38 break
39 }
40 if err == object.ErrFileNotFound {
41 currentTree, err = currentTree.Tree(remainingCommitID[0:2])
42 path += remainingCommitID[0:2] + "/"
43 remainingCommitID = remainingCommitID[2:]
44 }
45 if err != nil {
46 return err
47 }
31 }48 }
32 49
33 blob := entry.Blob()50 blob := file.Blob
34 dataRc, err := blob.DataAsync()51 dataRc, err := blob.Reader()
35 if err != nil {52 if err != nil {
36 return err53 return err
37 }54 }
@@ -43,26 +60,21 @@ func GetNote(repo *Repository, commitID string, note *Note) error { · 5 unmodified lines
43 }60 }
44 note.Message = d61 note.Message = d
45 62
46 commit, err := repo.gogitRepo.CommitObject(notes.ID)
47 if err != nil {
48 return err
49 }
50
51 commitNodeIndex, commitGraphFile := repo.CommitNodeIndex()63 commitNodeIndex, commitGraphFile := repo.CommitNodeIndex()
52 if commitGraphFile != nil {64 if commitGraphFile != nil {
53 defer commitGraphFile.Close()65 defer commitGraphFile.Close()
54 }66 }
55 67
56 commitNode, err := commitNodeIndex.Get(commit.Hash)68 commitNode, err := commitNodeIndex.Get(notes.ID)
57 if err != nil {69 if err != nil {
58 return nil70 return err
59 }71 }
60 72
61 lastCommits, err := getLastCommitForPaths(commitNode, "", []string{commitID})73 lastCommits, err := getLastCommitForPaths(commitNode, "", []string{path})
62 if err != nil {74 if err != nil {
63 return err75 return err
64 }76 }
65 note.Commit = convertCommit(lastCommits[commitID])77 note.Commit = convertCommit(lastCommits[path])
66 78
67 return nil79 return nil
68}80}
modules/git/notes_test.go+14−0
@@ -22,3 +22,17 @@ func TestGetNotes(t *testing.T) { · 21 unmodified lines
22 assert.Equal(t, []byte("Note contents\n"), note.Message)22 assert.Equal(t, []byte("Note contents\n"), note.Message)
23 assert.Equal(t, "Vladimir Panteleev", note.Commit.Author.Name)23 assert.Equal(t, "Vladimir Panteleev", note.Commit.Author.Name)
24}24}
25
26func TestGetNestedNotes(t *testing.T) {
27 repoPath := filepath.Join(testReposDir, "repo3_notes")
28 repo, err := OpenRepository(repoPath)
29 assert.NoError(t, err)
30
31 note := Note{}
32 err = GetNote(repo, "3e668dbfac39cbc80a9ff9c61eb565d944453ba4", &note)
33 assert.NoError(t, err)
34 assert.Equal(t, []byte("Note 2"), note.Message)
35 err = GetNote(repo, "ba0a96fa63532d6c5087ecef070b0250ed72fa47", &note)
36 assert.NoError(t, err)
37 assert.Equal(t, []byte("Note 1"), note.Message)
38}
modules/git/tests/repos/repo3_notes/COMMIT_EDITMSG+1−0
@@ -0,0 +1 @@
12
modules/git/tests/repos/repo3_notes/HEAD+1−0
@@ -0,0 +1 @@
1ref: refs/heads/master
modules/git/tests/repos/repo3_notes/config+7−0
@@ -0,0 +1,7 @@
1[core]
2 repositoryformatversion = 0
3 filemode = false
4 bare = false
5 logallrefupdates = true
6 symlinks = false
7 ignorecase = true
modules/git/tests/repos/repo3_notes/description+1−0
@@ -0,0 +1 @@
1Unnamed repository; edit this file 'description' to name the repository.
modules/git/tests/repos/repo3_notes/index+0−0

Binary file not shown.

modules/git/tests/repos/repo3_notes/logs/HEAD+2−0
@@ -0,0 +1,2 @@
10000000000000000000000000000000000000000 ba0a96fa63532d6c5087ecef070b0250ed72fa47 Filip Navara <filip.navara@gmail.com> 1567767895 +0200 commit (initial): 1
2ba0a96fa63532d6c5087ecef070b0250ed72fa47 3e668dbfac39cbc80a9ff9c61eb565d944453ba4 Filip Navara <filip.navara@gmail.com> 1567767909 +0200 commit: 2
modules/git/tests/repos/repo3_notes/logs/refs/heads/master+2−0
@@ -0,0 +1,2 @@
10000000000000000000000000000000000000000 ba0a96fa63532d6c5087ecef070b0250ed72fa47 Filip Navara <filip.navara@gmail.com> 1567767895 +0200 commit (initial): 1
2ba0a96fa63532d6c5087ecef070b0250ed72fa47 3e668dbfac39cbc80a9ff9c61eb565d944453ba4 Filip Navara <filip.navara@gmail.com> 1567767909 +0200 commit: 2
modules/git/tests/repos/repo3_notes/objects/29/7128d6553180486c780e2f747cb6d0014bf1f6+0−0

Binary file not shown.

modules/git/tests/repos/repo3_notes/objects/2f/7e2ea1e905c14c8a98e7ce47b395592834b9ef+0−0

Binary file not shown.

modules/git/tests/repos/repo3_notes/objects/3e/668dbfac39cbc80a9ff9c61eb565d944453ba4+3−0
@@ -0,0 +1,3 @@
1x��;�0 @�s
2�H��&v*!����4�J��(p~
3G`|oxzi���;��3� �����6� �$`�"NR�ѺXla�i�K������4r�$�\P0"ỵPQ'F_��V�N�i����*�ʗ��G���ӳK�|�Y�e��H�f��f� ���Em
modules/git/tests/repos/repo3_notes/objects/42/716fdb6f261867472899d785123e6ecaa5ca02+0−0

Binary file not shown.

modules/git/tests/repos/repo3_notes/objects/56/a6051ca2b02b04ef92d5150c9ef600403cb1de+0−0

Binary file not shown.

modules/git/tests/repos/repo3_notes/objects/61/6c62e75fce60d806f4afe993211705a00a2544+0−0

Binary file not shown.

modules/git/tests/repos/repo3_notes/objects/65/4c8b6b63c08bf37f638d3f521626b7fbbd4d37+1−0
@@ -0,0 +1 @@
1x��;�0�}��"ǿu$�RQr���K1F���1�nf��R-%w��zc�{�%7��h#�x���Q���fXѻ?j�K�� ��S#8�צ���{��M��3�> �����6Z�Q�m���8�
modules/git/tests/repos/repo3_notes/objects/ba/0a96fa63532d6c5087ecef070b0250ed72fa47+0−0

Binary file not shown.

modules/git/tests/repos/repo3_notes/objects/c9/34d51cee361fdee21a3f3bb1a285f5ea9bc225+0−0

Binary file not shown.

modules/git/tests/repos/repo3_notes/objects/d8/263ee9860594d2806b0dfd1bfd17528b0ba2a4+0−0

Binary file not shown.

modules/git/tests/repos/repo3_notes/objects/f3/6ad903e408cb8f4ed90bda02e3a1fd2fab7907+0−0

Binary file not shown.

modules/git/tests/repos/repo3_notes/objects/fe/c9fe57e9864fe537f02f825e377c4a8a65ad2e+0−0

Binary file not shown.

modules/git/tests/repos/repo3_notes/refs/heads/master+1−0
@@ -0,0 +1 @@
13e668dbfac39cbc80a9ff9c61eb565d944453ba4
modules/git/tests/repos/repo3_notes/refs/notes/commits+1−0
@@ -0,0 +1 @@
1654c8b6b63c08bf37f638d3f521626b7fbbd4d37