diff options
author | Paulo Gomes <pjbgf@linux.com> | 2023-05-04 22:38:41 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-04 22:38:41 +0100 |
commit | 2f3db9de0c31de26303eb389b3f3133f7aa67a04 (patch) | |
tree | a3886211d04192124377ae2b03760d02acb3202e /storage/filesystem/object.go | |
parent | 191f4ba946c768221dd914fcf0675572fc36c55d (diff) | |
parent | 7d183c99d041ecf5f98d6b4c7eb25449e21a5153 (diff) | |
download | go-git-2f3db9de0c31de26303eb389b3f3133f7aa67a04.tar.gz |
Merge pull request #722 from AriehSchneier/populate-index
storage: filesystem, Populate index before use. Fixes #148
Diffstat (limited to 'storage/filesystem/object.go')
-rw-r--r-- | storage/filesystem/object.go | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/storage/filesystem/object.go b/storage/filesystem/object.go index 21667fa..846a7b8 100644 --- a/storage/filesystem/object.go +++ b/storage/filesystem/object.go @@ -537,14 +537,21 @@ func (s *ObjectStorage) findObjectInPackfile(h plumbing.Hash) (plumbing.Hash, pl return plumbing.ZeroHash, plumbing.ZeroHash, -1 } +// HashesWithPrefix returns all objects with a hash that starts with a prefix by searching for +// them in the packfile and the git object directories. func (s *ObjectStorage) HashesWithPrefix(prefix []byte) ([]plumbing.Hash, error) { hashes, err := s.dir.ObjectsWithPrefix(prefix) if err != nil { return nil, err } + seen := hashListAsMap(hashes) + // TODO: This could be faster with some idxfile changes, // or diving into the packfile. + if err := s.requireIndex(); err != nil { + return nil, err + } for _, index := range s.index { ei, err := index.Entries() if err != nil { @@ -558,6 +565,9 @@ func (s *ObjectStorage) HashesWithPrefix(prefix []byte) ([]plumbing.Hash, error) return nil, err } if bytes.HasPrefix(e.Hash[:], prefix) { + if _, ok := seen[e.Hash]; ok { + continue + } hashes = append(hashes, e.Hash) } } |