Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit a2b39f5

Browse files
committed
storage: new storage.ErrReferenceHasChanged error and test for CheckAndSetReference
Signed-off-by: Máximo Cuadros <[email protected]>
1 parent 3052df3 commit a2b39f5

File tree

4 files changed

+58
-3
lines changed

4 files changed

+58
-3
lines changed

storage/filesystem/dotgit/dotgit.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"gopkg.in/src-d/go-billy.v4/osfs"
1616
"gopkg.in/src-d/go-git.v4/plumbing"
17+
"gopkg.in/src-d/go-git.v4/storage"
1718
"gopkg.in/src-d/go-git.v4/utils/ioutil"
1819

1920
"gopkg.in/src-d/go-billy.v4"
@@ -596,7 +597,7 @@ func (d *DotGit) checkReferenceAndTruncate(f billy.File, old *plumbing.Reference
596597
return err
597598
}
598599
if ref.Hash() != old.Hash() {
599-
return fmt.Errorf("reference has changed concurrently")
600+
return storage.ErrReferenceHasChanged
600601
}
601602
_, err = f.Seek(0, io.SeekStart)
602603
if err != nil {

storage/memory/storage.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
)
1414

1515
var ErrUnsupportedObjectType = fmt.Errorf("unsupported object type")
16-
var ErrRefHasChanged = fmt.Errorf("reference has changed concurrently")
1716

1817
// Storage is an implementation of git.Storer that stores data on memory, being
1918
// ephemeral. The use of this storage should be done in controlled envoriments,
@@ -258,7 +257,7 @@ func (r ReferenceStorage) CheckAndSetReference(ref, old *plumbing.Reference) err
258257
if old != nil {
259258
tmp := r[ref.Name()]
260259
if tmp != nil && tmp.Hash() != old.Hash() {
261-
return ErrRefHasChanged
260+
return storage.ErrReferenceHasChanged
262261
}
263262
}
264263
r[ref.Name()] = ref

storage/storer.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package storage
22

33
import (
4+
"errors"
5+
46
"gopkg.in/src-d/go-git.v4/config"
57
"gopkg.in/src-d/go-git.v4/plumbing/storer"
68
)
79

10+
var ErrReferenceHasChanged = errors.New("reference has changed concurrently")
11+
812
// Storer is a generic storage of objects, references and any information
913
// related to a particular repository. The package gopkg.in/src-d/go-git.v4/storage
1014
// contains two implementation a filesystem base implementation (such as `.git`)

storage/test/storage_suite.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,57 @@ func (s *BaseStorageSuite) TestSetReferenceAndGetReference(c *C) {
280280
c.Assert(e.Hash().String(), Equals, "bc9968d75e48de59f0870ffb71f5e160bbbdcf52")
281281
}
282282

283+
func (s *BaseStorageSuite) TestCheckAndSetReference(c *C) {
284+
err := s.Storer.SetReference(
285+
plumbing.NewReferenceFromStrings("foo", "482e0eada5de4039e6f216b45b3c9b683b83bfa"),
286+
)
287+
c.Assert(err, IsNil)
288+
289+
err = s.Storer.CheckAndSetReference(
290+
plumbing.NewReferenceFromStrings("foo", "bc9968d75e48de59f0870ffb71f5e160bbbdcf52"),
291+
plumbing.NewReferenceFromStrings("foo", "482e0eada5de4039e6f216b45b3c9b683b83bfa"),
292+
)
293+
c.Assert(err, IsNil)
294+
295+
e, err := s.Storer.Reference(plumbing.ReferenceName("foo"))
296+
c.Assert(err, IsNil)
297+
c.Assert(e.Hash().String(), Equals, "bc9968d75e48de59f0870ffb71f5e160bbbdcf52")
298+
}
299+
300+
func (s *BaseStorageSuite) TestCheckAndSetReferenceNil(c *C) {
301+
err := s.Storer.SetReference(
302+
plumbing.NewReferenceFromStrings("foo", "482e0eada5de4039e6f216b45b3c9b683b83bfa"),
303+
)
304+
c.Assert(err, IsNil)
305+
306+
err = s.Storer.CheckAndSetReference(
307+
plumbing.NewReferenceFromStrings("foo", "bc9968d75e48de59f0870ffb71f5e160bbbdcf52"),
308+
nil,
309+
)
310+
c.Assert(err, IsNil)
311+
312+
e, err := s.Storer.Reference(plumbing.ReferenceName("foo"))
313+
c.Assert(err, IsNil)
314+
c.Assert(e.Hash().String(), Equals, "bc9968d75e48de59f0870ffb71f5e160bbbdcf52")
315+
}
316+
317+
func (s *BaseStorageSuite) TestCheckAndSetReferenceError(c *C) {
318+
err := s.Storer.SetReference(
319+
plumbing.NewReferenceFromStrings("foo", "c3f4688a08fd86f1bf8e055724c84b7a40a09733"),
320+
)
321+
c.Assert(err, IsNil)
322+
323+
err = s.Storer.CheckAndSetReference(
324+
plumbing.NewReferenceFromStrings("foo", "bc9968d75e48de59f0870ffb71f5e160bbbdcf52"),
325+
plumbing.NewReferenceFromStrings("foo", "482e0eada5de4039e6f216b45b3c9b683b83bfa"),
326+
)
327+
c.Assert(err, Equals, storage.ErrReferenceHasChanged)
328+
329+
e, err := s.Storer.Reference(plumbing.ReferenceName("foo"))
330+
c.Assert(err, IsNil)
331+
c.Assert(e.Hash().String(), Equals, "c3f4688a08fd86f1bf8e055724c84b7a40a09733")
332+
}
333+
283334
func (s *BaseStorageSuite) TestRemoveReference(c *C) {
284335
err := s.Storer.SetReference(
285336
plumbing.NewReferenceFromStrings("foo", "bc9968d75e48de59f0870ffb71f5e160bbbdcf52"),

0 commit comments

Comments
 (0)