diff options
author | sona-tar <sona.zip@gmail.com> | 2016-08-31 05:13:12 +0900 |
---|---|---|
committer | Máximo Cuadros <mcuadros@gmail.com> | 2016-08-30 22:13:12 +0200 |
commit | d72a19796ef0f556db93b553547f2ac085b59a1a (patch) | |
tree | 0c5cc404852b0fd46d35f50cbb3afddff49f7018 /storage/filesystem/object.go | |
parent | 6d846503013f5a9cde0597698c998b6c0e0dc055 (diff) | |
download | go-git-d72a19796ef0f556db93b553547f2ac085b59a1a.tar.gz |
Support non packed objects (#68)
* Support non packed git objects
* Support non packed git objects for Iterator
* Fix error handling from Writer() in FillObject()
* Fix format in func (r *Reader) FillObject(obj core.Object) error
* Fix to return d.addRefsFromPackedRefs() error
And if packed-refs dosen't exist not to return error in d.addRefsFromPackedRefs
* Remove debug code
* Add GoDoc for func (d *DotGit) Objectfile(h core.Hash) (fs.FS, string, error)
* Add GoDoc for func (r *Reader) FillObject(obj core.Object) error
* Add GoDoc for func (d *DotGit) Objectfiles() (fs.FS, []core.Hash, error)
* Fix format in func (d *DotGit) Objectfile(h core.Hash) (fs.FS, string, error)
* Rename value dotGitobjcts -> objsDir
* Change regexp.Compile -> regexp.MustCompile
* Move regexp to variable initialization
* Rename regexp value to be more coherent
* Fix object directory name and object file name to correct character
* Faster Objectfiles func
* Add test for FillObject
* Add GoDoc for func (s *ObjectStorage) Get(h core.Hash) (core.Object, error)
* defer Close()
* Return name values for defer function overwrite the error value.
* Fix error handling in func (s *ObjectStorage) Get()
Return error that gets error except for ErrObjfileNotFound from getFromUnpacked()
* Rename getFromObject -> getFromUnpacked
* Add test for func (d *DotGit) Objectfile(h core.Hash) (fs.FS, string, error)
* Add test for func (d *DotGit) Objectfiles() (fs.FS, []core.Hash, error)
* Faster check git object name
* Faster dotgit_test.go
* Fix Godoc for Objectfiles func
* Refactor variable name in Objectfiles func
* Fix GoDoc for objectfile func
* Fix TestObjectfile func and TestObjectfiles func
* Rename fixobj -> fixObj in Test Objectfile func
* Fix test compare method
* Refactor Get func in object.go
* Refactor getFromUnpacked func in object.go
* Fix GoDoc for ErrObjfileNotFound
* Fix TestObjectfiles for not guarantee the slice order
* Change error no such file or directory to target file not found
* Change spec func (s *ObjectStorage) Get(h core.Hash) (core.Object, error)
return core.ErrObjectNotFound, if index pointer is nil.
* Add space
* storage: Add object type hint parameter to ObjectStorage.getFromUnpacked
Diffstat (limited to 'storage/filesystem/object.go')
-rw-r--r-- | storage/filesystem/object.go | 76 |
1 files changed, 73 insertions, 3 deletions
diff --git a/storage/filesystem/object.go b/storage/filesystem/object.go index 1b1ce9d..3888fd8 100644 --- a/storage/filesystem/object.go +++ b/storage/filesystem/object.go @@ -5,6 +5,7 @@ import ( "os" "gopkg.in/src-d/go-git.v4/core" + "gopkg.in/src-d/go-git.v4/formats/objfile" "gopkg.in/src-d/go-git.v4/formats/packfile" "gopkg.in/src-d/go-git.v4/storage/filesystem/internal/dotgit" "gopkg.in/src-d/go-git.v4/storage/filesystem/internal/index" @@ -37,8 +38,62 @@ func (s *ObjectStorage) Set(core.Object) (core.Hash, error) { } // Get returns the object with the given hash, by searching for it in -// the packfile. +// the packfile and the git object directories. func (s *ObjectStorage) Get(t core.ObjectType, h core.Hash) (core.Object, error) { + obj, err := s.getFromUnpacked(t, h) + if err == dotgit.ErrObjfileNotFound { + if s.index == nil { + return nil, core.ErrObjectNotFound + } + return s.getFromPackfile(t, h) + } + + return obj, err +} + +func (s *ObjectStorage) getFromUnpacked(t core.ObjectType, h core.Hash) (obj core.Object, err error) { + fs, path, err := s.dir.Objectfile(h) + if err != nil { + return nil, err + } + + f, err := fs.Open(path) + if err != nil { + return nil, err + } + + defer func() { + errClose := f.Close() + if err == nil { + err = errClose + } + }() + + obj = s.NewObject() + objReader, err := objfile.NewReader(f) + if err != nil { + return nil, err + } + defer func() { + errClose := objReader.Close() + if err == nil { + err = errClose + } + }() + + err = objReader.FillObject(obj) + if err != nil { + return nil, err + } + if core.AnyObject != t && obj.Type() != t { + return nil, core.ErrObjectNotFound + } + return obj, nil +} + +// Get returns the object with the given hash, by searching for it in +// the packfile. +func (s *ObjectStorage) getFromPackfile(t core.ObjectType, h core.Hash) (obj core.Object, err error) { offset, err := s.index.Get(h) if err != nil { return nil, err @@ -70,7 +125,7 @@ func (s *ObjectStorage) Get(t core.ObjectType, h core.Hash) (core.Object, error) r.HashToOffset = map[core.Hash]int64(s.index) p := packfile.NewParser(r) - obj := s.NewObject() + obj = s.NewObject() err = p.FillObject(obj) if err != nil { return nil, err @@ -86,8 +141,23 @@ func (s *ObjectStorage) Get(t core.ObjectType, h core.Hash) (core.Object, error) func (s *ObjectStorage) Iter(t core.ObjectType) (core.ObjectIter, error) { var objects []core.Object + _, hashes, err := s.dir.Objectfiles() + if err != nil { + return nil, err + } + + for _, hash := range hashes { + object, err := s.getFromUnpacked(core.AnyObject, hash) + if err != nil { + return nil, err + } + if object.Type() == t { + objects = append(objects, object) + } + } + for hash := range s.index { - object, err := s.Get(core.AnyObject, hash) + object, err := s.getFromPackfile(core.AnyObject, hash) if err != nil { return nil, err } |