mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-04 12:53:43 +01:00 
			
		
		
		
	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
This commit is contained in:
		
							parent
							
								
									5e67e0100c
								
							
						
					
					
						commit
						52fda312df
					
				@ -6,6 +6,8 @@ package git
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
 | 
			
		||||
	"gopkg.in/src-d/go-git.v4/plumbing/object"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 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 {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	entry, err := notes.GetTreeEntryByPath(commitID)
 | 
			
		||||
	remainingCommitID := commitID
 | 
			
		||||
	path := ""
 | 
			
		||||
	currentTree := notes.Tree.gogitTree
 | 
			
		||||
	var file *object.File
 | 
			
		||||
	for len(remainingCommitID) > 2 {
 | 
			
		||||
		file, err = currentTree.File(remainingCommitID)
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			path += remainingCommitID
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		if err == object.ErrFileNotFound {
 | 
			
		||||
			currentTree, err = currentTree.Tree(remainingCommitID[0:2])
 | 
			
		||||
			path += remainingCommitID[0:2] + "/"
 | 
			
		||||
			remainingCommitID = remainingCommitID[2:]
 | 
			
		||||
		}
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	blob := entry.Blob()
 | 
			
		||||
	dataRc, err := blob.DataAsync()
 | 
			
		||||
	blob := file.Blob
 | 
			
		||||
	dataRc, err := blob.Reader()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
@ -43,26 +60,21 @@ func GetNote(repo *Repository, commitID string, note *Note) error {
 | 
			
		||||
	}
 | 
			
		||||
	note.Message = d
 | 
			
		||||
 | 
			
		||||
	commit, err := repo.gogitRepo.CommitObject(notes.ID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	commitNodeIndex, commitGraphFile := repo.CommitNodeIndex()
 | 
			
		||||
	if commitGraphFile != nil {
 | 
			
		||||
		defer commitGraphFile.Close()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	commitNode, err := commitNodeIndex.Get(commit.Hash)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lastCommits, err := getLastCommitForPaths(commitNode, "", []string{commitID})
 | 
			
		||||
	commitNode, err := commitNodeIndex.Get(notes.ID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	note.Commit = convertCommit(lastCommits[commitID])
 | 
			
		||||
 | 
			
		||||
	lastCommits, err := getLastCommitForPaths(commitNode, "", []string{path})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	note.Commit = convertCommit(lastCommits[path])
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -22,3 +22,17 @@ func TestGetNotes(t *testing.T) {
 | 
			
		||||
	assert.Equal(t, []byte("Note contents\n"), note.Message)
 | 
			
		||||
	assert.Equal(t, "Vladimir Panteleev", note.Commit.Author.Name)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestGetNestedNotes(t *testing.T) {
 | 
			
		||||
	repoPath := filepath.Join(testReposDir, "repo3_notes")
 | 
			
		||||
	repo, err := OpenRepository(repoPath)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	note := Note{}
 | 
			
		||||
	err = GetNote(repo, "3e668dbfac39cbc80a9ff9c61eb565d944453ba4", ¬e)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Equal(t, []byte("Note 2"), note.Message)
 | 
			
		||||
	err = GetNote(repo, "ba0a96fa63532d6c5087ecef070b0250ed72fa47", ¬e)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Equal(t, []byte("Note 1"), note.Message)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1
									
								
								modules/git/tests/repos/repo3_notes/COMMIT_EDITMSG
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								modules/git/tests/repos/repo3_notes/COMMIT_EDITMSG
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
2
 | 
			
		||||
							
								
								
									
										1
									
								
								modules/git/tests/repos/repo3_notes/HEAD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								modules/git/tests/repos/repo3_notes/HEAD
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
ref: refs/heads/master
 | 
			
		||||
							
								
								
									
										7
									
								
								modules/git/tests/repos/repo3_notes/config
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								modules/git/tests/repos/repo3_notes/config
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
[core]
 | 
			
		||||
	repositoryformatversion = 0
 | 
			
		||||
	filemode = false
 | 
			
		||||
	bare = false
 | 
			
		||||
	logallrefupdates = true
 | 
			
		||||
	symlinks = false
 | 
			
		||||
	ignorecase = true
 | 
			
		||||
							
								
								
									
										1
									
								
								modules/git/tests/repos/repo3_notes/description
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								modules/git/tests/repos/repo3_notes/description
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Unnamed repository; edit this file 'description' to name the repository.
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								modules/git/tests/repos/repo3_notes/index
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								modules/git/tests/repos/repo3_notes/index
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										2
									
								
								modules/git/tests/repos/repo3_notes/logs/HEAD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								modules/git/tests/repos/repo3_notes/logs/HEAD
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
0000000000000000000000000000000000000000 ba0a96fa63532d6c5087ecef070b0250ed72fa47 Filip Navara <filip.navara@gmail.com> 1567767895 +0200	commit (initial): 1
 | 
			
		||||
ba0a96fa63532d6c5087ecef070b0250ed72fa47 3e668dbfac39cbc80a9ff9c61eb565d944453ba4 Filip Navara <filip.navara@gmail.com> 1567767909 +0200	commit: 2
 | 
			
		||||
@ -0,0 +1,2 @@
 | 
			
		||||
0000000000000000000000000000000000000000 ba0a96fa63532d6c5087ecef070b0250ed72fa47 Filip Navara <filip.navara@gmail.com> 1567767895 +0200	commit (initial): 1
 | 
			
		||||
ba0a96fa63532d6c5087ecef070b0250ed72fa47 3e668dbfac39cbc80a9ff9c61eb565d944453ba4 Filip Navara <filip.navara@gmail.com> 1567767909 +0200	commit: 2
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
xťŽ;Â0@™s
 | 
			
		||||
ďH•ă&v*!ÄÄČś4<C59B>JôŁ(p~
 | 
			
		||||
G`|oxziťç©‘;´š3Đ –ÂČŢ÷6 ś$`¦"NRäŃşXlałiÍK<C38D>¨¨ĺŢ÷4rň$§\P0"yĚŁPQ'F_í±V¸NĎi<C48E>›ľµ*śĘ—şĺG—ű¬ÓłKë|ëY„eŔŽH<C5BD>f·űfË™ÜăEm
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@ -0,0 +1 @@
 | 
			
		||||
xќЌ;В0©}Љн‘"Зїu$„RQr‡•ЩK1F–Йщ1ЃnfЉчR-%w<>Сzcбґ{д%7Аўh#Сx¶€ЙQ¤айfXС»?jѓKЮт®ґS#8ЙЧ¦зПЦ{ЎјM©–3М> †Ёќ…Ј6Z«QЗmзїФя8В
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										1
									
								
								modules/git/tests/repos/repo3_notes/refs/heads/master
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								modules/git/tests/repos/repo3_notes/refs/heads/master
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
3e668dbfac39cbc80a9ff9c61eb565d944453ba4
 | 
			
		||||
							
								
								
									
										1
									
								
								modules/git/tests/repos/repo3_notes/refs/notes/commits
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								modules/git/tests/repos/repo3_notes/refs/notes/commits
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
654c8b6b63c08bf37f638d3f521626b7fbbd4d37
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user