Use mutex for file operations
parent
9027f6734b
commit
cfc8911b77
|
@ -6,6 +6,7 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -152,6 +153,7 @@ func initConfig() (err error) {
|
||||||
password: cfg.Git.Password,
|
password: cfg.Git.Password,
|
||||||
name: cfg.Git.AuthorName,
|
name: cfg.Git.AuthorName,
|
||||||
email: cfg.Git.AuthorEmail,
|
email: cfg.Git.AuthorEmail,
|
||||||
|
lock: &sync.Mutex{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
3
go.mod
3
go.mod
|
@ -10,8 +10,9 @@ require (
|
||||||
github.com/google/go-cmp v0.4.0 // indirect
|
github.com/google/go-cmp v0.4.0 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/stretchr/testify v1.5.1 // indirect
|
github.com/stretchr/testify v1.5.1 // indirect
|
||||||
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 // indirect
|
golang.org/x/crypto v0.0.0-20200420104511-884d27f42877 // indirect
|
||||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect
|
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect
|
||||||
|
golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f // indirect
|
||||||
gopkg.in/yaml.v2 v2.2.8
|
gopkg.in/yaml.v2 v2.2.8
|
||||||
willnorris.com/go/webmention v0.0.0-20200126231626-5a55fff6bf71
|
willnorris.com/go/webmention v0.0.0-20200126231626-5a55fff6bf71
|
||||||
)
|
)
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -70,6 +70,8 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 h1:xMPOj6Pz6UipU1wXLkrtqp
|
||||||
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM=
|
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM=
|
||||||
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20200420104511-884d27f42877 h1:IhZPbxNd1UjBCaD5AfpSSbJTRlp+ZSuyuH5uoksNS04=
|
||||||
|
golang.org/x/crypto v0.0.0-20200420104511-884d27f42877/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
@ -84,6 +86,8 @@ golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0
|
||||||
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f h1:gWF768j/LaZugp8dyS4UwsslYCYz9XgFxvlgsn0n9H8=
|
||||||
|
golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
|
26
storage.go
26
storage.go
|
@ -8,6 +8,7 @@ import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -24,9 +25,10 @@ type Git struct {
|
||||||
password string
|
password string
|
||||||
name string
|
name string
|
||||||
email string
|
email string
|
||||||
|
lock *sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g Git) init() (r *git.Repository, w *git.Worktree, err error) {
|
func (g *Git) init() (r *git.Repository, w *git.Worktree, err error) {
|
||||||
// Open repo
|
// Open repo
|
||||||
r, err = git.PlainOpen(g.filepath)
|
r, err = git.PlainOpen(g.filepath)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
@ -72,11 +74,11 @@ func (g Git) init() (r *git.Repository, w *git.Worktree, err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g Git) destroyRepo() {
|
func (g *Git) destroyRepo() {
|
||||||
_ = os.RemoveAll(g.filepath)
|
_ = os.RemoveAll(g.filepath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g Git) push(repository *git.Repository) error {
|
func (g *Git) push(repository *git.Repository) error {
|
||||||
err := repository.Push(&git.PushOptions{
|
err := repository.Push(&git.PushOptions{
|
||||||
Auth: &gitHttp.BasicAuth{
|
Auth: &gitHttp.BasicAuth{
|
||||||
Username: g.username,
|
Username: g.username,
|
||||||
|
@ -92,7 +94,9 @@ func (g Git) push(repository *git.Repository) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g Git) CreateFile(filepath string, file string, message string) (err error) {
|
func (g *Git) CreateFile(filepath string, file string, message string) (err error) {
|
||||||
|
g.lock.Lock()
|
||||||
|
defer g.lock.Unlock()
|
||||||
_, _, err = g.init()
|
_, _, err = g.init()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = errors.New("failed to initialize repo")
|
err = errors.New("failed to initialize repo")
|
||||||
|
@ -102,11 +106,17 @@ func (g Git) CreateFile(filepath string, file string, message string) (err error
|
||||||
if _, e := os.Stat(joinedPath); e == nil {
|
if _, e := os.Stat(joinedPath); e == nil {
|
||||||
return errors.New("file already exists")
|
return errors.New("file already exists")
|
||||||
} else {
|
} else {
|
||||||
return g.UpdateFile(filepath, file, message)
|
return g.unsafeUpdateFile(filepath, file, message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g Git) UpdateFile(filepath string, file string, message string) error {
|
func (g *Git) UpdateFile(filepath string, file string, message string) error {
|
||||||
|
g.lock.Lock()
|
||||||
|
defer g.lock.Unlock()
|
||||||
|
return g.unsafeUpdateFile(filepath, file, message)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Git) unsafeUpdateFile(filepath string, file string, message string) error {
|
||||||
repo, w, err := g.init()
|
repo, w, err := g.init()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New("failed to initialize repo")
|
return errors.New("failed to initialize repo")
|
||||||
|
@ -137,7 +147,9 @@ func (g Git) UpdateFile(filepath string, file string, message string) error {
|
||||||
return g.push(repo)
|
return g.push(repo)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g Git) DeleteFile(filepath string, message string) (err error) {
|
func (g *Git) DeleteFile(filepath string, message string) (err error) {
|
||||||
|
g.lock.Lock()
|
||||||
|
defer g.lock.Unlock()
|
||||||
repo, w, err := g.init()
|
repo, w, err := g.init()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New("failed to initialize repo")
|
return errors.New("failed to initialize repo")
|
||||||
|
|
Loading…
Reference in New Issue