diff options
author | Máximo Cuadros <mcuadros@gmail.com> | 2015-10-25 20:30:36 +0100 |
---|---|---|
committer | Máximo Cuadros <mcuadros@gmail.com> | 2015-10-25 20:30:36 +0100 |
commit | 9a44cd8ccff143a112436c38bfe5581e74b68f07 (patch) | |
tree | f4d2f38cc61647bf159a7c870913e6f6b60828b2 /formats/packfile/packfile.go | |
parent | be69a505926451bf10450ac68d40265a6f43e150 (diff) | |
download | go-git-9a44cd8ccff143a112436c38bfe5581e74b68f07.tar.gz |
formats/packfile: new reader API
Diffstat (limited to 'formats/packfile/packfile.go')
-rw-r--r-- | formats/packfile/packfile.go | 82 |
1 files changed, 0 insertions, 82 deletions
diff --git a/formats/packfile/packfile.go b/formats/packfile/packfile.go deleted file mode 100644 index d70f396..0000000 --- a/formats/packfile/packfile.go +++ /dev/null @@ -1,82 +0,0 @@ -package packfile - -import "fmt" - -type Packfile struct { - Version uint32 - Size int64 - ObjectCount int - Checksum []byte - Commits map[Hash]*Commit - Trees map[Hash]*Tree - Blobs map[Hash]*Blob -} - -func NewPackfile() *Packfile { - return &Packfile{ - Commits: make(map[Hash]*Commit, 0), - Trees: make(map[Hash]*Tree, 0), - Blobs: make(map[Hash]*Blob, 0), - } -} - -type BlobEntry struct { - path string - *Blob -} - -type SubtreeEntry struct { - path string - *Tree - TreeCh -} - -type treeEntry interface { - isTreeEntry() - Path() string -} - -func (b BlobEntry) isTreeEntry() {} -func (b BlobEntry) Path() string { return b.path } -func (b SubtreeEntry) isTreeEntry() {} -func (b SubtreeEntry) Path() string { return b.path } - -type TreeCh <-chan treeEntry - -func (p *Packfile) WalkCommit(commitHash Hash) (TreeCh, error) { - commit, ok := p.Commits[commitHash] - if !ok { - return nil, fmt.Errorf("Unable to find %q commit", commitHash) - } - - return p.WalkTree(p.Trees[commit.Tree]), nil -} - -func (p *Packfile) WalkTree(tree *Tree) TreeCh { - return p.walkTree(tree, "") -} - -func (p *Packfile) walkTree(tree *Tree, pathPrefix string) TreeCh { - ch := make(chan treeEntry) - - if tree == nil { - close(ch) - return ch - } - - go func() { - defer func() { - close(ch) - }() - for _, e := range tree.Entries { - path := pathPrefix + e.Name - if blob, ok := p.Blobs[e.Hash]; ok { - ch <- BlobEntry{path, blob} - } else if subtree, ok := p.Trees[e.Hash]; ok { - ch <- SubtreeEntry{path, subtree, p.walkTree(subtree, path+"/")} - } - } - }() - - return ch -} |