| 546 | } |
| 547 | |
| 548 | func parentsContainingPath(path string, c *object.Commit) ([]parentCommit, error) { |
| 549 | // TODO: benchmark this method making git.object.Commit.parent public instead of using |
| 550 | // an iterator |
| 551 | var result []parentCommit |
| 552 | iter := c.Parents() |
| 553 | for { |
| 554 | parent, err := iter.Next() |
| 555 | if err == io.EOF { |
| 556 | return result, nil |
| 557 | } |
| 558 | if err != nil { |
| 559 | return nil, err |
| 560 | } |
| 561 | if _, err := parent.File(path); err == nil { |
| 562 | result = append(result, parentCommit{parent, path}) |
| 563 | } else { |
| 564 | // look for renames |
| 565 | patch, err := parent.Patch(c) |
| 566 | if err != nil { |
| 567 | return nil, err |
| 568 | } else if patch != nil { |
| 569 | for _, fp := range patch.FilePatches() { |
| 570 | from, to := fp.Files() |
| 571 | if from != nil && to != nil && to.Path() == path { |
| 572 | result = append(result, parentCommit{parent, from.Path()}) |
| 573 | break |
| 574 | } |
| 575 | } |
| 576 | } |
| 577 | } |
| 578 | } |
| 579 | } |
| 580 | |
| 581 | func blobHash(path string, commit *object.Commit) (plumbing.Hash, error) { |
| 582 | file, err := commit.File(path) |