@@ -428,7 +428,10 @@ func bucketRefPrefix(ref []byte) []byte {
428428 ref = ref [len (libPrefix ):]
429429 }
430430
431- prefixLen := min (maxPrefixLen , len (ref ))
431+ prefixLen := len (ref )
432+ if maxPrefixLen < prefixLen {
433+ prefixLen = maxPrefixLen
434+ }
432435 prefix , _ , _ := bytes .Cut (ref [:prefixLen ], []byte {' ' })
433436 return prefix
434437}
@@ -715,9 +718,16 @@ func (set *RefListDigestSet) ForEach(handler func(digest []byte) error) error {
715718 return nil
716719}
717720
721+ // workaround for: conversion of slices to arrays requires go1.20 or later
722+ func newRefListArray (digest []byte ) reflistDigestArray {
723+ var array reflistDigestArray
724+ copy (array [:], digest )
725+ return array
726+ }
727+
718728// Add adds digest to set, doing nothing if the digest was already present
719729func (set * RefListDigestSet ) Add (digest []byte ) {
720- set .items [reflistDigestArray (digest )] = struct {}{}
730+ set .items [newRefListArray (digest )] = struct {}{}
721731}
722732
723733// AddAllInRefList adds all the bucket digests in a SplitRefList to the set
@@ -731,13 +741,13 @@ func (set *RefListDigestSet) AddAllInRefList(sl *SplitRefList) {
731741
732742// Has checks whether a digest is part of set
733743func (set * RefListDigestSet ) Has (digest []byte ) bool {
734- _ , ok := set .items [reflistDigestArray (digest )]
744+ _ , ok := set .items [newRefListArray (digest )]
735745 return ok
736746}
737747
738748// Remove removes a digest from set
739749func (set * RefListDigestSet ) Remove (digest []byte ) {
740- delete (set .items , reflistDigestArray (digest ))
750+ delete (set .items , newRefListArray (digest ))
741751}
742752
743753// RemoveAll removes all the digests in other from the current set
@@ -776,10 +786,20 @@ func segmentPrefix(encodedDigest string) []byte {
776786 return []byte (fmt .Sprintf ("F%s-" , encodedDigest ))
777787}
778788
789+ // workaround for go 1.19 instead of bytes.Clone
790+ func cloneBytes (b []byte ) []byte {
791+ if b == nil {
792+ return nil
793+ }
794+ cloned := make ([]byte , len (b ))
795+ copy (cloned , b )
796+ return cloned
797+ }
798+
779799func segmentIndexKey (prefix []byte , idx int ) []byte {
780800 // Assume most buckets won't have more than 0xFFFF = ~65k segments (which
781801 // would be an extremely large bucket!).
782- return append (bytes . Clone (prefix ), []byte (fmt .Sprintf ("%04x" , idx ))... )
802+ return append (cloneBytes (prefix ), []byte (fmt .Sprintf ("%04x" , idx ))... )
783803}
784804
785805// AllBucketDigests returns a set of all the bucket digests in the database
@@ -861,7 +881,7 @@ func (collection *RefListCollection) loadBuckets(sl *SplitRefList) error {
861881 var bucket * PackageRefList
862882
863883 if digest := sl .Buckets [idx ]; len (digest ) > 0 {
864- cacheKey := reflistDigestArray (digest )
884+ cacheKey := newRefListArray (digest )
865885 bucket = collection .cache [cacheKey ]
866886 if bucket == nil {
867887 bucket = NewPackageRefList ()
0 commit comments