Initialize `r` (which is empty) based on `tree`.
(g *Graph, oid git.OID, tree *git.Tree)
| 553 | |
| 554 | // Initialize `r` (which is empty) based on `tree`. |
| 555 | func (r *treeRecord) initialize(g *Graph, oid git.OID, tree *git.Tree) error { |
| 556 | r.lock.Lock() |
| 557 | defer r.lock.Unlock() |
| 558 | |
| 559 | r.objectSize = tree.Size() |
| 560 | r.pending = 0 |
| 561 | |
| 562 | iter := tree.Iter() |
| 563 | for { |
| 564 | entry, ok, err := iter.NextEntry() |
| 565 | if err != nil { |
| 566 | return err |
| 567 | } |
| 568 | if !ok { |
| 569 | break |
| 570 | } |
| 571 | name := entry.Name |
| 572 | |
| 573 | switch { |
| 574 | case entry.Filemode&0o170000 == 0o40000: |
| 575 | // Tree |
| 576 | listener := func(size TreeSize) { |
| 577 | // This listener is called when the tree pointed to by |
| 578 | // `entry` has been fully processed. |
| 579 | r.lock.Lock() |
| 580 | defer r.lock.Unlock() |
| 581 | |
| 582 | g.pathResolver.RecordTreeEntry(oid, name, entry.OID) |
| 583 | |
| 584 | r.size.addDescendent(name, size) |
| 585 | r.pending-- |
| 586 | // This might inform *our* listeners that we are now |
| 587 | // fully processed: |
| 588 | r.maybeFinalize(g) |
| 589 | } |
| 590 | treeSize, ok := g.RequireTreeSize(entry.OID, listener) |
| 591 | if ok { |
| 592 | r.size.addDescendent(name, treeSize) |
| 593 | } else { |
| 594 | r.pending++ |
| 595 | } |
| 596 | r.entryCount.Increment(1) |
| 597 | |
| 598 | case entry.Filemode&0o170000 == 0o160000: |
| 599 | // Commit (i.e., submodule) |
| 600 | r.size.addSubmodule(name) |
| 601 | r.entryCount.Increment(1) |
| 602 | |
| 603 | case entry.Filemode&0o170000 == 0o120000: |
| 604 | // Symlink |
| 605 | g.pathResolver.RecordTreeEntry(oid, name, entry.OID) |
| 606 | |
| 607 | r.size.addLink(name) |
| 608 | r.entryCount.Increment(1) |
| 609 | |
| 610 | default: |
| 611 | // Blob |
| 612 | g.pathResolver.RecordTreeEntry(oid, name, entry.OID) |
nothing calls this directly
no test coverage detected