def _computeincrementalpack(files, opts): """Given a set of pack files along with the configuration options, this function computes the list of files that should be packed as part of an incremental repack. It tries to strike a balance between keeping incremental repacks cheap (i.e. packing small things when possible, and rolling the packs up to the big ones over time). """ limits = list( sorted((util.sizetoint(s) for s in opts[b'generations']), reverse=True) ) limits.append(0) # Group the packs by generation (i.e. by size) generations = [] for i in pycompat.xrange(len(limits)): generations.append([]) sizes = {} for prefix, mode, stat in files: size = stat.st_size if size > opts[b'repackmaxpacksize']: continue sizes[prefix] = size for i, limit in enumerate(limits): if size > limit: generations[i].append(prefix) break # Steps for picking what packs to repack: # 1. Pick the largest generation with > gencountlimit pack files. # 2. Take the smallest three packs. # 3. While total-size-of-packs < repacksizelimit: add another pack # Find the largest generation with more than gencountlimit packs genpacks = [] for i, limit in enumerate(limits): if len(generations[i]) > opts[b'gencountlimit']: # Sort to be smallest last, for easy popping later genpacks.extend( sorted(generations[i], reverse=True, key=lambda x: sizes[x]) ) break # Take as many packs from the generation as we can chosenpacks = genpacks[-3:] genpacks = genpacks[:-3] repacksize = sum(sizes[n] for n in chosenpacks) while ( repacksize < opts[b'repacksizelimit'] and genpacks and len(chosenpacks) < opts[b'maxrepackpacks'] ): chosenpacks.append(genpacks.pop()) repacksize += sizes[chosenpacks[-1]] return chosenpacks
def _computeincrementalpack(files, opts): """Given a set of pack files along with the configuration options, this function computes the list of files that should be packed as part of an incremental repack. It tries to strike a balance between keeping incremental repacks cheap (i.e. packing small things when possible, and rolling the packs up to the big ones over time). """ limits = list(sorted((util.sizetoint(s) for s in opts['generations']), reverse=True)) limits.append(0) # Group the packs by generation (i.e. by size) generations = [] for i in xrange(len(limits)): generations.append([]) sizes = {} for prefix, mode, stat in files: size = stat.st_size if size > opts['repackmaxpacksize']: continue sizes[prefix] = size for i, limit in enumerate(limits): if size > limit: generations[i].append(prefix) break # Steps for picking what packs to repack: # 1. Pick the largest generation with > gencountlimit pack files. # 2. Take the smallest three packs. # 3. While total-size-of-packs < repacksizelimit: add another pack # Find the largest generation with more than gencountlimit packs genpacks = [] for i, limit in enumerate(limits): if len(generations[i]) > opts['gencountlimit']: # Sort to be smallest last, for easy popping later genpacks.extend(sorted(generations[i], reverse=True, key=lambda x: sizes[x])) break # Take as many packs from the generation as we can chosenpacks = genpacks[-3:] genpacks = genpacks[:-3] repacksize = sum(sizes[n] for n in chosenpacks) while (repacksize < opts['repacksizelimit'] and genpacks and len(chosenpacks) < opts['maxrepackpacks']): chosenpacks.append(genpacks.pop()) repacksize += sizes[chosenpacks[-1]] return chosenpacks