diff options
author | Patrick Steinhardt <psteinhardt@gitlab.com> | 2021-09-23 13:28:17 +0300 |
---|---|---|
committer | Patrick Steinhardt <psteinhardt@gitlab.com> | 2021-11-23 16:11:00 +0300 |
commit | c91fe35c0dc2d296f70ba735cf8be992ba532fbc (patch) | |
tree | 0d0bd914d18a41a965de23a083e25d55b5212dcd | |
parent | 5eb94b765d5a3f4a98697929de2efc551c1a4f26 (diff) |
safe: Introduce `ErrFileAlreadyLocked` error
We've started to check for locking failures in multiple packages' tests
by doing a string comparison. Introduce a new `ErrFileAlreadyLocked`
error which we can return and test for instead.
-rw-r--r-- | internal/git/localrepo/config_test.go | 5 | ||||
-rw-r--r-- | internal/safe/locking_file_writer.go | 7 | ||||
-rw-r--r-- | internal/safe/locking_file_writer_test.go | 4 |
3 files changed, 10 insertions, 6 deletions
diff --git a/internal/git/localrepo/config_test.go b/internal/git/localrepo/config_test.go index a4b5ce26a..e0d188cf4 100644 --- a/internal/git/localrepo/config_test.go +++ b/internal/git/localrepo/config_test.go @@ -2,7 +2,6 @@ package localrepo import ( "context" - "errors" "fmt" "path/filepath" "runtime" @@ -86,7 +85,7 @@ func TestRepo_SetConfig(t *testing.T) { value: "value", locked: true, expectedEntries: standardEntries, - expectedErr: fmt.Errorf("committing config: %w", fmt.Errorf("locking file: %w", errors.New("file already locked"))), + expectedErr: fmt.Errorf("committing config: %w", fmt.Errorf("locking file: %w", safe.ErrFileAlreadyLocked)), }, } { t.Run(tc.desc, func(t *testing.T) { @@ -224,7 +223,7 @@ func TestRepo_UnsetMatchingConfig(t *testing.T) { desc: "locked", regex: ".*", locked: true, - expectedErr: fmt.Errorf("committing config: %w", fmt.Errorf("locking file: %w", errors.New("file already locked"))), + expectedErr: fmt.Errorf("committing config: %w", fmt.Errorf("locking file: %w", safe.ErrFileAlreadyLocked)), expectedKeys: standardKeys, }, } { diff --git a/internal/safe/locking_file_writer.go b/internal/safe/locking_file_writer.go index b7e8405c2..c43720cbe 100644 --- a/internal/safe/locking_file_writer.go +++ b/internal/safe/locking_file_writer.go @@ -1,6 +1,7 @@ package safe import ( + "errors" "fmt" "io" "os" @@ -14,6 +15,10 @@ const ( lockingFileWriterStateClosed ) +// ErrFileAlreadyLocked is returned when trying to lock a file which has already been locked by +// another concurrent process. +var ErrFileAlreadyLocked = errors.New("file already locked") + // LockingFileWriter is a FileWriter which locks the target file on commit and checks whether it // has been modified since the LockingFileWriter has been created. The user must first create a new // LockingFileWriter via `NewLockingFileWriter()`, at which point it is open for writes. The writer @@ -134,7 +139,7 @@ func (fw *LockingFileWriter) Lock() error { lock, err := os.OpenFile(fw.lockPath(), os.O_CREATE|os.O_EXCL|os.O_RDONLY, 0o400) if err != nil { if os.IsExist(err) { - return fmt.Errorf("file already locked") + return ErrFileAlreadyLocked } return fmt.Errorf("creating lock file: %w", err) diff --git a/internal/safe/locking_file_writer_test.go b/internal/safe/locking_file_writer_test.go index 152c63d94..7632a9d69 100644 --- a/internal/safe/locking_file_writer_test.go +++ b/internal/safe/locking_file_writer_test.go @@ -261,7 +261,7 @@ func TestLockingFileWriter_concurrentLocking(t *testing.T) { require.NoError(t, err) require.NoError(t, first.Lock()) - require.Equal(t, fmt.Errorf("file already locked"), second.Lock()) + require.Equal(t, safe.ErrFileAlreadyLocked, second.Lock()) require.NoError(t, first.Commit()) require.Equal(t, []byte("first"), testhelper.MustReadFile(t, file)) @@ -279,7 +279,7 @@ func TestLockingFileWriter_locked(t *testing.T) { // Concurrently lock the file. require.NoError(t, os.WriteFile(target+".lock", nil, 0o644)) - require.Equal(t, fmt.Errorf("file already locked"), writer.Lock()) + require.Equal(t, safe.ErrFileAlreadyLocked, writer.Lock()) require.Equal(t, []byte("base"), testhelper.MustReadFile(t, target)) } |