aboutsummaryrefslogtreecommitdiffstats
path: root/storage/filesystem/object.go
diff options
context:
space:
mode:
authorsona-tar <sona.zip@gmail.com>2016-08-31 05:13:12 +0900
committerMáximo Cuadros <mcuadros@gmail.com>2016-08-30 22:13:12 +0200
commitd72a19796ef0f556db93b553547f2ac085b59a1a (patch)
tree0c5cc404852b0fd46d35f50cbb3afddff49f7018 /storage/filesystem/object.go
parent6d846503013f5a9cde0597698c998b6c0e0dc055 (diff)
downloadgo-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.go76
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
}