mirror of https://github.com/go-gitea/gitea.git
48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
|
// +build norwfs
|
||
|
|
||
|
package dotgit
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
"gopkg.in/src-d/go-git.v4/plumbing"
|
||
|
)
|
||
|
|
||
|
// There are some filesystems that don't support opening files in RDWD mode.
|
||
|
// In these filesystems the standard SetRef function can not be used as i
|
||
|
// reads the reference file to check that it's not modified before updating it.
|
||
|
//
|
||
|
// This version of the function writes the reference without extra checks
|
||
|
// making it compatible with these simple filesystems. This is usually not
|
||
|
// a problem as they should be accessed by only one process at a time.
|
||
|
func (d *DotGit) setRef(fileName, content string, old *plumbing.Reference) error {
|
||
|
_, err := d.fs.Stat(fileName)
|
||
|
if err == nil && old != nil {
|
||
|
fRead, err := d.fs.Open(fileName)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
ref, err := d.readReferenceFrom(fRead, old.Name().String())
|
||
|
fRead.Close()
|
||
|
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if ref.Hash() != old.Hash() {
|
||
|
return fmt.Errorf("reference has changed concurrently")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
f, err := d.fs.Create(fileName)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
defer f.Close()
|
||
|
|
||
|
_, err = f.Write([]byte(content))
|
||
|
return err
|
||
|
}
|