code.gitea.io/gitea@v1.19.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 cgobject "github.com/go-git/go-git/v5/plumbing/object/commitgraph" 12 ) 13 14 // CacheCommit will cache the commit from the gitRepository 15 func (c *Commit) CacheCommit(ctx context.Context) error { 16 if c.repo.LastCommitCache == nil { 17 return nil 18 } 19 commitNodeIndex, _ := c.repo.CommitNodeIndex() 20 21 index, err := commitNodeIndex.Get(c.ID) 22 if err != nil { 23 return err 24 } 25 26 return c.recursiveCache(ctx, index, &c.Tree, "", 1) 27 } 28 29 func (c *Commit) recursiveCache(ctx context.Context, index cgobject.CommitNode, tree *Tree, treePath string, level int) error { 30 if level == 0 { 31 return nil 32 } 33 34 entries, err := tree.ListEntries() 35 if err != nil { 36 return err 37 } 38 39 entryPaths := make([]string, len(entries)) 40 entryMap := make(map[string]*TreeEntry) 41 for i, entry := range entries { 42 entryPaths[i] = entry.Name() 43 entryMap[entry.Name()] = entry 44 } 45 46 commits, err := GetLastCommitForPaths(ctx, c.repo.LastCommitCache, index, treePath, entryPaths) 47 if err != nil { 48 return err 49 } 50 51 for entry := range commits { 52 if entryMap[entry].IsDir() { 53 subTree, err := tree.SubTree(entry) 54 if err != nil { 55 return err 56 } 57 if err := c.recursiveCache(ctx, index, subTree, entry, level-1); err != nil { 58 return err 59 } 60 } 61 } 62 63 return nil 64 }