diff options
author | Bryan C. Mills <bcmills@google.com> | 2019-11-06 11:42:29 -0500 |
---|---|---|
committer | Bryan C. Mills <bcmills@google.com> | 2019-11-06 19:20:38 +0000 |
commit | db6b66edc87fcbb2cead03ed693ea8073536d622 (patch) | |
tree | ce6af2a55f3c63bdd1dce072eadce6dbb9b0054c /src/cmd/go/internal/modcmd/edit.go | |
parent | 3c2979682d0351fbce20ccf7636b86a629ca4bc9 (diff) | |
download | go-db6b66edc87fcbb2cead03ed693ea8073536d622.tar.gz go-db6b66edc87fcbb2cead03ed693ea8073536d622.zip |
cmd/go: use lockedfile instead of renameio for go.mod and go.sum files
This change is based on the previous discussion in CL 202442.
Fixes #34634
Change-Id: I1319aa26d5cfcd034bc576555787b3ca79968c38
Reviewed-on: https://go-review.googlesource.com/c/go/+/205637
Run-TryBot: Bryan C. Mills <bcmills@google.com>
Reviewed-by: Jay Conrod <jayconrod@google.com>
Diffstat (limited to 'src/cmd/go/internal/modcmd/edit.go')
-rw-r--r-- | src/cmd/go/internal/modcmd/edit.go | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/src/cmd/go/internal/modcmd/edit.go b/src/cmd/go/internal/modcmd/edit.go index 2a52f55404..ae8966bab1 100644 --- a/src/cmd/go/internal/modcmd/edit.go +++ b/src/cmd/go/internal/modcmd/edit.go @@ -9,12 +9,13 @@ package modcmd import ( "bytes" "encoding/json" + "errors" "fmt" - "io/ioutil" "os" "strings" "cmd/go/internal/base" + "cmd/go/internal/lockedfile" "cmd/go/internal/modfetch" "cmd/go/internal/modload" "cmd/go/internal/work" @@ -174,7 +175,7 @@ func runEdit(cmd *base.Command, args []string) { } } - data, err := ioutil.ReadFile(gomod) + data, err := lockedfile.Read(gomod) if err != nil { base.Fatalf("go: %v", err) } @@ -217,13 +218,19 @@ func runEdit(cmd *base.Command, args []string) { return } - unlock := modfetch.SideLock() - defer unlock() - lockedData, err := ioutil.ReadFile(gomod) - if err == nil && !bytes.Equal(lockedData, data) { - base.Fatalf("go: go.mod changed during editing; not overwriting") + // Make a best-effort attempt to acquire the side lock, only to exclude + // previous versions of the 'go' command from making simultaneous edits. + if unlock, err := modfetch.SideLock(); err == nil { + defer unlock() } - if err := ioutil.WriteFile(gomod, out, 0666); err != nil { + + err = lockedfile.Transform(gomod, func(lockedData []byte) ([]byte, error) { + if !bytes.Equal(lockedData, data) { + return nil, errors.New("go.mod changed during editing; not overwriting") + } + return out, nil + }) + if err != nil { base.Fatalf("go: %v", err) } } |