aboutsummaryrefslogtreecommitdiffstats
path: root/storage/filesystem/internal/dotgit/dotgit.go
diff options
context:
space:
mode:
authorJavi Fontan <jfontan@gmail.com>2017-12-21 12:30:13 +0100
committerJavi Fontan <jfontan@gmail.com>2017-12-21 12:30:13 +0100
commit8d288404016a90c9b17dd8230db2c5da1a1ccfe5 (patch)
tree6e7af1cb9e0673371b525d6253f62173468d7e06 /storage/filesystem/internal/dotgit/dotgit.go
parent55b5d736682bf0e251c5bf83d1cf25c298d3ea0c (diff)
downloadgo-git-8d288404016a90c9b17dd8230db2c5da1a1ccfe5.tar.gz
Add a setRef version that supports non rw fs
There are some filesystems that do not support opening the files in read and write modes at the same time. The method SetRef is split in files with an extra version that only writes the reference. It can be activated with -tags norwfs on building. Signed-off-by: Javi Fontan <jfontan@gmail.com>
Diffstat (limited to 'storage/filesystem/internal/dotgit/dotgit.go')
-rw-r--r--storage/filesystem/internal/dotgit/dotgit.go31
1 files changed, 2 insertions, 29 deletions
diff --git a/storage/filesystem/internal/dotgit/dotgit.go b/storage/filesystem/internal/dotgit/dotgit.go
index d644810..643a5d6 100644
--- a/storage/filesystem/internal/dotgit/dotgit.go
+++ b/storage/filesystem/internal/dotgit/dotgit.go
@@ -323,36 +323,9 @@ func (d *DotGit) SetRef(r, old *plumbing.Reference) error {
content = fmt.Sprintln(r.Hash().String())
}
- // If we are not checking an old ref, just truncate the file.
- mode := os.O_RDWR | os.O_CREATE
- if old == nil {
- mode |= os.O_TRUNC
- }
-
- f, err := d.fs.OpenFile(r.Name().String(), mode, 0666)
- if err != nil {
- return err
- }
-
- defer ioutil.CheckClose(f, &err)
-
- // Lock is unlocked by the deferred Close above. This is because Unlock
- // does not imply a fsync and thus there would be a race between
- // Unlock+Close and other concurrent writers. Adding Sync to go-billy
- // could work, but this is better (and avoids superfluous syncs).
- err = f.Lock()
- if err != nil {
- return err
- }
-
- // this is a no-op to call even when old is nil.
- err = d.checkReferenceAndTruncate(f, old)
- if err != nil {
- return err
- }
+ fileName := r.Name().String()
- _, err = f.Write([]byte(content))
- return err
+ return d.setRef(fileName, content, old)
}
// Refs scans the git directory collecting references, which it returns.