public IEnumerable <PackageIdentity> GetPackagesToRemove(IEnumerable <JournalEntry> journalEntries) { if (!fileSystem.GetDiskFreeSpace(packageUtils.RootDirectory, out var totalNumberOfFreeBytes) || !fileSystem.GetDiskTotalSpace(packageUtils.RootDirectory, out var totalNumberOfBytes)) { log.Info("Unable to determine disk space. Skipping free space package retention."); return(new PackageIdentity[0]); } var percentFreeDiskSpaceDesired = variables.GetInt32(PackageRetentionPercentFreeDiskSpace) ?? DefaultPercentFreeDiskSpace; var desiredSpaceInBytes = totalNumberOfBytes * (ulong)percentFreeDiskSpaceDesired / 100; if (totalNumberOfFreeBytes > desiredSpaceInBytes) { log.VerboseFormat("Detected enough space for new packages. ({0}/{1})", totalNumberOfFreeBytes.ToFileSizeString(), totalNumberOfBytes.ToFileSizeString()); return(new PackageIdentity[0]); } var spaceToFree = (desiredSpaceInBytes - totalNumberOfFreeBytes) * (100 + FreeSpacePercentBuffer) / 100; log.VerboseFormat("Cleaning {0} space from the package cache.", spaceToFree.ToFileSizeString()); ulong spaceFreed = 0L; var orderedJournalEntries = sortJournalEntries.Sort(journalEntries); return(orderedJournalEntries.TakeWhile(entry => { var moreToClean = spaceFreed < spaceToFree; spaceFreed += entry.FileSizeBytes; return moreToClean; }) .Select(entry => entry.Package)); }