You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

last_commit_cache_gogit.go 1.3KB

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