mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-30 19:08:37 +00:00 
			
		
		
		
	[backport/v1.9] Fix reading git notes from nested trees (#8189)
* 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:
		
				
					committed by
					
						 techknowlogick
						techknowlogick
					
				
			
			
				
	
			
			
			
						parent
						
							91ea086ebe
						
					
				
				
					commit
					6883c007d3
				
			| @@ -7,7 +7,7 @@ package git | ||||
| import ( | ||||
| 	"io/ioutil" | ||||
|  | ||||
| 	"gopkg.in/src-d/go-git.v4/plumbing" | ||||
| 	"gopkg.in/src-d/go-git.v4/plumbing/object" | ||||
| ) | ||||
|  | ||||
| // NotesRef is the git ref where Gitea will look for git-notes data. | ||||
| @@ -27,13 +27,28 @@ func GetNote(repo *Repository, commitID string, note *Note) error { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	entry, err := notes.GetTreeEntryByPath(commitID) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	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 | ||||
| 	} | ||||
| @@ -45,26 +60,21 @@ func GetNote(repo *Repository, commitID string, note *Note) error { | ||||
| 	} | ||||
| 	note.Message = d | ||||
|  | ||||
| 	commit, err := repo.gogitRepo.CommitObject(plumbing.Hash(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 | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user