diff options
author | Máximo Cuadros <mcuadros@gmail.com> | 2017-01-28 16:26:14 +0100 |
---|---|---|
committer | Máximo Cuadros <mcuadros@gmail.com> | 2017-01-28 16:26:14 +0100 |
commit | 9a9f2b1f63a98fad67a3190ef813428b68dfdd8c (patch) | |
tree | c7266ab8a010d551670d9f6356294c09ffa9f7fb /storage/filesystem | |
parent | 24c1878260351d9f9f6c575cbeeb5878104d6a0e (diff) | |
download | go-git-9a9f2b1f63a98fad67a3190ef813428b68dfdd8c.tar.gz |
storage: IndexStorer implementation
Diffstat (limited to 'storage/filesystem')
-rw-r--r-- | storage/filesystem/internal/dotgit/dotgit.go | 11 | ||||
-rw-r--r-- | storage/filesystem/internal/dotgit/dotgit_test.go | 32 | ||||
-rw-r--r-- | storage/filesystem/object.go | 20 | ||||
-rw-r--r-- | storage/filesystem/storage.go | 2 |
4 files changed, 55 insertions, 10 deletions
diff --git a/storage/filesystem/internal/dotgit/dotgit.go b/storage/filesystem/internal/dotgit/dotgit.go index f9763d1..1281b7e 100644 --- a/storage/filesystem/internal/dotgit/dotgit.go +++ b/storage/filesystem/internal/dotgit/dotgit.go @@ -18,6 +18,7 @@ const ( suffix = ".git" packedRefsPath = "packed-refs" configPath = "config" + indexPath = "index" shallowPath = "shallow" objectsPath = "objects" @@ -72,6 +73,16 @@ func (d *DotGit) Config() (billy.File, error) { return d.fs.Open(configPath) } +// IndexWriter returns a file pointer for write to the index file +func (d *DotGit) IndexWriter() (billy.File, error) { + return d.fs.Create(indexPath) +} + +// Index returns a file pointer for read to the index file +func (d *DotGit) Index() (billy.File, error) { + return d.fs.Open(indexPath) +} + // ShallowWriter returns a file pointer for write to the shallow file func (d *DotGit) ShallowWriter() (billy.File, error) { return d.fs.Create(shallowPath) diff --git a/storage/filesystem/internal/dotgit/dotgit_test.go b/storage/filesystem/internal/dotgit/dotgit_test.go index 48f02f0..bff90af 100644 --- a/storage/filesystem/internal/dotgit/dotgit_test.go +++ b/storage/filesystem/internal/dotgit/dotgit_test.go @@ -154,6 +154,38 @@ func (s *SuiteDotGit) TestConfigWriteAndConfig(c *C) { c.Assert(string(cnt), Equals, "foo") } +func (s *SuiteDotGit) TestIndex(c *C) { + fs := fixtures.Basic().ByTag(".git").One().DotGit() + dir := New(fs) + + idx, err := dir.Index() + c.Assert(err, IsNil) + c.Assert(idx, NotNil) +} + +func (s *SuiteDotGit) TestIndexWriteAndIndex(c *C) { + tmp, err := ioutil.TempDir("", "dot-git") + c.Assert(err, IsNil) + defer os.RemoveAll(tmp) + + fs := osfs.New(tmp) + dir := New(fs) + + f, err := dir.IndexWriter() + c.Assert(err, IsNil) + + _, err = f.Write([]byte("foo")) + c.Assert(err, IsNil) + + f, err = dir.Index() + c.Assert(err, IsNil) + + cnt, err := ioutil.ReadAll(f) + c.Assert(err, IsNil) + + c.Assert(string(cnt), Equals, "foo") +} + func (s *SuiteDotGit) TestShallow(c *C) { fs := fixtures.Basic().ByTag(".git").One().DotGit() dir := New(fs) diff --git a/storage/filesystem/object.go b/storage/filesystem/object.go index 1001032..b82ca30 100644 --- a/storage/filesystem/object.go +++ b/storage/filesystem/object.go @@ -17,13 +17,13 @@ import ( type ObjectStorage struct { dir *dotgit.DotGit - index map[plumbing.Hash]index + index map[plumbing.Hash]idx } func newObjectStorage(dir *dotgit.DotGit) (ObjectStorage, error) { s := ObjectStorage{ dir: dir, - index: make(map[plumbing.Hash]index, 0), + index: make(map[plumbing.Hash]idx, 0), } return s, s.loadIdxFiles() @@ -45,13 +45,13 @@ func (s *ObjectStorage) loadIdxFiles() error { } func (s *ObjectStorage) loadIdxFile(h plumbing.Hash) error { - idx, err := s.dir.ObjectPackIdx(h) + idxfile, err := s.dir.ObjectPackIdx(h) if err != nil { return err } - s.index[h] = make(index) - return s.index[h].Decode(idx) + s.index[h] = make(idx) + return s.index[h].Decode(idxfile) } func (s *ObjectStorage) NewEncodedObject() plumbing.EncodedObject { @@ -64,9 +64,9 @@ func (s *ObjectStorage) PackfileWriter() (io.WriteCloser, error) { return nil, err } - w.Notify = func(h plumbing.Hash, idx idxfile.Idxfile) { - s.index[h] = make(index) - for _, e := range idx.Entries { + w.Notify = func(h plumbing.Hash, idxfile idxfile.Idxfile) { + s.index[h] = make(idx) + for _, e := range idxfile.Entries { s.index[h][e.Hash] = int64(e.Offset) } } @@ -244,9 +244,9 @@ func (s *ObjectStorage) buildPackfileIters( return iters, nil } -type index map[plumbing.Hash]int64 +type idx map[plumbing.Hash]int64 -func (i index) Decode(r io.Reader) error { +func (i idx) Decode(r io.Reader) error { idx := &idxfile.Idxfile{} d := idxfile.NewDecoder(r) diff --git a/storage/filesystem/storage.go b/storage/filesystem/storage.go index a60d0f4..56f84b8 100644 --- a/storage/filesystem/storage.go +++ b/storage/filesystem/storage.go @@ -13,6 +13,7 @@ import ( type Storage struct { ObjectStorage ReferenceStorage + IndexStorage ShallowStorage ConfigStorage } @@ -28,6 +29,7 @@ func NewStorage(fs billy.Filesystem) (*Storage, error) { return &Storage{ ObjectStorage: o, ReferenceStorage: ReferenceStorage{dir: dir}, + IndexStorage: IndexStorage{dir: dir}, ShallowStorage: ShallowStorage{dir: dir}, ConfigStorage: ConfigStorage{dir: dir}, }, nil |