cabal-bounds 0.2 → 0.2.1
raw patch · 4 files changed
+90/−67 lines, 4 filesdep +unordered-containers
Dependencies added: unordered-containers
Files
- cabal-bounds.cabal +17/−13
- src/CabalBounds/Drop.hs +1/−4
- src/CabalBounds/Lenses.hs +5/−0
- src/CabalBounds/Update.hs +67/−50
cabal-bounds.cabal view
@@ -1,5 +1,5 @@ name: cabal-bounds-version: 0.2+version: 0.2.1 cabal-version: >=1.9.2 build-type: Simple license: BSD3@@ -26,20 +26,20 @@ . > # update the version infos of all libraries > $> cabal update- > + > > # drops the upper bound of all dependencies in 'myproject.cabal', > # most likely you want to ignore 'base' > $> cabal-bounds drop --upper --ignore=base myproject.cabal- > + > > # create a cabal sandbox for building of 'myproject' > $> cabal sandbox init- > + > > # build 'myproject' > $> cabal install- > + > > # update the upper bound of all dependencies in 'myproject.cabal' > # by the cabal build information- > $> cabal-bounds update --upper --ignore=base myproject.cabal dist/dist-sandbox-*/setup-config + > $> cabal-bounds update --upper --ignore=base myproject.cabal dist/dist-sandbox-*/setup-config . . .@@ -51,7 +51,7 @@ . > $> cabal-bounds drop ... > lens >=4.0.1 && <4.1 => lens- > + > > $> cabal-bounds drop --upper ... > lens >=4.0.1 && <4.1 => lens >=4.0.1 .@@ -100,8 +100,8 @@ . > $> cabal --version > cabal-install version 1.18.0.2- > using version 1.18.1 of the Cabal library - > + > using version 1.18.1 of the Cabal library+ > > $> cabal install --constraint="Cabal == 1.18.1" cabal-bounds . If you update the 'cabal' binary and the used 'Cabal' library changes, then you have to rebuild 'cabal-bounds'.@@ -164,8 +164,10 @@ library build-depends: base >=3 && <5, cmdargs >=0.10.5 && <0.11,- lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4, Cabal >=1.18.0 && <1.19- exposed-modules: CabalBounds.Args CabalBounds.Main CabalBounds.VersionComp+ lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4,+ unordered-containers >=0.2.3.3 && <0.3, Cabal >=1.18.0 && <1.19+ exposed-modules: CabalBounds.Args CabalBounds.Main+ CabalBounds.VersionComp exposed: True buildable: True cpp-options: -DCABAL@@ -177,7 +179,8 @@ executable cabal-bounds build-depends: base >=3 && <5, cmdargs >=0.10.5 && <0.11,- lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4, Cabal >=1.18.0 && <1.19+ lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4,+ unordered-containers >=0.2.3.3 && <0.3, Cabal >=1.18.0 && <1.19 main-is: Main.hs buildable: True cpp-options: -DCABAL@@ -190,7 +193,8 @@ test-suite cabal-bounds-tests build-depends: base >=3 && <5, cmdargs >=0.10.5 && <0.11,- lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4, Cabal >=1.18.0 && <1.19,+ lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4,+ unordered-containers >=0.2.3.3 && <0.3, Cabal >=1.18.0 && <1.19, tasty ==0.7.*, tasty-golden >=2.2.0.2 && <2.3, filepath >=1.3.0.1 && <1.4, cabal-bounds -any type: exitcode-stdio-1.0
src/CabalBounds/Drop.hs view
@@ -18,10 +18,7 @@ drop :: DropBound -> Targets -> Dependencies -> GenericPackageDescription -> GenericPackageDescription drop bound AllTargets deps pkgDescrp =- pkgDescrp & L.dependenciesOfLib . filterDeps %~ dropFromDep- & L.dependenciesOfAllExes . filterDeps %~ dropFromDep- & L.dependenciesOfAllTests . filterDeps %~ dropFromDep- & L.dependenciesOfAllBenchms . filterDeps %~ dropFromDep+ pkgDescrp & L.allDependencies . filterDeps %~ dropFromDep where filterDeps = filterDependencies deps dropFromDep = dropFromDependency bound
src/CabalBounds/Lenses.hs view
@@ -3,6 +3,7 @@ module CabalBounds.Lenses ( vbranch , vtags+ , allDependencies , dependenciesOfLib , dependenciesOfAllExes , dependenciesOfExe@@ -27,6 +28,10 @@ makeLensesFor [ ("versionBranch", "vbranch") , ("versionTags" , "vtags") ] ''Version+++allDependencies :: Traversal' GenericPackageDescription [Dependency]+allDependencies = biplate dependenciesOfLib :: Traversal' GenericPackageDescription [Dependency] dependenciesOfLib = condLibraryL . _Just . biplate
src/CabalBounds/Update.hs view
@@ -7,30 +7,31 @@ import qualified Distribution.PackageDescription as D import qualified Distribution.Package as P import qualified Distribution.Version as V-import qualified Distribution.Simple.LocalBuildInfo as L+import qualified Distribution.Simple.LocalBuildInfo as BI import qualified Distribution.Simple.PackageIndex as PX import qualified Distribution.InstalledPackageInfo as PI import Control.Lens+import Control.Applicative ((<$>)) import CabalBounds.Bound (UpdateBound(..)) import CabalBounds.Targets (Targets(..), dependenciesOf) import CabalBounds.Dependencies (Dependencies, filterDependencies) import CabalBounds.VersionComp (VersionComp(..), defaultLowerComp)-import CabalBounds.Lenses-import Data.List (sort, foldl', find)+import qualified CabalBounds.Lenses as L+import Data.List (sort, foldl')+import qualified Data.HashMap.Strict as HM+import Data.Maybe (fromMaybe, listToMaybe) -type InstalledPackages = [(P.PackageName, V.Version)]+type PkgName = String+type InstalledPackages = HM.HashMap PkgName V.Version -update :: UpdateBound -> Targets -> Dependencies -> D.GenericPackageDescription -> L.LocalBuildInfo -> D.GenericPackageDescription++update :: UpdateBound -> Targets -> Dependencies -> D.GenericPackageDescription -> BI.LocalBuildInfo -> D.GenericPackageDescription update bound AllTargets deps pkgDescrp buildInfo =- pkgDescrp & dependenciesOfLib . filterDeps %~ updateDep- & dependenciesOfAllExes . filterDeps %~ updateDep- & dependenciesOfAllTests . filterDeps %~ updateDep- & dependenciesOfAllBenchms . filterDeps %~ updateDep+ pkgDescrp & L.allDependencies . filterDeps %~ updateDep where filterDeps = filterDependencies deps updateDep = updateDependency bound (installedPackages buildInfo) - update bound (Targets targets) deps pkgDescrp buildInfo = foldl' updateTarget pkgDescrp targets where@@ -42,65 +43,81 @@ updateDependency :: UpdateBound -> InstalledPackages -> P.Dependency -> P.Dependency-updateDependency (UpdateLower comp) instPkgs dep@(P.Dependency pkgName _)- | Just (_, version) <- find ((== pkgName) . fst) instPkgs- , Just intervals <- versionIntervals (versionComp comp version) Nothing- = P.Dependency pkgName (V.fromVersionIntervals intervals)-- | otherwise- = dep--updateDependency (UpdateUpper comp) instPkgs dep@(P.Dependency pkgName versionRange)- | not . V.isAnyVersion $ versionRange- , Just (_, upperVersion) <- find ((== pkgName) . fst) instPkgs- , (V.LowerBound lowerVersion _, _):_ <- V.asVersionIntervals versionRange- , Just intervals <- versionIntervals lowerVersion (Just $ nextVersion $ versionComp comp upperVersion)- = P.Dependency pkgName (V.fromVersionIntervals intervals)+updateDependency (UpdateLower comp) instPkgs dep =+ fromMaybe dep $ do+ let pkgName_ = pkgName dep+ version <- HM.lookup pkgName_ instPkgs+ vrange <- mkVersionRange (comp `compOf` version) Nothing+ return $ mkDependency pkgName_ vrange - | otherwise+updateDependency (UpdateUpper comp) instPkgs dep+ | V.isAnyVersion versionRange_ = updateDependency (UpdateBoth defaultLowerComp comp) instPkgs dep -updateDependency (UpdateBoth lowerComp upperComp) instPkgs dep@(P.Dependency pkgName _)- | Just (_, version) <- find ((== pkgName) . fst) instPkgs- , Just intervals <- versionIntervals (versionComp lowerComp version) (Just $ nextVersion $ versionComp upperComp version)- = P.Dependency pkgName (V.fromVersionIntervals intervals)- | otherwise- = dep+ = fromMaybe dep $ do+ upperVersion <- HM.lookup pkgName_ instPkgs+ V.LowerBound lowerVersion _ <- fst <$> (listToMaybe $ V.asVersionIntervals versionRange_)+ vrange <- mkVersionRange lowerVersion (Just $ nextVersion $ comp `compOf` upperVersion)+ return $ mkDependency pkgName_ vrange+ where+ versionRange_ = versionRange dep+ pkgName_ = pkgName dep +updateDependency (UpdateBoth lowerComp upperComp) instPkgs dep =+ fromMaybe dep $ do+ let pkgName_ = pkgName dep+ version <- HM.lookup pkgName_ instPkgs+ vrange <- mkVersionRange (lowerComp `compOf` version) (Just $ nextVersion $ upperComp `compOf` version)+ return $ mkDependency pkgName_ vrange -versionIntervals :: V.Version -> Maybe V.Version -> Maybe V.VersionIntervals-versionIntervals lowerVersion Nothing =- V.mkVersionIntervals [(V.LowerBound lowerVersion V.InclusiveBound, V.NoUpperBound)] -versionIntervals lowerVersion (Just upperVersion) =- V.mkVersionIntervals [(V.LowerBound lowerVersion V.InclusiveBound, V.UpperBound upperVersion V.ExclusiveBound)]+mkVersionRange :: V.Version -> Maybe V.Version -> Maybe V.VersionRange+mkVersionRange lowerVersion Nothing =+ V.fromVersionIntervals <$> V.mkVersionIntervals [(V.LowerBound lowerVersion V.InclusiveBound, V.NoUpperBound)] +mkVersionRange lowerVersion (Just upperVersion) =+ V.fromVersionIntervals <$> V.mkVersionIntervals [(V.LowerBound lowerVersion V.InclusiveBound,+ V.UpperBound upperVersion V.ExclusiveBound)] -versionComp :: VersionComp -> V.Version -> V.Version-versionComp Major1 version =- version & vbranch %~ take 1- & vtags .~ [] -versionComp Major2 version =- version & vbranch %~ take 2- & vtags .~ []+compOf :: VersionComp -> V.Version -> V.Version+Major1 `compOf` version =+ version & L.vbranch %~ take 1+ & L.vtags .~ [] -versionComp Minor version =- version & vtags .~ []+Major2 `compOf` version =+ version & L.vbranch %~ take 2+ & L.vtags .~ [] +Minor `compOf` version =+ version & L.vtags .~ [] + nextVersion :: V.Version -> V.Version nextVersion version =- version & vbranch %~ increaseLast+ version & L.vbranch %~ increaseLastComp where- increaseLast = reverse . (& ix 0 %~ (+ 1)) . reverse+ increaseLastComp = reverse . (& ix 0 %~ (+ 1)) . reverse -installedPackages :: L.LocalBuildInfo -> InstalledPackages-installedPackages = map (& _2 %~ newestVersion)+installedPackages :: BI.LocalBuildInfo -> InstalledPackages+installedPackages = HM.fromList+ . map (\(P.PackageName n, v) -> (n, newestVersion v)) . filter ((not . null) . snd)- . PX.allPackagesByName . L.installedPkgs+ . PX.allPackagesByName . BI.installedPkgs where newestVersion :: [PI.InstalledPackageInfo] -> V.Version newestVersion = last . sort . map (P.pkgVersion . PI.sourcePackageId)+++pkgName :: P.Dependency -> PkgName+pkgName (P.Dependency (P.PackageName name) _) = name+++versionRange :: P.Dependency -> V.VersionRange+versionRange (P.Dependency _ vrange) = vrange+++mkDependency :: PkgName -> V.VersionRange -> P.Dependency+mkDependency name vrange = P.Dependency (P.PackageName name) vrange