git: synchronize update-index with a mutex (#4130)

if `pkglib.NewFromConfig` is used in parallel, it calls
```
git -C /some/directory update-index -q --refresh
```
in parallel.

But `git` does not like this and exits with 128.

This can be easily tried with:
```
git -C /some/dir update-index -q --refresh & \
git -C /some/dir update-index -q --refresh
```

Signed-off-by: Christoph Ostarek <christoph@zededa.com>
This commit is contained in:
christoph-zededa 2025-06-25 20:59:47 +02:00 committed by GitHub
parent d45d3e8c6e
commit 3f54a80824
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -12,6 +12,7 @@ import (
"path/filepath"
"regexp"
"strings"
"sync"
log "github.com/sirupsen/logrus"
)
@ -27,6 +28,8 @@ type git struct {
dir string
}
var gitMutex sync.Mutex
// Returns git==nil and no error if the path is not within a git repository
func newGit(dir string) (*git, error) {
g := &git{dir}
@ -190,9 +193,12 @@ func (g git) isDirty(pkg, commit string) (bool, error) {
// because `git diff-index` only uses the `lstat` result and
// not the actual file contents. Running `git update-index
// --refresh` updates the cache.
gitMutex.Lock()
if err := g.command("update-index", "-q", "--refresh"); err != nil {
gitMutex.Unlock()
return false, err
}
gitMutex.Unlock()
// diff-index works pretty well, except that
err := g.command("diff-index", "--quiet", commit, "--", pkg)