1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- package gig
- import "fmt"
- func (repo *Repository) WalkRef(refname string, goOn func(SHA1) bool) (map[SHA1]*Commit, error) {
- head, err := repo.OpenRef(refname)
- if err != nil {
- return nil, err
- }
- HId, err := head.Resolve()
- if err != nil {
- return nil, err
- }
- commits := make(map[SHA1]*Commit)
- repo.walkCommitTree(commits, HId, goOn)
- return commits, nil
- }
- func (repo *Repository) walkCommitTree(commits map[SHA1]*Commit, commitId SHA1,
- goOn func(SHA1) bool) error {
- commit, err := repo.OpenObject(commitId)
- commit.Close()
- if err != nil {
- return err
- }
- if _, ok := commits[commitId]; !ok && goOn(commitId) {
- commits[commitId] = commit.(*Commit)
- for _, parent := range commit.(*Commit).Parent {
- repo.walkCommitTree(commits, parent, goOn)
- }
- return nil
- } else {
- return nil
- }
- }
- func (repo *Repository) GetBlobsForCommit(commit *Commit, blobs map[SHA1]*Blob) error {
- treeOb, err := repo.OpenObject(commit.Tree)
- if err != nil {
- return err
- }
- defer treeOb.Close()
- tree, ok := treeOb.(*Tree)
- if !ok {
- return fmt.Errorf("Could not assert a tree")
- }
- err = repo.GetBlobsForTree(tree, blobs)
- return err
- }
- func (repo *Repository) GetBlobsForTree(tree *Tree, blobs map[SHA1]*Blob) error {
- for tree.Next() {
- trEntry := tree.Entry()
- switch trEntry.Type {
- case ObjBlob:
- if blobOb, err := repo.OpenObject(trEntry.ID); err != nil {
- return err
- } else {
- blobs[trEntry.ID] = blobOb.(*Blob)
- blobOb.Close()
- }
- case ObjTree:
- if treeOb, err := repo.OpenObject(trEntry.ID); err != nil {
- return err
- } else {
- if err = repo.GetBlobsForTree(treeOb.(*Tree), blobs); err != nil {
- treeOb.Close()
- return err
- }
- }
- }
- }
- return tree.Err()
- }
|