walk.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package gig
  2. import "fmt"
  3. func (repo *Repository) WalkRef(refname string, goOn func(SHA1) bool) (map[SHA1]*Commit, error) {
  4. head, err := repo.OpenRef(refname)
  5. if err != nil {
  6. return nil, err
  7. }
  8. HId, err := head.Resolve()
  9. if err != nil {
  10. return nil, err
  11. }
  12. commits := make(map[SHA1]*Commit)
  13. repo.walkCommitTree(commits, HId, goOn)
  14. return commits, nil
  15. }
  16. func (repo *Repository) walkCommitTree(commits map[SHA1]*Commit, commitId SHA1,
  17. goOn func(SHA1) bool) error {
  18. commit, err := repo.OpenObject(commitId)
  19. commit.Close()
  20. if err != nil {
  21. return err
  22. }
  23. if _, ok := commits[commitId]; !ok && goOn(commitId) {
  24. commits[commitId] = commit.(*Commit)
  25. for _, parent := range commit.(*Commit).Parent {
  26. repo.walkCommitTree(commits, parent, goOn)
  27. }
  28. return nil
  29. } else {
  30. return nil
  31. }
  32. }
  33. func (repo *Repository) GetBlobsForCommit(commit *Commit, blobs map[SHA1]*Blob) error {
  34. treeOb, err := repo.OpenObject(commit.Tree)
  35. if err != nil {
  36. return err
  37. }
  38. defer treeOb.Close()
  39. tree, ok := treeOb.(*Tree)
  40. if !ok {
  41. return fmt.Errorf("Could not assert a tree")
  42. }
  43. err = repo.GetBlobsForTree(tree, blobs)
  44. return err
  45. }
  46. func (repo *Repository) GetBlobsForTree(tree *Tree, blobs map[SHA1]*Blob) error {
  47. for tree.Next() {
  48. trEntry := tree.Entry()
  49. switch trEntry.Type {
  50. case ObjBlob:
  51. if blobOb, err := repo.OpenObject(trEntry.ID); err != nil {
  52. return err
  53. } else {
  54. blobs[trEntry.ID] = blobOb.(*Blob)
  55. blobOb.Close()
  56. }
  57. case ObjTree:
  58. if treeOb, err := repo.OpenObject(trEntry.ID); err != nil {
  59. return err
  60. } else {
  61. if err = repo.GetBlobsForTree(treeOb.(*Tree), blobs); err != nil {
  62. treeOb.Close()
  63. return err
  64. }
  65. }
  66. }
  67. }
  68. return tree.Err()
  69. }