Skip to content

Distinguish between deprecated and non-preferred versions in the package index #1345

Open
@grayjay

Description

@grayjay

Hackage shows deprecated and preferred versions on each package page, but it seems to combine the two types of version ranges in the package index. This means that cabal can't distinguish between versions that are deprecated and versions that are only non-preferred. It would be great to add more functionality to cabal related to identifying and avoiding deprecated versions. Here is an example of an issue that could be solved: haskell/cabal#10097

Adding preferred versions to the index:

updateIndexPackagePreferredVersions :: MonadIO m => PackageName -> PreferredInfo -> m ()
updateIndexPackagePreferredVersions pkgname prefinfo = do
now <- liftIO getCurrentTime
let prefEntryName = display pkgname </> "preferred-versions"
prefContent = fromMaybe "" $
formatSinglePreferredVersions pkgname prefinfo
updateArchiveIndexEntry prefEntryName (BS.pack prefContent) now

Formatting deprecated/preferred versions for one package:

formatSinglePreferredVersions :: PackageName -> PreferredInfo -> Maybe String
formatSinglePreferredVersions pkgname pref =
display . (\vr -> Dependency pkgname vr mainLibSet) <$> sumRange pref

PreferredInfo, with sumRange field for merged version ranges:

data PreferredInfo = PreferredInfo {
preferredRanges :: [VersionRange],
deprecatedVersions :: [Version],
sumRange :: Maybe VersionRange -- cached form of 'consolidateRanges' below
} deriving (Typeable, Show, Eq)

Merging version ranges:

consolidateRanges :: [VersionRange] -> [Version] -> Maybe VersionRange
consolidateRanges ranges depr =
let range = simplifyVersionRange $ foldr intersectVersionRanges anyVersion (map notThisVersion depr ++ ranges)
in if isAnyVersion range || isNoVersion range
then Nothing
else Just range

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions