aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilip Navara2019-09-15 23:59:08 +0200
committertechknowlogick2019-09-15 17:59:08 -0400
commit6883c007d3993416cdb38692cd5d5faa333046de (patch)
tree3c5dad05f52ec9f0853815b7c06eba6a219b4afd
parent91ea086ebedb55e049bfbacb31662493bc7bb883 (diff)
[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
-rw-r--r--modules/git/notes.go40
-rw-r--r--modules/git/notes_test.go14
-rw-r--r--modules/git/tests/repos/repo3_notes/COMMIT_EDITMSG1
-rw-r--r--modules/git/tests/repos/repo3_notes/HEAD1
-rw-r--r--modules/git/tests/repos/repo3_notes/config7
-rw-r--r--modules/git/tests/repos/repo3_notes/description1
-rw-r--r--modules/git/tests/repos/repo3_notes/indexbin0 -> 145 bytes
-rw-r--r--modules/git/tests/repos/repo3_notes/logs/HEAD2
-rw-r--r--modules/git/tests/repos/repo3_notes/logs/refs/heads/master2
-rw-r--r--modules/git/tests/repos/repo3_notes/objects/29/7128d6553180486c780e2f747cb6d0014bf1f6bin0 -> 55 bytes
-rw-r--r--modules/git/tests/repos/repo3_notes/objects/2f/7e2ea1e905c14c8a98e7ce47b395592834b9efbin0 -> 81 bytes
-rw-r--r--modules/git/tests/repos/repo3_notes/objects/3e/668dbfac39cbc80a9ff9c61eb565d944453ba43
-rw-r--r--modules/git/tests/repos/repo3_notes/objects/42/716fdb6f261867472899d785123e6ecaa5ca02bin0 -> 44 bytes
-rw-r--r--modules/git/tests/repos/repo3_notes/objects/56/a6051ca2b02b04ef92d5150c9ef600403cb1debin0 -> 16 bytes
-rw-r--r--modules/git/tests/repos/repo3_notes/objects/61/6c62e75fce60d806f4afe993211705a00a2544bin0 -> 21 bytes
-rw-r--r--modules/git/tests/repos/repo3_notes/objects/65/4c8b6b63c08bf37f638d3f521626b7fbbd4d371
-rw-r--r--modules/git/tests/repos/repo3_notes/objects/ba/0a96fa63532d6c5087ecef070b0250ed72fa47bin0 -> 125 bytes
-rw-r--r--modules/git/tests/repos/repo3_notes/objects/c9/34d51cee361fdee21a3f3bb1a285f5ea9bc225bin0 -> 55 bytes
-rw-r--r--modules/git/tests/repos/repo3_notes/objects/d8/263ee9860594d2806b0dfd1bfd17528b0ba2a4bin0 -> 16 bytes
-rw-r--r--modules/git/tests/repos/repo3_notes/objects/f3/6ad903e408cb8f4ed90bda02e3a1fd2fab7907bin0 -> 21 bytes
-rw-r--r--modules/git/tests/repos/repo3_notes/objects/fe/c9fe57e9864fe537f02f825e377c4a8a65ad2ebin0 -> 113 bytes
-rw-r--r--modules/git/tests/repos/repo3_notes/refs/heads/master1
-rw-r--r--modules/git/tests/repos/repo3_notes/refs/notes/commits1
23 files changed, 59 insertions, 15 deletions
diff --git a/modules/git/notes.go b/modules/git/notes.go
index a62c55878..e82592368 100644
--- a/modules/git/notes.go
+++ b/modules/git/notes.go
@@ -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)
+ commitNode, err := commitNodeIndex.Get(notes.ID)
if err != nil {
- return nil
+ return err
}
- lastCommits, err := getLastCommitForPaths(commitNode, "", []string{commitID})
+ lastCommits, err := getLastCommitForPaths(commitNode, "", []string{path})
if err != nil {
return err
}
- note.Commit = convertCommit(lastCommits[commitID])
+ note.Commit = convertCommit(lastCommits[path])
return nil
}
diff --git a/modules/git/notes_test.go b/modules/git/notes_test.go
index a954377f5..bf010b9a7 100644
--- a/modules/git/notes_test.go
+++ b/modules/git/notes_test.go
@@ -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", &note)
+ assert.NoError(t, err)
+ assert.Equal(t, []byte("Note 2"), note.Message)
+ err = GetNote(repo, "ba0a96fa63532d6c5087ecef070b0250ed72fa47", &note)
+ assert.NoError(t, err)
+ assert.Equal(t, []byte("Note 1"), note.Message)
+}
diff --git a/modules/git/tests/repos/repo3_notes/COMMIT_EDITMSG b/modules/git/tests/repos/repo3_notes/COMMIT_EDITMSG
new file mode 100644
index 000000000..0cfbf0888
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/COMMIT_EDITMSG
@@ -0,0 +1 @@
+2
diff --git a/modules/git/tests/repos/repo3_notes/HEAD b/modules/git/tests/repos/repo3_notes/HEAD
new file mode 100644
index 000000000..cb089cd89
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/HEAD
@@ -0,0 +1 @@
+ref: refs/heads/master
diff --git a/modules/git/tests/repos/repo3_notes/config b/modules/git/tests/repos/repo3_notes/config
new file mode 100644
index 000000000..d545cdabd
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/config
@@ -0,0 +1,7 @@
+[core]
+ repositoryformatversion = 0
+ filemode = false
+ bare = false
+ logallrefupdates = true
+ symlinks = false
+ ignorecase = true
diff --git a/modules/git/tests/repos/repo3_notes/description b/modules/git/tests/repos/repo3_notes/description
new file mode 100644
index 000000000..498b267a8
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/description
@@ -0,0 +1 @@
+Unnamed repository; edit this file 'description' to name the repository.
diff --git a/modules/git/tests/repos/repo3_notes/index b/modules/git/tests/repos/repo3_notes/index
new file mode 100644
index 000000000..783158b92
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/index
Binary files differ
diff --git a/modules/git/tests/repos/repo3_notes/logs/HEAD b/modules/git/tests/repos/repo3_notes/logs/HEAD
new file mode 100644
index 000000000..4bd0a61ea
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/logs/HEAD
@@ -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
diff --git a/modules/git/tests/repos/repo3_notes/logs/refs/heads/master b/modules/git/tests/repos/repo3_notes/logs/refs/heads/master
new file mode 100644
index 000000000..4bd0a61ea
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/logs/refs/heads/master
@@ -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
diff --git a/modules/git/tests/repos/repo3_notes/objects/29/7128d6553180486c780e2f747cb6d0014bf1f6 b/modules/git/tests/repos/repo3_notes/objects/29/7128d6553180486c780e2f747cb6d0014bf1f6
new file mode 100644
index 000000000..96fb74952
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/objects/29/7128d6553180486c780e2f747cb6d0014bf1f6
Binary files differ
diff --git a/modules/git/tests/repos/repo3_notes/objects/2f/7e2ea1e905c14c8a98e7ce47b395592834b9ef b/modules/git/tests/repos/repo3_notes/objects/2f/7e2ea1e905c14c8a98e7ce47b395592834b9ef
new file mode 100644
index 000000000..71cff177b
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/objects/2f/7e2ea1e905c14c8a98e7ce47b395592834b9ef
Binary files differ
diff --git a/modules/git/tests/repos/repo3_notes/objects/3e/668dbfac39cbc80a9ff9c61eb565d944453ba4 b/modules/git/tests/repos/repo3_notes/objects/3e/668dbfac39cbc80a9ff9c61eb565d944453ba4
new file mode 100644
index 000000000..8f13b31d7
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/objects/3e/668dbfac39cbc80a9ff9c61eb565d944453ba4
@@ -0,0 +1,3 @@
+x;0 @s
+H&v*!4J(p~
+G`|oxzi;3 6 $`"NRѺXlaiK4r$\P0"ỵPQ'F_VNi*ʗGӳK|YeHff Em \ No newline at end of file
diff --git a/modules/git/tests/repos/repo3_notes/objects/42/716fdb6f261867472899d785123e6ecaa5ca02 b/modules/git/tests/repos/repo3_notes/objects/42/716fdb6f261867472899d785123e6ecaa5ca02
new file mode 100644
index 000000000..3d522eb29
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/objects/42/716fdb6f261867472899d785123e6ecaa5ca02
Binary files differ
diff --git a/modules/git/tests/repos/repo3_notes/objects/56/a6051ca2b02b04ef92d5150c9ef600403cb1de b/modules/git/tests/repos/repo3_notes/objects/56/a6051ca2b02b04ef92d5150c9ef600403cb1de
new file mode 100644
index 000000000..b17dfe30e
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/objects/56/a6051ca2b02b04ef92d5150c9ef600403cb1de
Binary files differ
diff --git a/modules/git/tests/repos/repo3_notes/objects/61/6c62e75fce60d806f4afe993211705a00a2544 b/modules/git/tests/repos/repo3_notes/objects/61/6c62e75fce60d806f4afe993211705a00a2544
new file mode 100644
index 000000000..b09d3a2d2
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/objects/61/6c62e75fce60d806f4afe993211705a00a2544
Binary files differ
diff --git a/modules/git/tests/repos/repo3_notes/objects/65/4c8b6b63c08bf37f638d3f521626b7fbbd4d37 b/modules/git/tests/repos/repo3_notes/objects/65/4c8b6b63c08bf37f638d3f521626b7fbbd4d37
new file mode 100644
index 000000000..0d317cb80
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/objects/65/4c8b6b63c08bf37f638d3f521626b7fbbd4d37
@@ -0,0 +1 @@
+x;0}"ǿu$RQrK1F1nfR-%wzc{%7h#xQfXѻ?jK S#8צ{M3> 6ZQm8 \ No newline at end of file
diff --git a/modules/git/tests/repos/repo3_notes/objects/ba/0a96fa63532d6c5087ecef070b0250ed72fa47 b/modules/git/tests/repos/repo3_notes/objects/ba/0a96fa63532d6c5087ecef070b0250ed72fa47
new file mode 100644
index 000000000..c21f2b2a2
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/objects/ba/0a96fa63532d6c5087ecef070b0250ed72fa47
Binary files differ
diff --git a/modules/git/tests/repos/repo3_notes/objects/c9/34d51cee361fdee21a3f3bb1a285f5ea9bc225 b/modules/git/tests/repos/repo3_notes/objects/c9/34d51cee361fdee21a3f3bb1a285f5ea9bc225
new file mode 100644
index 000000000..f5a8caa75
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/objects/c9/34d51cee361fdee21a3f3bb1a285f5ea9bc225
Binary files differ
diff --git a/modules/git/tests/repos/repo3_notes/objects/d8/263ee9860594d2806b0dfd1bfd17528b0ba2a4 b/modules/git/tests/repos/repo3_notes/objects/d8/263ee9860594d2806b0dfd1bfd17528b0ba2a4
new file mode 100644
index 000000000..4b1baefff
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/objects/d8/263ee9860594d2806b0dfd1bfd17528b0ba2a4
Binary files differ
diff --git a/modules/git/tests/repos/repo3_notes/objects/f3/6ad903e408cb8f4ed90bda02e3a1fd2fab7907 b/modules/git/tests/repos/repo3_notes/objects/f3/6ad903e408cb8f4ed90bda02e3a1fd2fab7907
new file mode 100644
index 000000000..dc2af772e
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/objects/f3/6ad903e408cb8f4ed90bda02e3a1fd2fab7907
Binary files differ
diff --git a/modules/git/tests/repos/repo3_notes/objects/fe/c9fe57e9864fe537f02f825e377c4a8a65ad2e b/modules/git/tests/repos/repo3_notes/objects/fe/c9fe57e9864fe537f02f825e377c4a8a65ad2e
new file mode 100644
index 000000000..6372ff10a
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/objects/fe/c9fe57e9864fe537f02f825e377c4a8a65ad2e
Binary files differ
diff --git a/modules/git/tests/repos/repo3_notes/refs/heads/master b/modules/git/tests/repos/repo3_notes/refs/heads/master
new file mode 100644
index 000000000..e96af8d80
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/refs/heads/master
@@ -0,0 +1 @@
+3e668dbfac39cbc80a9ff9c61eb565d944453ba4 \ No newline at end of file
diff --git a/modules/git/tests/repos/repo3_notes/refs/notes/commits b/modules/git/tests/repos/repo3_notes/refs/notes/commits
new file mode 100644
index 000000000..74e3d3ad8
--- /dev/null
+++ b/modules/git/tests/repos/repo3_notes/refs/notes/commits
@@ -0,0 +1 @@
+654c8b6b63c08bf37f638d3f521626b7fbbd4d37 \ No newline at end of file