summaryrefslogtreecommitdiffstats
path: root/modules/git/notes_nogogit.go
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-10-11 10:27:00 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-10-11 10:27:00 +0000
commit65aa53fc52ff15efe54df4147564828d535837f8 (patch)
tree31c51dad04fdcca80e6d3043c8bd49d2f1a51f83 /modules/git/notes_nogogit.go
parentInitial commit. (diff)
downloadforgejo-debian.tar.xz
forgejo-debian.zip
Adding upstream version 8.0.3.HEADupstream/8.0.3upstreamdebian
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'modules/git/notes_nogogit.go')
-rw-r--r--modules/git/notes_nogogit.go91
1 files changed, 91 insertions, 0 deletions
diff --git a/modules/git/notes_nogogit.go b/modules/git/notes_nogogit.go
new file mode 100644
index 00000000..4da375c3
--- /dev/null
+++ b/modules/git/notes_nogogit.go
@@ -0,0 +1,91 @@
+// Copyright 2019 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+//go:build !gogit
+
+package git
+
+import (
+ "context"
+ "io"
+ "strings"
+
+ "code.gitea.io/gitea/modules/log"
+)
+
+// GetNote retrieves the git-notes data for a given commit.
+// FIXME: Add LastCommitCache support
+func GetNote(ctx context.Context, repo *Repository, commitID string, note *Note) error {
+ log.Trace("Searching for git note corresponding to the commit %q in the repository %q", commitID, repo.Path)
+ notes, err := repo.GetCommit(NotesRef)
+ if err != nil {
+ if IsErrNotExist(err) {
+ return err
+ }
+ log.Error("Unable to get commit from ref %q. Error: %v", NotesRef, err)
+ return err
+ }
+
+ path := ""
+
+ tree := &notes.Tree
+ log.Trace("Found tree with ID %q while searching for git note corresponding to the commit %q", tree.ID, commitID)
+
+ var entry *TreeEntry
+ originalCommitID := commitID
+ for len(commitID) > 2 {
+ entry, err = tree.GetTreeEntryByPath(commitID)
+ if err == nil {
+ path += commitID
+ break
+ }
+ if IsErrNotExist(err) {
+ tree, err = tree.SubTree(commitID[0:2])
+ path += commitID[0:2] + "/"
+ commitID = commitID[2:]
+ }
+ if err != nil {
+ // Err may have been updated by the SubTree we need to recheck if it's again an ErrNotExist
+ if !IsErrNotExist(err) {
+ log.Error("Unable to find git note corresponding to the commit %q. Error: %v", originalCommitID, err)
+ }
+ return err
+ }
+ }
+
+ blob := entry.Blob()
+ dataRc, err := blob.DataAsync()
+ if err != nil {
+ log.Error("Unable to read blob with ID %q. Error: %v", blob.ID, err)
+ return err
+ }
+ closed := false
+ defer func() {
+ if !closed {
+ _ = dataRc.Close()
+ }
+ }()
+ d, err := io.ReadAll(dataRc)
+ if err != nil {
+ log.Error("Unable to read blob with ID %q. Error: %v", blob.ID, err)
+ return err
+ }
+ _ = dataRc.Close()
+ closed = true
+ note.Message = d
+
+ treePath := ""
+ if idx := strings.LastIndex(path, "/"); idx > -1 {
+ treePath = path[:idx]
+ path = path[idx+1:]
+ }
+
+ lastCommits, err := GetLastCommitForPaths(ctx, notes, treePath, []string{path})
+ if err != nil {
+ log.Error("Unable to get the commit for the path %q. Error: %v", treePath, err)
+ return err
+ }
+ note.Commit = lastCommits[path]
+
+ return nil
+}