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));
        }