code.gitea.io/gitea@v1.22.3/modules/git/last_commit_cache_gogit.go (about) 1 // Copyright 2020 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 //go:build gogit 5 6 package git 7 8 import ( 9 "context" 10 11 "github.com/go-git/go-git/v5/plumbing" 12 cgobject "github.com/go-git/go-git/v5/plumbing/object/commitgraph" 13 ) 14 15 // CacheCommit will cache the commit from the gitRepository 16 func (c *Commit) CacheCommit(ctx context.Context) error { 17 if c.repo.LastCommitCache == nil { 18 return nil 19 } 20 commitNodeIndex, _ := c.repo.CommitNodeIndex() 21 22 index, err := commitNodeIndex.Get(plumbing.Hash(c.ID.RawValue())) 23 if err != nil { 24 return err 25 } 26 27 return c.recursiveCache(ctx, index, &c.Tree, "", 1) 28 } 29 30 func (c *Commit) recursiveCache(ctx context.Context, index cgobject.CommitNode, tree *Tree, treePath string, level int) error { 31 if level == 0 { 32 return nil 33 } 34 35 entries, err := tree.ListEntries() 36 if err != nil { 37 return err 38 } 39 40 entryPaths := make([]string, len(entries)) 41 entryMap := make(map[string]*TreeEntry) 42 for i, entry := range entries { 43 entryPaths[i] = entry.Name() 44 entryMap[entry.Name()] = entry 45 } 46 47 commits, err := GetLastCommitForPaths(ctx, c.repo.LastCommitCache, index, treePath, entryPaths) 48 if err != nil { 49 return err 50 } 51 52 for entry := range commits { 53 if entryMap[entry].IsDir() { 54 subTree, err := tree.SubTree(entry) 55 if err != nil { 56 return err 57 } 58 if err := c.recursiveCache(ctx, index, subTree, entry, level-1); err != nil { 59 return err 60 } 61 } 62 } 63 64 return nil 65 }